【人臉檢測——Dlib學習】Face_detector_example
阿新 • • 發佈:2018-09-07
輪廓 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 importdlib # 初始化程序 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