随着人脸识别的日益普及,它的应用场景越来越广。近几年面市的门禁机、考勤机、校园班牌等终端,纷纷集成了人脸识别功能。但与此相对,相应场景下“服役”多年的老旧设备,由于早期产品设计往往没有摄像头,并且老旧设备算力也不足以支撑人脸识别算法的运行。但如果将这些老旧设备全盘替换,不仅成本昂贵还需要解决系统迭代兼容性问题。
那么如何低成本让老旧设备焕发新生机?近期,笔者从市场上了解到,虹软视觉开放平台联合多家产业链合作伙伴,推出了一款可外接的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上找到了一个开源的框架:https://github.com/saki4510t/UVCCamera,把项目代码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模组连接过程中可能会断开,需要做一些重连操作。
(免责声明:本网站内容主要来自原创、合作伙伴供稿和第三方自媒体作者投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
任何单位或个人认为本网站中的网页或链接内容可能涉嫌侵犯其知识产权或存在不实内容时,应及时向本网站提出书面权利通知或不实情况说明,并提供身份证明、权属证明及详细侵权或不实情况证明。本网站在收到上述法律文件后,将会依法尽快联系相关文章源头核实,沟通删除相关内容或断开相关链接。 )