Python 3 利用 Dlib 19.7 进行人脸检测

0. 引言

  介绍 Dlib 官网 人脸检测 的两个例程:

    face_detector.py:  单张图片中的单个/多个人脸的面部定位 ; 

    face_landmark_detection.py: 单张图片的脸部特征点标定 ;

  

  (关于 Windows下 Python  Dlib 库的安装,如有问题,可以参考我的另一篇博客:http://www.cnblogs.com/AdaminXie/p/9032224.html )

 

1. 简介

  开发环境:

    Python:  3.6.3

  Dlib:    19.7

 

  face_detector.py, 利用 Dlib 的 正向人脸检测器,进行人脸检测,提取人脸外部矩形框    

detector = dlib.get_frontal_face_detector()

 

face_landmark_detection.py, 利用训练好的人脸 68 点特征检测器,进行人脸面部轮廓特征提取: 

predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
shape = predictor(img, dets[0])

 

程序运行结果:

     (a) face_detector.py  (b) face_landmark_detection.py

    图 1 工程结果示例

 

2. 源码介绍

Face Detector

   根据官网的介绍:
    "This example program shows how to find frontal human faces in an image.
     In particular, it shows how you can take a list of images from the command line
     and display each on the screen with red boxes overlaid on each human face."

  检测出一张图片文件中的,一张或多张人脸,并用红色矩形框框出标识出每张人脸;

 

Face Landmark Detection

   根据官网的介绍:
    "This example program shows how to find frontal human faces in an image and estimate their pose.
     The pose takes the form of 68 landmarks.
     These are points on the face such as the corners of the mouth, along the eyebrows, on the eyes, and so forth."

  在 face_detector.py 的检测人脸基础上,检测出人脸部的具体特征部位:下巴轮廓、眉毛、眼睛、嘴巴,同样用标记标识出面部特征;

     

2.1. face_detector.py 

官网给的 face detector.py :

 1 #!/usr/bin/python
 2 # The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
 3 #
 4 #   This example program shows how to find frontal human faces in an image.  In
 5 #   particular, it shows how you can take a list of images from the command
 6 #   line and display each on the screen with red boxes overlaid on each human
 7 #   face.
 8 #
 9 #   The examples/faces folder contains some jpg images of people.  You can run
10 #   this program on them and see the detections by executing the
11 #   following command:
12 #       ./face_detector.py ../examples/faces/*.jpg
13 #
14 #   This face detector is made using the now classic Histogram of Oriented
15 #   Gradients (HOG) feature combined with a linear classifier, an image
16 #   pyramid, and sliding window detection scheme.  This type of object detector
17 #   is fairly general and capable of detecting many types of semi-rigid objects
18 #   in addition to human faces.  Therefore, if you are interested in making
19 #   your own object detectors then read the train_object_detector.py example
20 #   program.  
21 #
22 #
23 # COMPILING/INSTALLING THE DLIB PYTHON INTERFACE
24 #   You can install dlib using the command:
25 #       pip install dlib
26 #
27 #   Alternatively, if you want to compile dlib yourself then go into the dlib
28 #   root folder and run:
29 #       python setup.py install
30 #   or
31 #       python setup.py install --yes USE_AVX_INSTRUCTIONS
32 #   if you have a CPU that supports AVX instructions, since this makes some
33 #   things run faster.  
34 #
35 #   Compiling dlib should work on any operating system so long as you have
36 #   CMake installed.  On Ubuntu, this can be done easily by running the
37 #   command:
38 #       sudo apt-get install cmake
39 #
40 #   Also note that this example requires scikit-image which can be installed
41 #   via the command:
42 #       pip install scikit-image
43 #   Or downloaded from http://scikit-image.org/download.html. 
44 
45 import sys
46 
47 import dlib
48 from skimage import io
49 
50 
51 detector = dlib.get_frontal_face_detector()
52 win = dlib.image_window()
53 
54 for f in sys.argv[1:]:
55     print("Processing file: {}".format(f))
56     img = io.imread(f)
57     # The 1 in the second argument indicates that we should upsample the image
58     # 1 time.  This will make everything bigger and allow us to detect more
59     # faces.
60     dets = detector(img, 1)
61     print("Number of faces detected: {}".format(len(dets)))
62     for i, d in enumerate(dets):
63         print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
64             i, d.left(), d.top(), d.right(), d.bottom()))
65 
66     win.clear_overlay()
67     win.set_image(img)
68     win.add_overlay(dets)
69     dlib.hit_enter_to_continue()
70 
71 
72 # Finally, if you really want to you can ask the detector to tell you the score
73 # for each detection.  The score is bigger for more confident detections.
74 # The third argument to run is an optional adjustment to the detection threshold,
75 # where a negative value will return more detections and a positive value fewer.
76 # Also, the idx tells you which of the face sub-detectors matched.  This can be
77 # used to broadly identify faces in different orientations.
78 if (len(sys.argv[1:]) > 0):
79     img = io.imread(sys.argv[1])
80     dets, scores, idx = detector.run(img, 1, -1)
81     for i, d in enumerate(dets):
82         print("Detection {}, score: {}, face_type:{}".format(
83             d, scores[i], idx[i]))

 

face_detector 代码处理过程如下: 

 

图 2 face_detector 代码处理过程

 

  为了方便理解,修改增加注释之后的 face_detector_v1.py

 1 # created at 2017-11-27
 2 # updated at 2018-09-06
 3 
 4 # Author:   coneypo
 5 # Dlib:     http://dlib.net/
 6 # Blog:     http://www.cnblogs.com/AdaminXie/
 7 # Github:   https://github.com/coneypo/Dlib_examples
 8 
 9 import dlib
10 from skimage import io
11 
12 # 使用 Dlib 的正面人脸检测器 frontal_face_detector
13 detector = dlib.get_frontal_face_detector()
14 
15 # 图片所在路径
16 img = io.imread("../imgs/faces_2.jpeg")
17 
18 # 生成 Dlib 的图像窗口
19 win = dlib.image_window()
20 win.set_image(img)
21 
22 # 使用detector检测器来检测图像中的人脸
23 faces = detector(img, 1)
24 print(type(faces[0]), '\n')
25 
26 print("人脸数 / faces in all:", len(faces))
27 
28 for i, d in enumerate(faces):
29     print("", i+1, "个人脸的矩形框坐标:",
30           "left:", d.left(), '\t', "right:", d.right(), '\t', "top:", d.top(),'\t',  "bottom:", d.bottom())
31 
32 # 绘制矩阵轮廓
33 win.add_overlay(faces)
34 
35 # 保持图像
36 dlib.hit_enter_to_continue()

 

    图 3 参数 d.top(), d.right(), d.left(), d.bottom() 位置坐标说明

 

结果

  生成的图片窗口结果:

图 4 face_detector.py 的输出结果(单张人脸)

     

  输出结果:     

人脸数 / faces in all: 11 个人脸的矩形框坐标: left: 103      right: 211      top: 44      bottom: 152
Hit enter to continue

 

   对于多个人脸的检测结果:

 

图 5 face_detector.py 的输出结果(多张人脸)

 

但是我们进行图像处理的时候,经常是用 OpenCv 进行处理,所以我们在下面代码中,使用 OpenCv 的对象(矩形框用 cv2.rectangle() 函数画):

  face_detector_v2_use_opencv.py :

 1 # created at 2017-11-27
 2 # updated at 2018-09-06
 3 
 4 # Author:   coneypo
 5 # Dlib:     http://dlib.net/
 6 # Blog:     http://www.cnblogs.com/AdaminXie/
 7 # Github:   https://github.com/coneypo/Dlib_examples
 8 
 9 # create object of OpenCv
10 # use OpenCv to read and show images
11 
12 import dlib
13 import cv2
14 
15 # 使用 Dlib 的正面人脸检测器 frontal_face_detector
16 detector = dlib.get_frontal_face_detector()
17 
18 # 图片所在路径
19 # read image
20 img = cv2.imread("imgs/faces_2.jpeg")
21 
22 # 使用 detector 检测器来检测图像中的人脸
23 # use detector of Dlib to detector faces
24 faces = detector(img, 1)
25 print("人脸数 / Faces in all: ", len(faces))
26 
27 # Traversal every face
28 for i, d in enumerate(faces):
29     print("", i+1, "个人脸的矩形框坐标:",
30           "left:", d.left(), "right:", d.right(), "top:", d.top(), "bottom:", d.bottom())
31     cv2.rectangle(img, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]), (0, 255, 255), 2)
32 
33 cv2.namedWindow("img", 2)
34 cv2.imshow("img", img)
35 cv2.waitKey(0)

 

2.2 face_landmark_detection.py

  官网给的  face_landmark_detection.py

(link: http://dlib.net/face_landmark_detection.py.html)

  1 #!/usr/bin/python
  2 # The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
  3 #
  4 #   This example program shows how to find frontal human faces in an image and
  5 #   estimate their pose.  The pose takes the form of 68 landmarks.  These are
  6 #   points on the face such as the corners of the mouth, along the eyebrows, on
  7 #   the eyes, and so forth.
  8 #
  9 #   The face detector we use is made using the classic Histogram of Oriented
 10 #   Gradients (HOG) feature combined with a linear classifier, an image pyramid,
 11 #   and sliding window detection scheme.  The pose estimator was created by
 12 #   using dlib's implementation of the paper:
 13 #      One Millisecond Face Alignment with an Ensemble of Regression Trees by
 14 #      Vahid Kazemi and Josephine Sullivan, CVPR 2014
 15 #   and was trained on the iBUG 300-W face landmark dataset (see
 16 #   https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/):  
 17 #      C. Sagonas, E. Antonakos, G, Tzimiropoulos, S. Zafeiriou, M. Pantic. 
 18 #      300 faces In-the-wild challenge: Database and results. 
 19 #      Image and Vision Computing (IMAVIS), Special Issue on Facial Landmark Localisation "In-The-Wild". 2016.
 20 #   You can get the trained model file from:
 21 #   http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2.
 22 #   Note that the license for the iBUG 300-W dataset excludes commercial use.
 23 #   So you should contact Imperial College London to find out if it's OK for
 24 #   you to use this model file in a commercial product.
 25 #
 26 #
 27 #   Also, note that you can train your own models using dlib's machine learning
 28 #   tools. See train_shape_predictor.py to see an example.
 29 #
 30 #
 31 # COMPILING/INSTALLING THE DLIB PYTHON INTERFACE
 32 #   You can install dlib using the command:
 33 #       pip install dlib
 34 #
 35 #   Alternatively, if you want to compile dlib yourself then go into the dlib
 36 #   root folder and run:
 37 #       python setup.py install
 38 #   or
 39 #       python setup.py install --yes USE_AVX_INSTRUCTIONS
 40 #   if you have a CPU that supports AVX instructions, since this makes some
 41 #   things run faster.  
 42 #
 43 #   Compiling dlib should work on any operating system so long as you have
 44 #   CMake installed.  On Ubuntu, this can be done easily by running the
 45 #   command:
 46 #       sudo apt-get install cmake
 47 #
 48 #   Also note that this example requires scikit-image which can be installed
 49 #   via the command:
 50 #       pip install scikit-image
 51 #   Or downloaded from http://scikit-image.org/download.html. 
 52 
 53 import sys
 54 import os
 55 import dlib
 56 import glob
 57 from skimage import io
 58 
 59 if len(sys.argv) != 3:
 60     print(
 61         "Give the path to the trained shape predictor model as the first "
 62         "argument and then the directory containing the facial images.\n"
 63         "For example, if you are in the python_examples folder then "
 64         "execute this program by running:\n"
 65         "    ./face_landmark_detection.py shape_predictor_68_face_landmarks.dat ../examples/faces\n"
 66         "You can download a trained facial shape predictor from:\n"
 67         "    http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2")
 68     exit()
 69 
 70 predictor_path = sys.argv[1]
 71 faces_folder_path = sys.argv[2]
 72 
 73 detector = dlib.get_frontal_face_detector()
 74 predictor = dlib.shape_predictor(predictor_path)
 75 win = dlib.image_window()
 76 
 77 for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")):
 78     print("Processing file: {}".format(f))
 79     img = io.imread(f)
 80 
 81     win.clear_overlay()
 82     win.set_image(img)
 83 
 84     # Ask the detector to find the bounding boxes of each face. The 1 in the
 85     # second argument indicates that we should upsample the image 1 time. This
 86     # will make everything bigger and allow us to detect more faces.
 87     dets = detector(img, 1)
 88     print("Number of faces detected: {}".format(len(dets)))
 89     for k, d in enumerate(dets):
 90         print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
 91             k, d.left(), d.top(), d.right(), d.bottom()))
 92         # Get the landmarks/parts for the face in box d.
 93         shape = predictor(img, d)
 94         print("Part 0: {}, Part 1: {} ...".format(shape.part(0),
 95                                                   shape.part(1)))
 96         # Draw the face landmarks on the screen.
 97         win.add_overlay(shape)
 98 
 99     win.add_overlay(dets)
100     dlib.hit_enter_to_continue()

 

代码处理流程:

 

图 6 face_landmark_detection 处理流程

 

绘制两个 overlay,人脸外接矩阵框 和 面部特征框 ;

    红色的是绘制的 人脸矩形框   win.add_overlay(dets)

    蓝色的是绘制的 人脸面部轮廓  win.add_overlay(shape) 

 

face_landmark_detection_v1.py:

 1 # created at 2017-11-27
 2 # updated at 2018-09-06
 3 
 4 # Author:   coneypo
 5 # Dlib:     http://dlib.net/
 6 # Blog:     http://www.cnblogs.com/AdaminXie/
 7 # Github:   https://github.com/coneypo/Dlib_examples
 8 
 9 import dlib
10 from skimage import io
11 
12 # 使用 Dlib 的正面人脸检测器 frontal_face_detector
13 detector = dlib.get_frontal_face_detector()
14 
15 # Dlib 的 68点模型
16 predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
17 
18 # 图片所在路径
19 img = io.imread("imgs/faces_2.jpeg")
20 
21 # 生成 Dlib 的图像窗口
22 win = dlib.image_window()
23 win.set_image(img)
24 
25 # 使用 detector 检测器来检测图像中的人脸
26 faces = detector(img, 1)
27 print("人脸数:", len(faces))
28 
29 for i, d in enumerate(faces):
30     print("", i+1, "个人脸的矩形框坐标:",
31           "left:", d.left(), "right:", d.right(), "top:", d.top(), "bottom:", d.bottom())
32 
33     # 使用predictor来计算面部轮廓
34     shape = predictor(img, faces[i])
35     # 绘制面部轮廓
36     win.add_overlay(shape)
37 
38 # 绘制矩阵轮廓
39 win.add_overlay(faces)
40 
41 # 保持图像
42 dlib.hit_enter_to_continue()

 

 输出结果:

人脸数: 11 个人脸的矩形框坐标: left: 63 right: 384 top: 206 bottom: 527
Hit enter to continue

 

 

图 7 face_landmark_detection.py 的输出结果(多张人脸)

  

(官网例程中是利用 sys.argv[] 读取命令行输入,如果对于 sys.argv[] 有疑惑,可以参照下面的总结) 

* 关于 sys.argv[] 的使用:

 sys.argv[] 用来获取命令交互模式下,尾随的参数;

 例如在 cmd 的 console 模式下,输入

  >>> python test.py parameter_1

 就可以利用 sys.argv[] 拿到 parameter_1 的值;

 建议还是直接在源码指定好图片等参数路径;

 

 下面用代码实例来帮助理解:

 在 Console(Windows 下是 Command Prompt,命令提示符)输入以下命令:

python test.py what is your name

 

test.py 内容:

import sys

print(sys.argv[0])
# test.py

print(sys.argv[1])
# what

print(sys.argv[2])
# is

print(sys.argv[1:])
# [“what”,“is”,“your”,“name”]

 

 

# 如果对您有帮助,欢迎在 GitHub 上 Star 本项目: https://github.com/coneypo/Dlib_examples

# 请尊重他人劳动成果,转载或者使用源码请注明出处:http://www.cnblogs.com/AdaminXie

# 如有问题请留言或者联系邮箱: coneypo@foxmail.com

posted @ 2017-11-27 20:20 coneypo 阅读(...) 评论(...) 编辑 收藏