My GitHub

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

  0.引言

    自己在下载dlib官网给的example代码时,一开始不知道怎么使用,在一番摸索之后弄明白怎么使用了;

  现分享下 face_detector.py 和 face_landmark_detection.py 这两个py的使用方法;

 

  1.简介

  python:  3.6.3

  dlib:    19.7

  实现人脸检测/face detection;

  利用dlib的特征提取器,进行人脸 矩形框 的提取:  

1  dets = dlib.get_frontal_face_detector(img)

  

  利用dlib的68点特征预测器,进行人脸 68点 特征提取: 

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

 

    结果:

    

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

 

2.源码py文件实现功能介绍

  face_detector.py :  检测出图片文件中一张或多张人脸,并用矩形框框出标识出人脸;

    link: http://dlib.net/face_detector.py.html

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

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

 

  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 and boost-python installed.  On Ubuntu, this can be done easily by
37 #   running the command:
38 #       sudo apt-get install libboost-python-dev 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.py

 1 # 2017-11-27
 2 # by TimeStamp
 3 # cnblogs: http://www.cnblogs.com/AdaminXie/
 4 
 5 import dlib
 6 from skimage import io
 7 
 8 # 使用特征提取器frontal_face_detector
 9 detector = dlib.get_frontal_face_detector()
10 
11 # path是图片所在路径
12 path = "F:/**/P_dlib_face/pic/"
13 img = io.imread(path+"1.jpg")
14 
15 # 特征提取器的实例化
16 dets = detector(img)
17 
18 print("人脸数:", len(dets))
19 
20 # 输出人脸矩形的四个坐标点
21 for i, d in enumerate(dets):
22     print("", i, "个人脸d的坐标:",
23           "left:", d.left(),
24           "right:", d.right(),
25           "top:", d.top(),
26           "bottom:", d.bottom())
27 
28 # 绘制图片
29 win = dlib.image_window()
30 # 清除覆盖
31 #win.clear_overlay()
32 win.set_image(img)
33 # 将生成的矩阵覆盖上
34 win.add_overlay(dets)
35 # 保持图像
36 dlib.hit_enter_to_continue()

 

对工程目录下的test.jpg进行人脸检测: 

 

结果

  生成的图片窗口结果:

     

  输出结果:   

1 人脸数: 1
2 第 0 个人脸: left: 79 right: 154 top: 47 bottom: 121
3 Hit enter to continue

 

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

 

2.2 face_landmark_detection.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 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 and boost-python installed.  On Ubuntu, this can be done easily by
 45 #   running the command:
 46 #       sudo apt-get install libboost-python-dev 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()

 

 修改:

绘制两个overlay,矩阵框 和 面部特征框 

 1 # 2017-11-27
 2 # by TimeStamp
 3 # cnblogs: http://www.cnblogs.com/AdaminXie/
 4 
 5 import dlib
 6 from skimage import io
 7 
 8 # 使用特征提取器frontal_face_detector
 9 detector = dlib.get_frontal_face_detector()
10 
11 # dlib的68点模型
12 path_pre = "F:/code/python/P_dlib_face/"
13 predictor = dlib.shape_predictor(path_pre+"shape_predictor_68_face_landmarks.dat")
14 
15 # 图片所在路径
16 path_pic = "F:/code/python/P_dlib_face/pic/"
17 img = io.imread(path_pic+"1.jpg")
18 
19 # 生成dlib的图像窗口
20 win = dlib.image_window()
21 win.clear_overlay()
22 win.set_image(img)
23 
24 # 特征提取器的实例化
25 dets = detector(img, 1)
26 print("人脸数:", len(dets))
27 
28 shape2 = predictor(img, dets[0])
29 win.add_overlay(shape2)
30 
31 for k, d in enumerate(dets):
32         print("", k, "个人脸d的坐标:",
33               "left:", d.left(),
34               "right:", d.right(),
35               "top:", d.top(),
36               "bottom:", d.bottom())
37 
38         # 利用预测器预测
39         shape = predictor(img, d)
40 
41         # 绘制面部轮廓
42 #        win.add_overlay(shape)
43 
44 # 绘制矩阵轮廓
45 win.add_overlay(dets)
46 # 保持图像
47 dlib.hit_enter_to_continue()

 

 

结果:  

1 人脸数: 1
2 第 0 个人脸d的坐标: left: 79 right: 154 top: 47 bottom: 121

 

图片窗口结果:

    蓝色的是绘制的  win.add_overlay(shape)
    红色的是绘制的  win.add_overlay(dets)

 

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

  

  

  官网例程中是利用sys.argv[]读取命令行输入,其实为了方便我把文件路径写好了,如果对于sys.argv[]有疑惑,可以参照下面的总结: 

 

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

  ( 如果对于代码中 sys.argv[] 的使用不了解可以参考这里 )

  用来获取cmd命令行参数,例如 获取cmd命令输入“python test.py XXXXX” 的XXXXX参数,可以用于cmd下读取用户输入的文件路径;

  如果不明白可以在python代码内直接 img = imread("F:/*****/test.jpg") 代替 img = imread(sys.argv[1]) 读取图片;

 

    用代码实例来帮助理解:

 1. (sys.argv[0],指的是代码文件本身在的路径)

   test1.py:

1  import sys
2  a=sys.argv[0]
3  print(a) 

   cmd input:

 python test1.py

     cmd output:

test1.py

 

2. (sys.argv[1],cmd输入获取的参数字符串中,第一个字符)

    test2.py:

1 import sys
2 a=sys.argv[1]
3 print(a) 

   cmd input:

python test2.py what is your name

   cmd output: 

what

 

3. (sys.argv[1:],cmd输入获取的参数字符串中,从第一个字符开始到结束)

   test3.py:

1 import sys
2 a=sys.argv[1:]
3 print(a) 

   cmd input: 

python test3.py what is your name

   cmd output: 

 [“what”,“is”,“your”,“name”]

 

3.(sys.argv[2],cmd输入获取的参数字符串中,第二个字符)

   test4.py:

1 import sys
2 a=sys.argv[2]
3 print(a) 

   cmd input:

python test4.py what is your name  

   cmd output:

"is"

 

 

# 请尊重他人劳动成果,转载或者使用源码请注明出处

# 交流学习可以联系邮箱 coneypo@foxmail.com

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