早些年,人脸识别技术不是十分成熟,对图像的分辨率、人脸特征完整性要求高,设备计算资源无法满足,实时性也无法保证。并且在早期的安防监控部署方案中,基本上都是模拟摄像机+同轴电缆+视频录像机的方案,录像只能保存在本地,不具备容灾性。
随着科技发展,如今安防领域的典型解决方案已经变为数字高清摄像头+POE以太网/无线网桥+RAID硬盘录像机/云存储的方案。最近一两年,嵌入式设备的运算能力逐步提高,成本逐步下降,这就导致了安防监控从被动存储回放式向主动防御监控式的转变。海康威视成熟的视频安防监控设备内部处理器集成FPGA和ARM处理器,FPGA负责处理图像传感器数据,然后传输给ARM处理器进行数据的处理,ARM处理器上一般运行一个裁剪版的嵌入式Linux系统,负责对图像数据进行图像预处理、FPGA图像采集前端参的数调节、视频的编码以及编码后数据的网络协议封装和数据发送。
有些处理器设计为异构架构,内部还集成了DSP运算核心,能够实现一些特定的图像算法,从一定程度上看,这类设备已经具备了一定的视频内容分析功能。但是,DSP一般用作视频编码加速用,ARM主要用来调度FPGA图像处理前端和进行网络数据发送,能够用来做图像处理尤其是人脸检测与识别、人体分类等等高运算量和高内存占用的工作还是力不从心的。本作品延续这类安防设备的思路,针对安防设备本身运算能力不高,对一些运算密集型的算法无法部署到计算资源低的设备上的弊端进行改进,设计使用两级人脸识别算法,使用传统的人脸识别分类器在低运算量的嵌入式设备上进行初步图像处理,提取出视频流中的人脸ROI区域,通过网络发送到监控中心后,使用集中式的高性能计算设备进行更加准确的识别分类。同时监控中心可以针对每一个监控相机分发不同的分类器,实现特定机位对特定目标的搜索识别。硬件设备:树莓派3树莓派摄像头 Oray异地VPN组网路由器X3软件环境:Python3 opencv2.4.13
硬件连接图:
代码说明:首先监控中心分发特定目标的图片和和训练好的lbp分类器文件到各树莓派节点,树莓派控制摄像头采集图像并利用下发的分类器对采集到的视频帧进行人脸ROI区域提取,并发送提取到的ROI区域图像到中心节点(本作品中心节点使用的是Face++的服务器),进行比对、搜素并返回结果。
face_roi_extract.py 功能是视频采集和人脸ROI提取,负责对视频中的人脸进行检测和提取储存。
face_api.py 是一个python3 的face++ sdk,因为face++仅提供python2 的sdk,所以就简单做了一个py3 的sdk,其实就是api集合,非常简陋。
faceset_cli.py 是一个简单的命令行交互工具,可以用来管理faceset数据集,包括faceset的创建、列举、删除,faceset中face的添加、列举、删除。同时支持从本地图片导入人脸、face token导入、摄像头捕捉人脸导入三种方式。本代码执行后会在tmp文件夹下面自动建立录入的人脸信息和face token的映射文件,为其他模块工作时提供索引文件。
face_search.py 是一个人脸搜素的工具。能对传入的图片在指定的人脸集合中搜素匹配,若搜索到则返回搜索到的目标姓名信息。
face_detect.py 是一个对视频中所有已经检测到的人脸进行检测,提取脸部特征和facetoken并存入dat文件中的工具。这个可以用来做签到。
face_compare.py 是一个对传入的两张图片做比对的工具,返回两个人脸的相似度。