opencv 取roi_opencv实现人脸识别快速入门
級聯分類器原理介紹:
使用基于Haar特征的級聯分類器進行對象檢測是Paul Viola和Michael Jones在其論文“使用簡單特征的增強級聯進行快速對象檢測”中于2001年提出的一種有效的對象檢測方法。這是一種基于機器學習的方法,其中從許多正負圖像中訓練級聯函數。然后用于檢測其他圖像中的對象。
在這里,我們將進行人臉檢測。最初,該算法需要大量正圖像(面部圖像)和負圖像(無面部圖像)來訓練分類器。然后,我們需要從中提取特征。為此,使用下圖所示的haar功能。它們就像我們的卷積核。每個特征都是通過從黑色矩形下的像素總和中減去白色矩形下的像素總和而獲得的單個值。
現在,每個內核的所有可能大小和位置都用于計算大量功能。(試想一下,它需要多少計算?即使是24x24的窗口也會產生超過160000個特征)。對于每個特征計算,我們需要找到白色和黑色矩形下的像素總和。為了解決這個問題,他們引入了積分圖像。它簡化了僅需要四個像素的操作的像素總和的計算(像素數量可以是多少)。很好,不是嗎?它使事情變得超快。
但是在我們計算出的所有這些功能中,大多數都不相關。例如,考慮下圖。第一行顯示了兩個好的功能。選擇的第一個特征似乎著眼于眼睛區域通常比鼻子和臉頰區域更暗的性質。選擇的第二個功能取決于眼睛比鼻子的鼻梁更黑的屬性。但是在臉頰或其他任何地方使用相同的窗戶是無關緊要的。那么,我們如何從160000多個功能中選擇最佳功能?它是由Adaboost實現的。
為此,我們將所有功能應用于所有訓練圖像。對于每個特征,它會找到最佳的閾值,該閾值會將面部分為正面和負面。但是很顯然,會有錯誤或分類錯誤。我們選擇錯誤率最低的特征,這意味著它們是對面部和非面部圖像進行最佳分類的功能。(此過程并非如此簡單。開始時,每個圖像的權重均相等。每次分類后,錯誤分類的圖像的權重都會增加。然后再次執行相同的過程。將計算新的錯誤率。還要計算新的權重。繼續執行該過程,直到達到所需的準確性或錯誤率或找到所需的功能數量為止。
最終分類器是這些弱分類器的加權和。之所以稱其為弱,是因為它本身無法對圖像進行分類,而是與其他圖像一起構成一個強分類器。該論文說,甚至200個功能都可以提供95%的準確度檢測。他們的最終設置具有大約6000個功能。(想象一下,從160000多個功能減少到6000個功能。這是很大的收獲)。
因此,現在您拍攝一張照片。取每個24x24窗口。向其應用6000個功能。檢查是否有臉。哇..哇..這不是效率低下又費時嗎?是的。作者對此有一個很好的解決方案。
在圖像中,大多數圖像區域是非面部區域。因此,最好有一種簡單的方法來檢查窗口是否不是面部區域。如果不是,請將其一次性丟棄。不要再處理它。而是將注意力集中在可以有臉的區域。這樣,我們可以找到更多時間檢查可能的面部區域。
為此,他們引入了級聯分類器的概念。不要將所有6000個功能部件應用到一個窗口上,而是將這些功能部件分組到不同的分類器階段,然后逐一應用。(通常前幾個階段將包含很少的功能)。如果窗口在第一階段失敗,則將其丟棄。我們不考慮其剩余功能。如果通過,則應用功能的第二階段并繼續該過程。經過所有階段的窗口是一個面部區域。計劃如何!
作者的探測器具有6000多個特征,具有38個階段,在前五個階段具有1、10、25、25和50個特征。(上圖中的兩個功能實際上是從Adaboost獲得的最佳兩個功能)。根據作者的說法,每個子窗口平均評估6000多個功能中的10個。
因此,這是Viola-Jones人臉檢測工作原理的簡單直觀說明。
在OpenCV中通過Haar級聯檢測完成人臉識別:
OpenCV配備了各種檢測器。如果您想為任何物體(例如汽車,飛機等)訓練自己的分類器,則可以使用OpenCV創建一個。
OpenCV已經包含許多針對面部,眼睛,微笑等進行過預訓練的分類器。這些XML文件存儲在opencv/data/haarcascades/文件夾中。讓我們用OpenCV創建面部和眼睛檢測器。
首先,我們需要加載所需的XML分類器。然后以灰度模式加載我們的輸入圖像(或視頻)。
現在,我們在圖像中找到了面孔。如果找到人臉,則將檢測到的人臉的位置返回為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()
結果如下:
作者:經典丶
總結
以上是生活随笔為你收集整理的opencv 取roi_opencv实现人脸识别快速入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql code name作为字段_
- 下一篇: mac mysql mysqldump_