人脸检测方法有许多,比如opencv自带的人脸haar特征分类器和dlib人脸检测方法等。对于opencv的人脸检测方法,有点是简单,快速;存在的问题是人脸检测效果不好。正面/垂直/光线较好的人脸,该方法可以检测出来,而侧面/歪斜/光线不好的人脸,无法检测。因此,该方法不适合现场应用。对于dlib人脸检测方法 ,效果好于opencv的方法,但是检测力度也难以达到现场应用标准。
mtcnn是基于深度学习的人脸检测方法,对自然环境中光线,角度和人脸表情变化更具有鲁棒性,人脸检测效果更好;同时,内存消耗不大,可以实现实时人脸检测。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
from scipy import misc
import tensorflow as tf
import detect_face
import cv2
import matplotlib.pyplot as plt
% pylab inline
minsize = 20 # minimum size of face
threshold = [ 0.6 , 0.7 , 0.7 ] # three steps's threshold
factor = 0.709 # scale factor
gpu_memory_fraction = 1.0
print ( 'creating networks and loading parameters' )
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 = '/home/cqh/facedata/multi_face/multi_face3.jpg'
img = misc.imread(image_path)
bounding_boxes, _ = detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)
nrof_faces = bounding_boxes.shape[ 0 ] #人脸数目
print ( '找到人脸数目为:{}' . format (nrof_faces))
print (bounding_boxes)
crop_faces = []
for face_position in bounding_boxes:
face_position = face_position.astype( int )
print (face_position[ 0 : 4 ])
cv2.rectangle(img, (face_position[ 0 ], face_position[ 1 ]), (face_position[ 2 ], face_position[ 3 ]), ( 0 , 255 , 0 ), 2 )
crop = img[face_position[ 1 ]:face_position[ 3 ],
face_position[ 0 ]:face_position[ 2 ],]
crop = cv2.resize(crop, ( 96 , 96 ), interpolation = cv2.inter_cubic )
print (crop.shape)
crop_faces.append(crop)
plt.imshow(crop)
plt.show()
plt.imshow(img)
plt.show()
|
实验效果如下:
再上一组效果图:
关于mtcnn,更多资料可以点击链接
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/Mr_EvanChen/article/details/77650883