机器视觉运动控制系列1:face_recognition研究笔记
几个月前,boss想要做的一个项目中有这样一系列的需求,使用摄像头捕获特定的人脸目标,然后控制机械臂追随目标移动并定时拍下照片,这一机器视觉运动控制系列是整理当时部分代码的重现。为了快速的实现这一目标的原型我首先寻找了一下人脸识别的实现方式,对face_recognition做了较多研究,本文是这一部分工作的记录。
face_recognition是非常流行的一个人脸识别项目,repo在这里:
ageitgey:github.com/ageitgey/face_recognition
当时小项目的第一步是想要在摄像头中识别出人脸,比较了几个库后face_recognition的介绍比较贴切也好实现,就对他研究比较多。昨天重新搭环境莫名的不顺利,所以也记下过程备查。face_recognition依赖dlib,直接下载dlib提示需要cmake,而cmake又需要vs,装了vs2017
conmunity,确定支持cmake编译时突然回忆起自己之前不是这么麻烦搞的吧,才想起时pypi上的dlib。。。得嘞这也省事,所以直接pypi上下载然后install搞定,之后pip安装face_recognition,opencv-python,部署完成。
配置好了环境之后按照face_recognition的example,先跑一下benchmark看一下机器的能力:
1 | All benchmarks are only using a single CPU core |
可以看到Face locations随着图片分辨率的提高效率明显下降,而对应的Face landmarks
几乎没有什么影响,这也是我一直想还是研究使用特征来追踪的原因,靠调Face locations来实时定位的效果太差了。
下面记录一些当时和example不太一样的实现:
1 | # 在一张图片里找多个人的人脸,之前测试时发现识别率有待提高,存在较多的误认; |
下来看如何从一个视频里找到目标的人脸:
1 | # 从视频中找到人脸,可以参考example/facerec_from_video_file.py,它是整体输出到output.avi里。 |
在上段代码中修改一句源就可以变成从摄像头展开识别了:
1 | #从摄像头里识别人脸 |
但是使用这段代码来进行摄像头的实时识别体验比较差,笔者的电脑像看ppt一样,face_recognition也给出了一个优化的方案,思路是把视频源进行缩放,然后隔一帧做一次识别,牺牲一定的识别范围(实测缩放后可以识别的距离在一米到一米五之间,当然我想与我的摄像头性能也有关系),提高识别的效率。
1 | #从摄像头中找到人脸,参考facerec_from_webcam_faster.py |
至此我们就有了一个可以快速实现计算机识别的人脸的方案了。包含从一个照片中找到多人;从视频中找到某人并实时打水印和保存截图,以及从摄像头中找到多人。使用face_recognition,目标只需要提供一张照片就可以了,它很简单但是精确性上自然有些牺牲,如果要识别侧脸,识别物体运动轨迹(这个小项目当时的需求是要能识别脸部运动轨迹的),使用face_recognition可能就不是很合适了,具体解决方案有待于以后有机会再研究。