Python利用Dlib库进行人脸识别,pythondlib库人脸,  0.引言    


  0.引言

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

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

  1.开发环境

  python:  3.6.3

  dlib:    19.7

2.py文件功能介绍

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

  face_landmark_detection.py :  在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 run10 #   this program on them and see the detections by executing the11 #   following command:12 #       ./face_detector.py ../examples/faces/*.jpg13 #14 #   This face detector is made using the now classic Histogram of Oriented15 #   Gradients (HOG) feature combined with a linear classifier, an image16 #   pyramid, and sliding window detection scheme.  This type of object detector17 #   is fairly general and capable of detecting many types of semi-rigid objects18 #   in addition to human faces.  Therefore, if you are interested in making19 #   your own object detectors then read the train_object_detector.py example20 #   program.  21 #22 #23 # COMPILING/INSTALLING THE DLIB PYTHON INTERFACE24 #   You can install dlib using the command:25 #       pip install dlib26 #27 #   Alternatively, if you want to compile dlib yourself then go into the dlib28 #   root folder and run:29 #       python setup.py install30 #   or31 #       python setup.py install --yes USE_AVX_INSTRUCTIONS32 #   if you have a CPU that supports AVX instructions, since this makes some33 #   things run faster.  34 #35 #   Compiling dlib should work on any operating system so long as you have36 #   CMake and boost-python installed.  On Ubuntu, this can be done easily by37 #   running the command:38 #       sudo apt-get install libboost-python-dev cmake39 #40 #   Also note that this example requires scikit-image which can be installed41 #   via the command:42 #       pip install scikit-image43 #   Or downloaded from http://scikit-image.org/download.html. 44 45 import sys46 47 import dlib48 from skimage import io49 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 image58     # 1 time.  This will make everything bigger and allow us to detect more59     # 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 score73 # 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 be77 # 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 import sys 2  3 import dlib 4 from skimage import io 5  6 #使用dlib自带的frontal_face_detector()函数作为特征提取器 7 detector = dlib.get_frontal_face_detector() 8  9 #使用dlib的图片窗口10 win = dlib.image_window()11 12 #sys.argv用来获取命令行参数,[0]表示代码本身文件路径,参数1开始向后依次是获取图片路径13 for f in sys.argv[1:]:14     #输出目前处理的图片地址15     print("Processing file: {}".format(f))16     #使用skimage的io读取图片17     img = io.imread(f)18      #使用detector进行人脸检测,dets为人脸个数19     dets = detector(img, 1)20     print("Number of faces detected: {}".format(len(dets)))21     for i, d in enumerate(dets):22         print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(23         i, d.left(), d.top(), d.right(), d.bottom()))24 25     #绘制图片26     win.clear_overlay()27     win.set_image(img)28     win.add_overlay(dets)29     dlib.hit_enter_to_continue()30 31 32 # Finally, if you really want to you can ask the detector to tell you the score33 # for each detection.  The score is bigger for more confident detections.34 # The third argument to run is an optional adjustment to the detection threshold,35 # where a negative value will return more detections and a positive value fewer.36 # Also, the idx tells you which of the face sub-detectors matched.  This can be37 # used to broadly identify faces in different orientations.38 if (len(sys.argv[1:]) > 0):39     img = io.imread(sys.argv[1])40     dets, scores, idx = detector.run(img, 1, -1)41     for i, d in enumerate(dets):42         print("Detection {}, score: {}, face_type:{}".format(d, scores[i], idx[i]))

打开cmd命令提示符,cd到face_detector.py所在目录,然后输入

python face_detector.py test.jpg

对test.jpg进行人脸检测,test.jpg需要和py文件放在同一目录下;  

结果

  图片窗口结果:

技术分享图片

    cmd输出结果: 

1 F:\code\******\face_test>python face_detector.py test.jpg2 Processing file: test.jpg3 Number of faces detected: 14 Detection 0: Left: 79 Top: 47 Right: 154 Bottom: 1215 Hit enter to continue6 Detection [(79, 47) (154, 121)], score: 2.5174034275544996, face_type:0.0

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

技术分享图片

  2.2face_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()

修改:

 1 import sys 2 import os 3 import dlib 4 import glob 5 from skimage import io 6  7 detector = dlib.get_frontal_face_detector() 8  9 #使用预测器,此处为预测器的路径,预测器在下载的example文件夹里面,  *****修改此处****10 predictor = dlib.shape_predictor("F:/code/******/shape_predictor_68_face_landmarks.dat")11 12 #使用dlib的图片窗口13 win = dlib.image_window()14 15 #1.读取图片test2.jpg的路径,    ******修改此处*****16 img = io.imread("F:/code/*****/test2.jpg")17 18 #2.或者还是利用cmd参数输入读取路径:19 #img=io.imread(sys.argv[1])20     21 win.clear_overlay()22 win.set_image(img)23 24 dets = detector(img, 1)25 print("Number of faces detected: {}".format(len(dets)))26 27 for k, d in enumerate(dets):28         print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(29             k, d.left(), d.top(), d.right(), d.bottom()))30         # Get the landmarks/parts for the face in box d.31         shape = predictor(img, d)32         print("Part 0: {}, Part 1: {} ...".format(shape.part(0),33                                                   shape.part(1)))34         # Draw the face landmarks on the screen.35         win.add_overlay(shape)36 37 win.add_overlay(dets)38 dlib.hit_enter_to_continue()

结果

cmd输出:

  可以看到Number of faces detected:1,即检测到人脸数为1

1 F:\code\python\test2017110601\python_examples\face_test>python face_landmark_detection.py2 Number of faces detected: 13 Detection 0: Left: 200 Top: 142 Right: 468 Bottom: 4094 Part 0: (195, 233), Part 1: (197, 267) ...5 Hit enter to continue

图片窗口结果:

技术分享图片

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

  技术分享图片

* 关于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 sys2  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 sys2 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 sys2 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 sys2 a=sys.argv[2]3 print(a) 

   cmd input:

python test4.py what is your name

   cmd output:

"is"

Python利用Dlib库进行人脸识别

评论关闭