原标题:基于外接AI镜头模组 老旧安卓设备如何低成本升级人脸识别
随着人脸识别的日益普及,它的应用场景越来越广。近几年面市的门禁机、考勤机、校园班牌等终端,纷纷集成了人脸识别功能。但与此相对,相应场景下“服役”多年的老旧设备,由于早期产品设计往往没有摄像头,并且老旧设备算力也不足以支撑人脸识别算法的运行。但如果将这些老旧设备全盘替换,不仅成本昂贵还需要解决系统迭代兼容性问题。
那么如何低成本让老旧设备焕发新生机?近期,笔者从市场上了解到,虹软视觉开放平台联合多家产业链合作伙伴,推出了一款可外接的AI摄像头模组,内置芯片和高精度算力,能够在原设备基础上轻松升级实现人脸识别。
一、什么是AI摄像头模组?
首先要介绍一下虹软视觉开放平台,它是业内知名的免费视觉AI算法提供方,开放了人脸识别、活体检测、人脸属性分析、人证核验等一系列算法SDK。支持免费商用,而且能够离线运行,在一些对信息安全要求高,或者不具备联网条件的封闭场景下,都非常适用。
该AI摄像头模组概况来说,是一款能够急速上手的软硬一体化小型开发机,可以让AI算法落地更标准化,更小巧化。
软件上,模组集成了虹软视觉开放平台ArcFace人脸识别算法及相应配套应用软件服务。算法能力上除了人脸比对、识别、属性检测、人证核验等多种基础功能外,还支持大面积遮挡下的人脸识别,抵御攻击方面具备RGB/IR活体检测双重保障,支持离线激活使用,同时自带图像质量检测功能,自动过滤画面模糊或小角度的人脸图像,提升识别准确率和识别速度。
硬件上,模组集成了UVC摄像头和RV1109芯片,通过USB接口对外输出视频流数据,只需要将模组插入相应设备,即可工作。其中,自带RV1109芯片平台提供算力这点非常重要,不仅解决了老设备算力不足的问题,而且RV1109芯片性价比非常高,很适合门禁、闸机的改造。
同时,该AI摄像头模组除了支持跨Android、 Windows、Linux等多系统运行,算法计算结果以JSON标准化输出,标准化接口可供平台移植、拓展业务。
此外,这款AI摄像头模组可通过硬件适配参数调节,适配不同分辨率的设备,适用场景也非常丰富,像人员注册、人脸识别开门、考勤打卡、门禁权限管理、识别记录查询等功能,老设备都可以通过外接AI摄像头模组来实现。
二、项目开发详细介绍
从虹软商务获取了其产业链伙伴的AI镜头模组,虹软已经把模组的服务软件部署进去了,同时也提供了Windows及Android的客户端Demo,如果没有特殊需求,安装客户端之后基本能做到即插即用。在我个人的开发过程中,因为项目本身有定制化需求,所以没有用虹软开放平台官方提供的客户端APK,而是自己做了Android的上位机开发。简单来说,项目首先需要获取UVC视频流,将视频图像显示在Android上位机上;其次利用RNDIS将模组和Android上位机建立通信;最后通过Arc服务获取到算法处理结果,并将结果显示到Android上位机,以下是我的开发过程。
2.1 USB摄像头SDK封装
获取USB摄像头视频流需要借助第三方框架,我在Github上找到了一个开源的框架,把项目代码clone到本地,使用AndroidStudio打开项目代码;修改“Application.mk文件,运行“ndkBuild”;编译成功后,得到“arm64-v8a”和“armeabi-v7a”两个架构的so包,并编译出jar包;或者执行assembleRelease任务,编译出libuvccamera-release.aar包,供后续项目使用,如下图所示:
2.2 集成USB摄像头SDK
新建Android项目,将“libuvccamera-release.aar”开发包添加到项目libs文件夹中,修改build.gradle文件,编译项目,这样开发包就集成好了,如下图所示:
2.3 AI摄像头模组获取
虹软AI摄像头模组类似于一个软、硬件结合的小型开发机。软件上,模组集成了人脸识别算法及应用软件,通过RNDIS(RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡)服务和Android上位机通信;硬件上,模组集成了UVC摄像头,通过USB接口对外输出视频流数据,只需要将模组插入Android上位机,即可工作。
2.4 实现UvcCameraHelper获取UVC视频流
2.4.1 获取到UsbDevice
我自己实现了一个UvcCameraHelper类,用来管理USB摄像头的生命周期。不同于集成好的Android设备摄像头,AI摄像头模组作为一个外接设备,需要使用“USBMonitor.java”类遍历获取,attach到对应的USB设备后,请求USB权限,如果权限通过,会有一个onConnect回调,表示USB设备已连接,可以进行下一步操作了,具体如下图所示:
如上图,onConnect方法回调成功以后,就可以对UsbDevice进行下一步操作了。
2.4.2 开启USB摄像头
拿到UsbDevice后,借助UVCCamera类,就可以开启USB摄像头了,调用UVCCamera.open()和UVCCamera.startPreview()方法后,摄像头开启成功,使用TextureView作为显示视频图像数据,就可以在Android上位机实时显示摄像头图像数据了,具体实现如下图所示:
2.5 接入AI摄像头模组
2.5.1 实现网络通信
AI摄像头模组里面集成了Arc服务,用于检测、识别人脸,并将人脸结果对外输出。将 AI模组插入Android上位机USB接口上,Arc服务就会自启动了。
通过RNDIS,我在Android端实现了一套Http和WebSocket通信服务,用来和AI模组进行数据传输。如下图所示,使用Retrofit作为网络通信框架:
如下图所示,创建API服务,和AI模组进行网络数据交互:
如下图所示,创建WebSoket服务,用于接收AI模组人脸识别数据:
通过以上步骤,就完成了AI摄像头模组和Android上位机网络通信功能。
3.5.2 网络数据交互
Arc服务包含设备激活、人员注册、设置参数等API。
如下图所示,调用激活接口,激活AI模组,才能够进行后续操作:
如下图所示,调用注册人员接口,将人脸库注册到AI模组中,用于后续人脸识别:
AI摄像头模组集成了人脸识别算法及算法核心业务,将模组摄像头对准人脸,开始识别人脸,并最终将人脸识别结果输出。如下图所示,我实现了一个WebSocket服务,用于接收人脸识别结果数据:
2.5.2 数据显示
拿到人脸识别结果数据,包括人脸框,人脸ID,人脸图片等。如下图人脸识别结果数据结构:
通过自定义View,使用Paint和Canvas类,绘制人脸框Rect数据;根据type类型判断识别结果,包括识别成功、识别失败等,并将人员信息显示在UI上。
到这里,AI模组和Android上位机就接入好了。
三、注意事项
由于虹软SDK只包含arm64-v8a和armeabi-v7a的so包,在编译USB摄像头SDK的时候,只能编译对应架构的so包;
需要选择对应的USB设备ID,才能正常开启USB摄像头,注意不要选错;
AI模组连接过程中可能会断开,需要做一些重连操作。