0. 引言
初衷:
当前已经有很多博客对MTCNN的原理分析,不过对于很多从事人脸研究(非人脸检测)的小伙伴而言,人脸检测只是一个前置步骤,并不需要了解太多,更不需要做技术上的创新,只需要效果不错的人脸检测工具箱就好。
既然只是需要一个工具箱,自然选择尽量省事的方法,也就是不需要我们训练网络的方法。因此,本指南只面向于将人脸检测作为工具箱的小伙伴,若想进一步研究的大佬,请移步github查找MTCNN的代码。
本文参考:https://github.com/ipazc/mtcnn
1. 安装
- 环境
python >= 3.4
opencv >= 4.1
tensorflow >=1.12.0
conda install tensorflow-gpu
pip install opencv-python
- 安装
pip install mtcnn
整个安装过程就是这么简单
2. 使用
- 检测
我们用Vggface数据库中的一张图片进行测试
from mtcnn.mtcnn import MTCNN
import cv2
img = cv2.imread("/vggface2/test/n000001/0001_01.jpg")
detector = MTCNN()
face = detector.detect_faces(img)
print(face)
- 坐标输出
运行上述指令,会得到以下结果
[{'box': [57, 71, 79, 97],
'confidence': 0.9995273351669312,
'keypoints': {'left_eye': (73, 110),
'right_eye': (106, 104),
'nose': (89, 133),
'mouth_left': (82, 147),
'mouth_right': (114, 141)}}]
上述数值分别表示:
box:[x, y, width, height],x,y是人脸框左上角坐标的位置,width是框的宽度,height是框的高度。
cofidence:自信度
keypoints:左/右眼,左/右嘴角,鼻子,五个关键点的坐标
- 可视化
有了坐标就可以在图中绘制了
检测的结果是一个被矩阵包围的多层字典,因此需要一层又一层把坐标信息提取出来
face = face[0]
#画框
box = face["box"]
I = cv2.rectangle(img, (box[0],box[1]),(box[0]+box[2], box[1]+box[3]), (255, 0, 0), 2)
#画关键点
left_eye = face["keypoints"]["left_eye"]
right_eye = face["keypoints"]["right_eye"]
nose = face["keypoints"]["nose"]
mouth_left = face["keypoints"]["mouth_left"]
mouth_right = face["keypoints"]["mouth_right"]
points_list = [(left_eye[0], left_eye[1]),
(right_eye[0], right_eye[1]),
(nose[0], nose[1]),
(mouth_left[0], mouth_left[1]),
(mouth_right[0], mouth_right[1])]
for point in points_list:
cv2.circle(I, point, 1, (255, 0, 0), 4)
#保存
cv2.imwrite('result.jpg',I,[int(cv2.IMWRITE_JPEG_QUALITY),70])
效果如下:
当然也可以根据个人需求,不需要画出五个关键点