使用 mtcnn 做人脸特征点检测

代码环境:

Windows10,python 3.6,opencv 3.x,tensorflow-gpu,face-net 的 mtcnn 模块

mtcnn 代码下载:

https://github.com/davidsandberg/facenet/tree/master/src/align

使用 mtcnn 做人脸特征点检测_第1张图片

代码:

import tensorflow as tf
import face_detect.align.detect_face as detect_face
import cv2

minsize = 20  # 脸部最小的大小
threshold = [0.6, 0.7, 0.7]  # 三个步骤的阈值
factor = 0.709  # 用于在图像中检测的人脸大小的缩放金字塔的因子

# 分配给 tensorflow 的 gpu 的显存大小: GPU 实际显存 * 1.0
gpu_memory_fraction = 1.0

# 创建 tensorflow 网络并加载参数
with tf.Graph().as_default():
    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_memory_fraction)
    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
    with sess.as_default():
        pnet, rnet, onet = detect_face.create_mtcnn(sess, None)

image_path = "C:/Users/idmin/Pictures/face.jpg"

img = cv2.imread(image_path)  # 使用 opencv 的方法读取图片

"""
bounding_boxes: 保存人脸位置信息 [左上角x, 左上角y, 右下角x, 右下角y, (这个暂时没明白,我猜应该是检测为人脸的概率)]
face_points: 保存人脸特征点的位置。一列表示一张脸。
[右眼x]
[左眼x]
[鼻子x]
[右嘴角x]
[左嘴角x]
[右眼y]
[左眼y]
[鼻子y]
[右嘴角y]
[左嘴角y]
"""
bounding_boxes, face_points = detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)

nrof_faces = bounding_boxes.shape[0]  # 人脸数目
print('找到的人脸数目为:{}'.format(nrof_faces))
print("打印 bounding_box 的内容:\n", bounding_boxes)
print("打印 face_points 的内容:\n", face_points)

# 画人脸框
for index, face_position in enumerate(bounding_boxes):
    face_position = face_position.astype(int)
    cv2.rectangle(img, (face_position[0], face_position[1]), (face_position[2], face_position[3]), (0, 255, 0), 2)
    # 人脸特征点
    for i in range(5):
        cv2.circle(img, (face_points[i, index], face_points[i + 5, index]), 3, (255, 255, 0), -1)
cv2.imshow("img", img)
cv2.waitKey()

效果:

使用 mtcnn 做人脸特征点检测_第2张图片

使用 mtcnn 做人脸特征点检测_第3张图片

你可能感兴趣的:(人脸识别)