前言#
基于深度卷积神经网络的人脸检测算法得到的人脸框一般普遍存在较大抖动的现象,在某些应用上这种抖动会带来很大的影响。这篇文章分享一下我对人脸框稳定的一些处理方法。
正文#
现在移动端上十有八九都是在使用 mtcnn 做人脸检测,我也是基于这个网络结构做的。其实哪怕用其他方法,比如 SSD、yolo,做人脸检测也可以,只需要将人脸框再过一遍 mtcnn 中的 Onet 输出人脸五个特征点就好。
具体思路很简单,Onet 输出人脸五个特征点,取鼻头坐标,做 N 帧平均。然后基于鼻头坐标取固定长宽的人脸框,再对当前帧和上一帧人脸框做 IOU,如果结果大于 IOUrate,使用上一帧人脸框坐标为当前帧的人脸框坐标。再对人脸框坐标做 N 帧平均。这样最后得到的人脸框基本没有抖动,而且人脸移动后,框也会相对平滑的跟着移动。
解释一下,IOU 可以有效抑制框的小幅度抖动,但人脸移动的时候,IOU 会引起框的大步跨越式移动。所以后面又加了个 N 帧平均,就是为了让框能平滑的移动。前面对鼻头做 N 帧平均,我考虑的是为了尽量降低引起 IOU 跨越移动的情况。
caffe+gpu+python 组合,这个算法速度也一般般吧。我 1080Ti 也要 100ms 一帧。
C++、ncnn、cpu 组合就快多了,一帧 10ms 左右。cpu 是 Intel® Xeon (R) CPU E5-2673 v3
C++ + ncnn 以及 python + caffe 代码地址: GitHub - HansRen1024/Face-Tracking-Using-
CNN-and-Optical-Flow: C++ implementation for paper: A Real-Time and Long-Term
Face Tracking Method using Convolutional Neural Network and Optical Flow
Python + pytorch 代码地址: https://github.com/HansRen1024/C-OF