1. 程式人生 > >【人臉檢測——Dlib學習】Face_detector_example

【人臉檢測——Dlib學習】Face_detector_example

輪廓 author 官網 line file 的人 我們 程序 com

0.目標

本小節解讀官網example

1.官網介紹翻譯

a. 這個例子展示了如何在一個圖像中找到正面的人臉。具體來說,它顯示了如何從命令行獲取圖像列表,並在屏幕上顯示每個帶有紅框的人臉。

b. Face_detector采用了HOG特征,結合了線性分類器、圖像金字塔和滑動窗口檢測方案。這種類型的目標檢測是非常普遍的,且有能力檢測除人臉外許多半剛性目標。因此,如果你對制作你自己的目標檢測感興趣,那麽可以閱讀train_object_detector.py文件

2.源碼解讀

# -*-coding:utf-8-*-
#author: lyp time: 2018/9/7
import sys

import
dlib # 初始化程序 detector = dlib.get_frontal_face_detector() win = dlib.image_window() # 讀取圖片,在cmd中鍵入 python xx(文件名).py 需要識別的圖片名 for f in sys.argv[1:]: print("Processing file: {}".format(f)) img = dlib.load_rgb_image(f) # 參數1表示我們對圖像進行向上采樣1倍,這將使一切變的更大 # 進而讓我們檢測出更多的人臉 dets = detector(img, 1)
# 輸出檢測出來的人臉個數 print("Number of faces detected: {}".format(len(dets))) # 輸出第i張人臉矩形框的位置坐標,詳情見下圖1 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() # 下面這部分的功能是輸出第i張人臉的得分 # score分數越大,說明detector更確信是人臉 # detector.run中第三個參數是可選擇的檢測閾值 # 檢測閾值為負,將會返回更多的檢測結果 # 檢測閾值為正,將會返回較少的檢測結果 # idx將告訴我們是哪個子檢測器與圖像中第i張人臉匹配。 # 這將更廣泛地用於識別不同方向的人臉 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]))

技術分享圖片

a.官網例子需要再windows下的cmd中輸入命令運行程序,具體原因與操作可以參考:XXXXXX。

  這種操作在Windows中非常不友好,各種奇怪的問題。所以,需要更換讀取圖片的方式

b.我們常用OpenCV處理,下面小節改成OpenCV操作圖片。

3. 換為OpenCV後的代碼

# -*-coding:utf-8-*-
#author: lyp time: 2018/9/7
import cv2

import dlib

# 初始化程序
detector = dlib.get_frontal_face_detector()


# 讀取圖片,在cmd中鍵入 python xx(文件名).py 需要識別的圖片名
img = cv2.imread("cba.jpg")


# 參數1表示我們對圖像進行向上采樣1倍,這將使一切變的更大
# 進而讓我們檢測出更多的人臉
dets = detector(img, 1)

# 輸出檢測出來的人臉個數
print("Number of faces detected: {}".format(len(dets)))

# 輸出第i張人臉矩形框的位置坐標,詳情見下圖1
for i, d in enumerate(dets):
    print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
        i, d.left(), d.top(), d.right(), d.bottom()))
    cv2.rectangle(img, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]), (0,255, 255),2)

# cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None):繪制矩形框圖
    # img: 輸入的圖像
    # pt1: 矩形頂點坐標
    # pt2: 與pt1成對角的頂點坐標
    # color: 矩形框的顏色
    # 2: 所畫線的寬度

    # 繪制人臉矩形輪廓
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

# 下面這部分的功能是輸出第i張人臉的得分
# score分數越大,說明detector更確信是人臉
# detector.run中第三個參數是可選擇的檢測閾值
    # 檢測閾值為負,將會返回更多的檢測結果
    # 檢測閾值為正,將會返回較少的檢測結果
# idx將告訴我們是哪個子檢測器與圖像中第i張人臉匹配。
    # 這將更廣泛地用於識別不同方向的人臉
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]))

技術分享圖片

4.致謝

https://www.cnblogs.com/AdaminXie/p/7905888.html

【人臉檢測——Dlib學習】Face_detector_example