OpenCV利用Haar Cascades進行人臉檢測

目標

在這屆會議上,html

  • 咱們將使用基於Haar特徵的級聯分類器來了解人臉檢測的基礎知識
  • 咱們將延長相同的眼睛檢測等。

基礎

使用基於Haar特徵的級聯分類器的對象檢測是Paul Viola和Michael Jones在2001年發表的文章「使用簡單特徵的加強級聯的快速對象檢測」中提出的一種有效的對象檢測方法。它是基於機器學習的方法,其中a級聯功能是從許多正面和負面圖像進行訓練。而後用它來檢測其餘圖像中的對象。python

在這裏,咱們將使用人臉檢測。最初,該算法須要大量正面圖像(人臉圖像)和負面圖像(無人臉圖像)來訓練分類器。而後咱們須要從中提取功能。爲此,使用下圖中顯示的haar特徵。它們就像咱們的卷積核。每一個特徵是經過從黑色矩形下的像素之和中減去白色矩形下的像素總和而得到的單個值。算法

哈爾特徵

如今,每一個內核的全部可能的大小和位置都用來計算大量的功能。(想象一下它須要多少計算?即便是一個24x24的窗口也會產生超過160000個特性)。對於每一個特徵計算,咱們須要找到白色和黑色矩形下的像素總和。爲了解決這個問題,他們介紹了積分圖像。它簡化了像素總和的計算,像素數量有多大,涉及到只涉及四個像素的操做。很好,不是嗎?它使事情超快。機器學習

但在咱們計算的全部這些特徵中,大多數都是可有可無的。例如,請考慮下面的圖片。頂行顯示兩個很好的功能。所選的第一個特徵彷佛集中在眼睛區域比鼻子和臉頰區域更暗的屬性上。所選的第二個特徵依賴於眼睛比鼻樑更暗的特性。但應用在臉頰或任何其餘地方的窗戶是可有可無的。那麼咱們如何從16萬多個功能中選擇最佳功能呢?它由Adaboost實現。ide

人臉檢測

爲此,咱們在全部訓練圖像上應用每一個特徵。對於每一個特徵,它找到最佳的閾值,將臉部分爲正面和負面。但顯然,會出現錯誤或錯誤分類。咱們選擇錯誤率最小的特徵,這意味着它們是對臉部和非臉部圖像進行最佳分類的特徵。(這個過程並不像這樣簡單,每一個圖像在開始時被賦予相同的權重,每次分類以後,錯誤分類的圖像的權重會增長,而後再次進行相同的處理,計算出新的錯誤率,並計算新的權重。過程繼續進行直到達到所需的準確度或錯誤率或找到所需的特徵數目)。學習

最後的分類器是這些弱分類器的加權和。它被稱爲弱,由於它自己不能對圖像進行分類,但與其餘人造成強大的分類器。該報告稱,即便200個功能也能提供95%的準確度檢測。他們的最終設置有大約6000個功能。(想象一下從160000+個功能減小到6000個功能,這是一個很大的收穫)。ui

因此如今你拍一張照片。採起每一個24x24窗口。爲其添加6000個功能。檢查它是否正面。哇..哇..是否是有點低效和耗時?是的。做者有一個很好的解決方案。spa

在圖像中,大部分圖像區域是非人臉區域。因此最好有一個簡單的方法來檢查一個窗口是否是一我的臉區域。若是不是,則一次性丟棄它。不要再處理它。而應關注可能有臉部的區域。這樣,咱們能夠找到更多時間來檢查可能的臉部區域。code

爲此,他們引入了分類器級聯的概念。不是將全部6000個特徵應用於窗口,而是將特徵分組到分類器的不一樣階段並逐個應用。(一般最初的幾個階段將包含很是少的功能)。若是一個窗口在第一階段失敗,請丟棄它。咱們不考慮其餘功能。若是經過,則應用第二階段的功能並繼續該過程。經過全部階段的窗口是一個面部區域。計劃如何!視頻

做者的探測器具備6000多個特徵,38個階段,前5個階段具備1,10,25,25和50個特徵。(上圖中的兩個功能其實是Adaboost的兩個最佳功能)。據做者說,平均而言,每一個子窗口評估了6000個以上的10個功能。

所以,這是對Viola-Jones人臉檢測工做的直觀解釋。請閱讀論文以獲取更多詳細信息,或查看其餘資源部分中的參考資料

OpenCV中的Haar級聯檢測

OpenCV隨附教練機和探測器。若是你想爲汽車,飛機等任何物體訓練你本身的分類器,你可使用OpenCV建立一個。它的所有細節在這裏給出:級聯分類器培訓。

這裏咱們將處理檢測。OpenCV已經包含許多用於面部,眼睛,笑臉等的預先分類器。這些XML文件存儲在opencv/data/haarcascades/文件夾中。讓咱們用OpenCV建立人臉和眼睛檢測器。

首先,咱們須要加載所需的XML分類器。而後以灰度模式加載咱們的輸入圖像(或視頻)。

import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

img = cv2.imread('sachin.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

如今咱們在圖像中找到了臉部。若是找到面部,它會以Rect(x,y,w,h)的形式返回檢測到的面部的位置。一旦咱們得到了這些位置,咱們就能夠爲臉部建立ROI並在此ROI上應用眼部檢測(由於眼睛老是在臉上!!!)。

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

結果以下所示:

人臉檢測

其餘資源

  1. 視頻演講人臉檢測和跟蹤
  2. 亞當·哈維有關人臉檢測的一個有趣採訪

參考:

http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html

 

轉載請註明出處!!!

相關文章
相關標籤/搜索