起因:常见的MTCNN人脸对齐使用了大量系统资源,但是检测人脸的效率不高(如人脸角度过大,人脸有一部分在屏幕之外的情况检测不到,同时检测时间过长,不适合我算力低的设备),
解决方法:现在通过cvzone的meshmoudle进行人脸网格478关键点检测facesMoudle中利用这些关键点可以在skimage中的五点仿射,将人脸裁剪,完成人脸对齐。
①借鉴博主人脸对齐过程中的图:
基于人脸5个关键点的人脸对齐(人脸纠正)-CSDN博客
通过五点仿射出来的图片更适合人脸识别在论文中也提到这一点,以下是标准脸的五点关键坐标
REFERENCE_FACIAL_POINTS = np.array([ [30.29459953, 51.69630051], [65.53179932, 51.50139999], [48.02519989, 71.73660278], [33.54930115, 92.3655014], [62.72990036, 92.20410156] ], np.float32)
对应cvzone的meshmoudle中的数组序号(cvzone的版本是1.5.6)
- 左眼上: 159
- 左眼下: 145
- 右眼上: 386
- 右眼下: 374
- 鼻子: 1
- 嘴巴左: 61
- 嘴巴右: 291
②人脸对齐之后,又考虑到通过人脸关键点可以推算人脸姿态,我这里试过68关键点效果不佳,这里刚好可以用上cvzone的meshmoudle获得的关键点也就是 左眼左眼角,右眼右眼角,鼻子尖,嘴巴左边,嘴巴右边,下巴中心这6个点来推算人脸姿态,这里借鉴博主的姿态检测:
头部姿态估计原理及可视化_pitch (x) head detection-CSDN博客
对应cvzone的meshmoudle中的数组序号(cvzone的版本是1.5.6)
- 左眼左眼角: 130
- 右眼右眼角: 359
- 鼻子: 1
- 嘴巴左: 61
- 嘴巴右: 291
- 下巴: 152
通过这种方式在笔记本电脑的CPU上运行轻量级tensorflow帧率可以达到15fps,不得不说cvzone获得478个人脸关键点速度非常快,也是基于他背后的mediapipe库的强大。本文以笔记的形式做一个个人记录,cvzone的关键点获取比起MTCNN速度快了很多倍,在轻量级设备上效果很好,为了我后面利用这些坐标去进行人脸识别。