zoukankan      html  css  js  c++  java
  • Android 安卓人脸识别(百度人脸识别)快速集成采坑

    背景介绍

    你的项目跟人工智能无关?自己手写不可行?看完本文小白也能2小时让你的应用具备人脸识别活体检测等等功能啦!近两
    年炒的最火的就是人工智能了,但是到处都讲人工智能,区块链啥啥的,总感觉跟普通安卓应用开发没多大关系。
    最近有点闲得蛋疼啊,于是找了有关于指纹识别,人脸识别方面的技术博客,但是少之又少啊不能快速的集成到自己项目。基于本人对百度是比较偏爱的,于是乎看了下官网就直接上车了,大概一天下来就ok了。我是小白啊,这篇文章是基于小白的,如果你是技术大牛,可以忽略了。

    目前百度人脸识别调用完全免费的(号称宣布永久免费使用哦,算是业界良心了),企业认证后可以免费10QPS限制调用,所谓QPS限制也就是一秒钟10次内的调用,每秒10次调用可以满足一些小型企业了。免费和付费的唯一区别就是QPS限制调用量不同。再说了用户量多了,给点钱也是应该的吧,老板也不会在乎这点钱的吧(几百块一月不等)。

    集成百度sdk基本上可以直接copy示例demo直接在自己项目运行,顺利的话大概半天,跟着我的文章大概两小时足够!不过你开始得有百度AI开放平台账户及企业认证(工作日内认证大概4小时,最迟不会超过一天,周末都有人审核这点和给力了),集成过程中你看完整个文章,应该避免了一些问题,一天内应该可以让自己的项目跑起来。下面全部为快速集成 Android离线采集sdk 人脸登录示例过程(粗略大概3分钟可看完本文,文末有巨型福利)。

    进去百度AI开发者官网,人脸识别提供了几种解决方案,集成大多类似。因为我们的业务场景是需要用到人脸登录,人脸签到功能,所以我选择了 Android离线采集sdk。具体选择哪种根据自己的需求选择即可。

    目前市面上做人脸方面的公司非常多,列举几个:

    百度人脸识别 Face++ 商汤科技 腾讯 虹软

    当然还有一些其他的,目前比较出名的大概就这些,差别其实更多是在技术支持上(至少我是这么认为的)以及费用,据我

    了解:百度、Face++、虹软,大概对比下:

    百度人脸识

    优点:价格便宜,客服很友好

    缺点:待发掘

    Face++

    优点:技术更好,文档很清晰,因为没有接入暂且不知道技术支持怎么样不过应该不差

    缺点:有点小贵
    虹软

    优点:全套离线,后台前端都可以离线实现,文档也挺详细的

    缺点:看了下他们技术论坛,貌似问题也不少,而且回复也不是很及时的样子,最主要是需要自己搭建一套,他们的人脸对

    比居然也是放在本地APP数据库的(当然这不算是缺点了)

    说了这么多,想用啥自己选择就行,我们公司目前用的百度人脸识别,进入正题不多BB。

    一、注册百度开发者账号

    这个注册企业认证(工作日内认证大概4小时,最迟不会超过一天,周末都有人审核这点和给力了),而且需要公司的资质信息,我们当时已经有了所以我就直接拿来用。如果你卡在没有认证无法下载sdk的话,我教你一招,问下你公司运营说你的项目需要某某功能微信某某认证,需要公司营业执照图片,套路下不就有了啊,运营那里有公司执照那些的。实在不行看个体工商户执照行不行自己试试吧。http://ai.baidu.com/

    ![](https://oscimg.oschina.net/oscnet/4ccf5f602f794206244892da0efccd39cf4.jpg)

    二、新建项目获取授权文件

    这一步算是前期测试的重要步骤,先要到控制台(默认第一步已经完成了)百度人脸识别链接
    这个控制台基本就是人脸识别的所有开发SDK,技术资料的地方了,前端的SDK在SDK管理里面进行下载

    首先你需要在采集SDK管理里面下载授权文件,他会让你跟你据包名跟key的MD5来进行生成,具体步骤按着他们的操作就行了。这里也有官网集成步骤文档:http://ai.baidu.com/docs#/Face-Android-SDK/top

    如下图,最顶部 有问题找客服可以提交工单,有比较专业的专属客服给你回答,回复速度大概也是4小时左右吧。下面有创建应用,左侧有sdk下载入口。

    ![](https://oscimg.oschina.net/oscnet/f96b0607a0cab4ceb12d506d8ef54596315.jpg)

    进入下载授权文件是需要您的开发者账号企业认证才可以进入的哦。
    ![](https://oscimg.oschina.net/oscnet/eae86a9a93a7b71d0092b91da08fbbc3f0e.jpg)

    ![](https://oscimg.oschina.net/oscnet/ffd72e22a59746892d2275eeb4a71010edc.jpg)

    这个授权文件下载后放在Android项目的assets 文件夹
    SDK下载跟示例工程下载
    在采集SDK管理这里下拉会看到下载SDK跟示例工程这两栏
    但是我建议你可以直接根据你们公司的业务需求下载对应的示例工程,比如我下载的就是人脸登陆/考勤这个,这里面已经包含了全套的离线SDK功能(活体检测,人脸追踪,质量检测等等),如果你要下载带声音的活体检测demo,比如眨眨眼,张张嘴,下载带有活体检测功能的demo即可。如下图:

    ![](https://oscimg.oschina.net/oscnet/621eab9d70eb55750e6c8d78444d6d459e8.jpg)
    ![](https://oscimg.oschina.net/oscnet/77f255ce3a3398bf73e4e7cc94496d7adf2.jpg)

    这是人脸登录示例demo运行效果

    ![](https://oscimg.oschina.net/oscnet/7bbf96cbffe4140267f35162b81df59b4ba.jpg)

    这是 张张嘴眨眨眼语音提示活体检测demo运行效果

    ![](https://oscimg.oschina.net/oscnet/674808166ac99d7be4cab3f35c92f20fb5c.jpg)

    md5指纹:你自己的项目的签名的md5指纹密码,不懂的可以看下这篇文章。Android Studio生成签名文件,自动签名,以及获取SHA1和MD5值:https://blog.csdn.net/it666dhw/article/details/80731021

    我集成的是第一个人脸登录sdk,下载完示例工程后把项目导入AS,下面就是改动下包名跟License

    修改包名

    在app build里面改成自己上图里面的包名:com.test.facere(你自包名)

    修改License

    把刚下载的License文件导入到对应的 assets包下,修改工程里面Config.java类的licenseID(上图的)以及licenseFileName(对应License的文件名,和你下载时起的自定义名字一致),把对应的ak,sk密码改为你的对应的即可。

    ![](https://oscimg.oschina.net/oscnet/8bc5e9a8bcfb936d45eb91cf0ad64d78805.jpg)

    注意:包名改变后或导入到自己项目的时候,运行会报找不到R 文件错误,常见问题啦不要方哈,一个个用到R文件的类删除R 文件的导包,然后自动导包即可,就几个类用到而已。你也可以用切换项目packages 视图下 ,将要改的包名改为你的项目的包名applicationId,然后必须clean ,在rebuild 就可,建议一个个删除自动导包还快省事。

    ![](https://oscimg.oschina.net/oscnet/8e766b402ebfb9eba6eb87e4991fb4b2869.jpg)

    image.png

    以上两步做完没啥问题示例工程就可以跑起来了。

    运行项目后,你可以自行看看人脸检测的一些回调方法:
    3.faceDetectManager.setOnTrackListener设置人脸检测监听器

    回调方法是

    publicvoidonTrack(FaceFilter.TrackedModel trackedModel)
    

      


    乍一看这个回调跟

    faceDetectManager.setOnFaceDetectListener
    

      


    差不多,其实如果仔细看FaceDetectManager这个类的话会发现在

    privatevoidprocess(int[] argb,intwidth,intheight, ArgbPool pool)
    

      


    这个方法里面有这样一段代码

    if(value ==0) { faceFilter.filter(faces, frame);//等于0的时候才带过去}if(listener !=null) { listener.onDetectFace(value, faces, frame);//检测人脸把value值也带过去,用于判断人脸位置}
    

      

    当value为0(表示是一张合格人脸)的时候会在FaceFilter中调用filter方法,并且在该方法中把一个单个face设置到onTrace回调中,如果listener不为空的话直接放到onDetectFace这个回调中,所以从这里也可以看出来其实
    faceDetectManager.setOnFaceDetectListener
    就是为了让你获取一张合格的人脸(可以在这个里面处理你具体的合格人脸操作)
    回归正题,既然onTrace回调是一个合格的人脸就好办了,可以直接拿到TrackedModel里面的人脸图片和服务器进行比对,具体代码逻辑示例代码里面也已经实现了,对比结束后会返回一定的分数给你,如果大于80或者你觉得的分数就认定这个是你在手机端注册过的人脸,然后进行逻辑处理。
    遇到的小问题
    运行demo后发现用一张图片就可以识别通过,明明上面标明了活体检测呀,domo默认是没有开启活体检测的,需要自行改下一个参数就好啦。
    1.初始化application类初始化
    tracker.set_isCheckQuality(true);
    // 是否进行活体校验
    tracker.set_isVerifyLive(true);
    2.在**APIService **这个类改动下三个请求接口的参数:
    // 可以根据实际业务情况灵活调节
    params.setQualityControl("NORMAL");
    params.setLivenessControl("HIGH");//只有为HIGH时才会符合活体检测要求。
    改了这两个地方一张图片就通不过啦,我也纳闷了底层是怎么识别一张图片是否是活体的,唉,对我来说太高端了吧。。。

    在线请求活体检测的接口

    3.当然文档也给出了在线请求活体检测的接口:http://ai.baidu.com/docs#/Face-Liveness-V3/top可以返回图片的活体质量分数值,你可以根据这个返回值来判断是否为活体。按照官网文档操作的时候还是有点坑了,那个参数传的不对导致返回的数据为空,调用在线活体检测v3的api,一直报{"error_code":222200,"error_msg":"request body should be json format"

    ![](https://oscimg.oschina.net/oscnet/d1bb5461a3ed5ebbb5e2429cdcc4f836d1c.jpg)

    Map<String, Object> map = new HashMap<>();
    
    List<Object> list = new ArrayList<Object>();
    
    String imge = AuthService.getImge();
    
    map.put("image", imge);//总数据大小应小于10M
    
    map.put("face_field", "face_liveness,thresholds");
    
    map.put("image_type", "BASE64");
    
    list.add(map);
    
    String param = GsonUtils.toJson(list);
    

      

    复制拿去吧:

    /**
    
    * 在线活体检测
    
    */
    
    public class FaceVerify {
    
    /**
    
    * 重要提示代码中所需工具类
    
    * FileUtil,Base64Util,HttpUtil,GsonUtils请从
    
    * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    
    * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    
    * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    
    * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
    
    * 下载
    
    * @param bmp
    
    */
    
    public static String faceVerify(Bitmap bmp) {
    
    // 请求url
    
    String url ="https://aip.baidubce.com/rest/2.0/face/v3/faceverify";
    
    Map map =new HashMap<>();
    
    List list =new ArrayList();
    
    byte[] bytes = Base64Util.bitmap2Bytes(bmp, Bitmap.CompressFormat.PNG);
    
    String encodeImg = Base64Util.encode(bytes);
    
    map.put("image", encodeImg);//总数据大小应小于10M
    
    map.put("face_field","face_liveness,thresholds,quality,gender,age,face_type");
    
    map.put("image_type","BASE64");
    
    list.add(map);
    
    try {
    
    String param = GsonUtils.toJson(list);
    
    // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
    
    String accessToken = AuthService.getAuth("kSxIGaaTKu9NlV2gxEI8GvoF","VoYRYgIukv6fYUoZYqoVwfUDhKTpQ4WW");
    
    String result = HttpUtil.post(url, accessToken,"application/json", param);
    
    System.out.println(result);
    
    return result;
    
    }catch (Exception e) {
    
    e.printStackTrace();
    
    }
    
    return null;
    
    }
    
    }
    

      

    图片转字节码:

    public static byte[] bitmap2Bytes(Bitmap bitmap, Bitmap.CompressFormat format) {
    
    ByteArrayOutputStream baos =new ByteArrayOutputStream();
    
    bitmap.compress(format,100, baos);
    
    return baos.toByteArray();
    
    }
    

      

    原来先放到list里面在放到map里面就可以了,这了也是花了几个小时,唉,平时太菜的缘故吧。
    下面是我用图片和真人请求的返回值:
    真人:{"error_code":0,"error_msg":"SUCCESS","log_id":510175652579,"timestamp":1541496726,"cached":0,"result":{"thresholds":{"frr_1e-4":0.05,"frr_1e-3":0.3,"frr_1e-2":0.9},"face_liveness":0.9999917365,
    图片:"result":{"thresholds":{"frr_1e-4":0.05,"frr_1e-3":0.3,"frr_1e-2":0.9},"face_liveness":0.9205907483,"

    ![](https://oscimg.oschina.net/oscnet/9da644af40083919a64883a5a32becd64a6.jpg)
    image.png

    其实,在APIService设置了请求参数,就可以无需在请求此接口达到活体检测目的。
    params.setQualityControl("NORMAL");
    params.setLivenessControl("HIGH");

    4.另外百度sdk的so库提供的是三个平台的,建议你的项目只编译'armeabi-v7a'平台即可,否则增加你的项目几倍大,整个集成后大概多出6.5M吧还能接受。在你的app的build.grald 文件defaultConfig{}中

    ndk {
    //设置支持的SO库架构
    abiFilters'armeabi-v7a'// , 'armeabi-v7a', 'arm64-v8a',armeabi
    }

    最后待解决问题:

    在我们的项目中现在bugly反馈日志有如下报错,每天有少量报错日志,有显示后台和前台的,我在几个真机上是问起没问题的,不知道用户是手机硬件什么原因,提交工单客服回复说只能拿到报错手机运行官方demo才能说明问题,所有目前没有找出原因。欢迎留言评论指正,有大佬有解决办法可以私信告知哦。

    14165 java.lang.Error
    miscalculated data length!
    com.baidu.aip.baidufacedemo.utils.Base64.decode(Base64.java:68)

    好啦,关于百度人脸识别集成问题就大功告成啦,有什么问题欢迎指正私聊。

    光写文章没有福利怎么可能,那是永远都不可能的啦。

    1.公众号:推荐两个郭霖,鸿洋,微信搜索其名字即可。这两位都是知名博客大佬,但是关注公众号可以每天在打发早上坐地铁时间就吸收一波干货了,一举两得有木有。当然我知道在地铁里你只会关注美女的哈哈。。

    2.Android 安卓UI 库集合推荐:当你的产品经理需要你自定义根据心情改变手机主题颜色的时候,你就应该想到到这里找找轮子了,收藏吧,骚年。
    https://www.jianshu.com/p/da1ca645b95c

    3.工具类RxTools推荐:普通app几乎大部分工具类,有这个够用了。GitHub上7千+收藏量了。
    https://github.com/vondear/RxTool

    4.安卓博客门户:除了apkbus,掘金,简书,codekk也不错http://p.codekk.com/,鸿洋的玩安卓:http://www.wanandroid.com/

    5.程序员的导航之家:极客导航,分类了你几乎想要了解的网址门户
    http://www.jikedaohang.com/

    5.阿里矢量icon图库:有了这个你是不是可以和ui妹子多交流交流呢哈哈
    http://www.iconfont.cn/


    得到全平台付费内容打包带走(共4T 含音频+图片及直播内容视频等)
    [我的小店进店链接]:dedaofree.taobao.com

    淘口令:【混沌大大学堂王东岳创新院研习社商学院创业营创投营包更新】https://m.tb.cn/h.3NTTSIi 点击链接,再选择浏览器咑閞;或復·制这段描述¥Sgk7bPooUrp¥后到淘♂寳♀

    你以为送完免费东东就完了,是不是还意犹未尽?没错,我必须给大伙点看家家当了,我本人收集了得到APP上面所有的付费内容,没错,不要问全不全,什么付费订阅课,大师课统统都有。我现在自己就每天都在听,很方便,路上在家有空的时候插上耳机收听就行了。感觉自己每天都有无形的收获!
    做程序员这么多年,一辈子敲代码是不可能的,永远都不可能的。这会是程序员通往产品经理,程序员通往管理高层的成功必经之路!

  • 相关阅读:
    分库分表就能无限扩容吗?
    每天数十亿次请求的应用经验分享,值得参考!
    QPS、TPS、并发用户数、吞吐量
    Django优雅集成MongoDB
    Linux apt-get
    Python Tenacity 实现"重试机制"
    Kubernetes 系列(一):Kubernetes 介绍、架构、安装
    MongoDB学习笔记:文档Crud Shell
    ubuntu下快速安装rabbitmq
    Reactor模型详解:单Reactor多线程与主从Reactor多线程
  • 原文地址:https://www.cnblogs.com/Zzz-/p/10836738.html
Copyright © 2011-2022 走看看