人臉檢測
随着人臉識别,人臉支付,換臉等業務等爆發,多的人都将目光放在人臉方面的研究上。可以說,人臉檢測是目前所有目标檢測子方向中被研究的最充分的問題之一,它在安防監控,人機互動,金融支付,社交和娛樂等方面有很強的應用價值,也是整個人臉識别算法的第一步。
問題描述
人臉檢測的目标就是從圖像中找到所有的人臉對應的位置,算法結果輸出的是人臉在圖像中所處的坐标。有些算法還會有其它的一些資訊,比如性别,年齡,面部情緒等。詳細的發展過程網上有很多的參考資料,這裡不作過多的介紹。

Dlib
DLIB是包含機器學習算法和工具,一個現代化的C ++工具包。它在工業界和學術界使用非常廣泛,包括機器人,嵌入式裝置,行動電話,和高性能的計算環境。 DLIB有開源許可,是以可以在任何應用程式中免費使用。
詳細介紹:
http://dlib.net/python/index.html實作的功能有很多:
使用起來也是比較簡單的,首先進行安裝:
pip install dlib
pip install opencv-python
關于人臉檢測這塊的函數是
get_frontal_face_detector
寫一個測試腳本:
import cv2
import sys
import dlib
detector = dlib.get_frontal_face_detector() # init detector
img_file = sys.argv[1]
img = cv2.imread(img_file)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # convert to gray img to speed
faces = detector(img_gray, 1) # detect input img, para 1 means 1 times upsamle
for 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 numpy
import sys
import 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,表示進行兩次上采樣。