opencv:使用dlib進行人臉檢測

  • 2019 年 12 月 19 日
  • 筆記

人臉檢測

隨著人臉識別,人臉支付,換臉等業務等爆發,多的人都將目光放在人臉方面的研究上。可以說,人臉檢測是目前所有目標檢測子方向中被研究的最充分的問題之一,它在安防監控,人機交互,金融支付,社交和娛樂等方面有很強的應用價值,也是整個人臉識別演算法的第一步。

問題描述

人臉檢測的目標就是從影像中找到所有的人臉對應的位置,演算法結果輸出的是人臉在影像中所處的坐標。有些演算法還會有其它的一些資訊,比如性別,年齡,面部情緒等。詳細的發展過程網上有很多的參考資料,這裡不作過多的介紹。

Dlib

DLIB是包含機器學習演算法和工具,一個現代化的C ++工具包。它在工業界和學術界使用非常廣泛,包括機器人,嵌入式設備,行動電話,和高性能的計算環境。DLIB有開源許可,因此可以在任何應用程式中免費使用。 詳細介紹:http://dlib.net/python/index.html 實現的功能有很多:

使用起來也是比較簡單的,首先進行安裝:

pip install dlib  pip install opencv-python

關於人臉檢測這塊的函數是get_frontal_face_detector 寫一個測試腳本:

import cv2import sysimport dlib    detector = dlib.get_frontal_face_detector()  # init detectorimg_file = sys.argv[1]  img = cv2.imread(img_file)  img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # convert to gray img to speedfaces = detector(img_gray, 1)  # detect input img, para 1 means 1 times upsamlefor face in faces:  # may be many faces in one image      print(face)      y1 = face.bottom()  # detect box bottom y value      y2 = face.top()  # top y value      x1 = face.left()  # left x value      x2 = face.right()  # right x value      print(x1, x2, y1, y2)    # add detect box in image      cv2.rectangle(img,(int(x1),int(y1)),(int(x2),int(y2)),(0,255,0),3)    cv2.imshow('new.jpg', img)  cv2.waitKey(0)
python test.py image1

單人情況下,image1:

在這裡插入圖片描述 結果:

[(161, 247) (546, 632)]161 546 632 247

多人情況下,img2:

結果:

關於get_frontal_face_detector的使用參數可以看下官方例子:

#!/usr/bin/python# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt##   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.##   The examples/faces folder contains some jpg images of people.  You can run#   this program on them and see the detections by executing the#   following command:#       ./face_detector.py ../examples/faces/*.jpg##   This face detector is made using the now classic Histogram of Oriented#   Gradients (HOG) feature combined with a linear classifier, an image#   pyramid, and sliding window detection scheme.  This type of object detector#   is fairly general and capable of detecting many types of semi-rigid objects#   in addition to human faces.  Therefore, if you are interested in making#   your own object detectors then read the train_object_detector.py example#   program.  ### COMPILING/INSTALLING THE DLIB PYTHON INTERFACE#   You can install dlib using the command:#       pip install dlib##   Alternatively, if you want to compile dlib yourself then go into the dlib#   root folder and run:#       python setup.py install##   Compiling dlib should work on any operating system so long as you have#   CMake installed.  On Ubuntu, this can be done easily by running the#   command:#       sudo apt-get install cmake##   Also note that this example requires Numpy which can be installed#   via the command:#       pip install numpyimport sysimport dlib    detector = dlib.get_frontal_face_detector()  win = dlib.image_window()for f in sys.argv[1:]:      print("Processing file: {}".format(f))      img = dlib.load_rgb_image(f)    # The 1 in the second argument indicates that we should upsample the image      # 1 time.  This will make everything bigger and allow us to detect more      # faces.      dets = detector(img, 1)      print("Number of faces detected: {}".format(len(dets)))    for i, d in enumerate(dets):          print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(              i, d.left(), d.top(), d.right(), d.bottom()))        win.clear_overlay()      win.set_image(img)      win.add_overlay(dets)      dlib.hit_enter_to_continue()# Finally, if you really want to you can ask the detector to tell you the score# for each detection.  The score is bigger for more confident detections.# The third argument to run is an optional adjustment to the detection threshold,# where a negative value will return more detections and a positive value fewer.# Also, the idx tells you which of the face sub-detectors matched.  This can be# used to broadly identify faces in different orientations.if (len(sys.argv[1:]) > 0):      img = dlib.load_rgb_image(sys.argv[1])      dets, scores, idx = detector.run(img, 1, -1)    for i, d in enumerate(dets):          print("Detection {}, score: {}, face_type:{}".format(              d, scores[i], idx[i]))

重點說明第二個參數,設置為1表示一次上取樣,對原圖進行上取樣放大,能夠使得檢測器檢測出更多的人臉。也可以設置為其它值,比如2,表示進行兩次上取樣。

參考

  • 人臉檢測演算法綜述: https://zhuanlan.zhihu.com/p/36621308?spm=a2c4e.100239.0.0.630f6fadaf5Dje
  • 人臉檢測背景介紹和發展現狀 : https://zhuanlan.zhihu.com/p/32702868?spm=a2c4e.100239.0.0.630f6fadaf5Dje
  • dlib github: https://github.com/davisking/dlib?spm=a2c4e.100239.0.0.630f6fadaf5Dje