人脸检测方法有许多,比如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