人脸识别和追踪的一次工程实践

前段时间抽空做了一个在视频中做人脸识别并标记(马赛克)的事情,简单记录一下,以供参考。

从Google中检索人脸识别(face recognition)可以得到的技术方案大体上会有如下几种:OpenCV、faceNet 、TensorFlow、CCV、Dlib等,

我们知道,视频是由一帧一帧的连续的图像进行播放进行展示,尽管现代视频编码算法做了非常多的优化,通过提取相同的视觉像素进行复用来降低视频的体积,但是,还原到视频的每一帧,依然是一张完整的图像,视频中人脸识别的比较通俗的套路是对视频的每一帧图像进行识别,辨识出需要识别的人脸,但是由于视频的场景的变化的,尤其是一些实时、实事类型的视频,场景切换、人物极速运动的情形都不可避免,而由于此次视频中人脸识别的精度要求很高(不能漏帧,要求每一帧都识别出来),因此,对于难度也就更大了一些。我在成都双流机场的安检区体验过商汤的人脸识别,其对于双头像、偏脸、低头等情况识别的并不是很好。

由于项目紧迫,工程进度压力较大,因此快速的找到一个可用的方式是很重要的事情。从Google中检索到的方案中,我们发现,每一种支持CNN的深度学习模型,而大多数深度学习模型是需要通过训练数据的,因此,在对TensorFlow的数据训练了近一个月后,我们发现一个有趣的结果,就是视频的连续帧中,总会有一些帧无法正确的识别的人脸,要么是识别到相似的人脸上,要么是没有识别出来。这是一个极度头痛的事情。

换一个思路,加上tracking逻辑。也就是说,首先在某一帧中识别出来所需要的人脸,然后通过tracking的方式,对人脸在视频中的移动进行追踪,只要人脸还在,那么无论是人脸的角度如何变化,都是可以找到对应的目标的。说干就干。     在开头提到的方案中,FaceNet和TensorFlow是纯粹的深度学习框架,只负责识别,CCV也提供了识别和追踪的算法,但是文档甚少。因此我们在OpenCV和DLIB中进行选择。OpenCV 和 Dlib 的作者都非常勤奋,并且都支持比较完整的Python API。

首先使用Dlib做了个Demo:

 

由于项目前期的经验,我们发现无论是使用两者的任何一种,都需要深度学习模型的支持,非常便利的找到Dlib 的Python实现的 face_recognition 项目(https://pypi.org/project/face_recognition/ https://github.com/ageitgey/face_recognition),这个项目的优势在于自带 Dlib 的CNN模型数据,face_recognition_models(https://pypi.org/project/face_recognition_models/)。

关于face_recognition,补充一个信息是:

Built using dlib’s state-of-the-art face recognition,built with deep learning. The model has an accuracy of 99.38% on the Labeled Faces in the Wild benchmark.

参考例子face_recognition 的Sample,我们可以很快速的建立一个对视频中人脸进行识别的demo。


这里需要说明的是:face_recognition是来做人脸识别的,而不是人脸检测。两者的区别是前者能够识别出人脸是谁(基准人脸),而后者是发现目标区域的图像是否是人脸。

所谓的人脸是谁,是通过 distance进行计算的,在dlib和 face_recognition的项目中,通过对人脸区域的rgb数据进行encoding,以及compare,获知两张人脸图像是否标识了同一个人:

优化:

在face_recognition 的项目中,face compare的默认 tolerance的值为0.6

由于项目中加入了追踪算法,因此,在不同的情况下,我们考虑优化这个值,比如:

  1. 第一次识别出人脸,tolerance是否需要适当严格一些,确保识别的首帧准确
  2. Tracking的过程中,我们同样发现,当追踪的目标在图像的边缘消失的情况下,tracking结果返回的失败数据并不足以判断是否追踪失败,以及在两张脸进行交叉的过程中,追踪算法有可能会判断失误,因此,我们在追踪的过程,需要在每次追踪到目标后,同基准目标(基准脸)进行对比,此时的 tolerance 的值需要小一些。

综上,我们在整个对视频的人脸识别(recognition)和追踪的过程中,使用了增加了三个机制:

  1. 在未发现识别目标的情况下,对每一帧的人脸进行多次识别
  2. 发现目标人脸后,对每一帧识别的结果,进行人脸距离的判断
  3. 输入多张基准目标(不同角度)

最终的识别追踪效果如下:

补充:

关于人脸识别和追踪业内有很多种方案,这里仅仅描述了一个我亲身实践并基本满足要求的一个方案,其他方案我也做了一些简单的收集,可以参考如下:

  1. https://github.com/opencv/opencv
  2. https://github.com/ageitgey/face_recognition
  3. http://dlib.net/
  4. https://www.one-tab.com/page/LZfYvxL_QdWEzfO-VauCfA
  5. https://www.one-tab.com/page/xqpn3eADRS6t_K3huTzzPw

此条目发表在同步技术分类目录,贴了, , 标签。将固定链接加入收藏夹。