在 python 中使用 Haar-Cascade 進(jìn)行人臉檢測(cè)
介紹
在本文中,我們將討論在 OpenCV python 中使用 Haar Cascade(級(jí)聯(lián))實(shí)現(xiàn)人臉檢測(cè)器。
識(shí)別圖像中的給定對(duì)象稱為對(duì)象檢測(cè)。可以使用多種技術(shù)來(lái)完成此任務(wù),但在本文中,我們將使用帶有預(yù)訓(xùn)練 XML 文件的 haar 級(jí)聯(lián)。這是執(zhí)行對(duì)象檢測(cè)的最簡(jiǎn)單方法。
Haar 級(jí)聯(lián)已用于低邊緣設(shè)備上的對(duì)象檢測(cè),它是 OpenCV 中最流行的對(duì)象檢測(cè)算法之一。
Haar 級(jí)聯(lián)計(jì)算量不大;因此它適用于計(jì)算能力較小的小型設(shè)備。
Haar 級(jí)聯(lián)
什么是 Haar 級(jí)聯(lián),它是如何工作的?
Haar 級(jí)聯(lián) 是一種基于特征的對(duì)象檢測(cè)算法,用于從圖像中檢測(cè)對(duì)象。Cascade 函數(shù)在大量正負(fù)圖像上進(jìn)行訓(xùn)練以進(jìn)行檢測(cè)。
該算法不需要大量計(jì)算并且可以實(shí)時(shí)運(yùn)行。我們可以為動(dòng)物、汽車、自行車等自定義對(duì)象訓(xùn)練自己的級(jí)聯(lián)函數(shù)。
Haar 級(jí)聯(lián) 不能用于人臉識(shí)別,因?yàn)樗荒茏R(shí)別匹配的形狀和大小。
Haar 級(jí)聯(lián)使用 Cascade 函數(shù)和 Cascade 窗口。它嘗試計(jì)算每個(gè)窗口的特征并進(jìn)行正負(fù)分類。如果窗口可以是對(duì)象的一部分,則為正,否則為負(fù)。
Haar 級(jí)聯(lián)可以理解為二進(jìn)制分類器。它為那些可以成為我們對(duì)象一部分的級(jí)聯(lián)窗口指定正值,為那些不能成為我們對(duì)象的一部分的窗口指定負(fù)值。
· Haar 級(jí)聯(lián)可以實(shí)時(shí)工作。
· 與現(xiàn)代對(duì)象檢測(cè)算法相比,Haar 級(jí)聯(lián)并不準(zhǔn)確。
· 它檢測(cè)到許多誤報(bào)。這可以在一定程度上進(jìn)行調(diào)整,但不能完全刪除。
· 實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單。
· Haar 級(jí)聯(lián)最大的缺點(diǎn)是它的誤報(bào)檢測(cè)。
預(yù)訓(xùn)練的 Haar 級(jí)聯(lián)
有許多預(yù)訓(xùn)練的 haar 級(jí)聯(lián)文件使實(shí)施變得超級(jí)容易。我們也可以訓(xùn)練自己的 haar 級(jí)聯(lián),但這需要大數(shù)據(jù)進(jìn)行訓(xùn)練。
OpenCV 庫(kù)在 GitHub 上管理所有流行的 haar 級(jí)聯(lián)預(yù)訓(xùn)練文件的存儲(chǔ)庫(kù)
這些文件可用于各種對(duì)象檢測(cè)任務(wù),例如:
· 人臉檢測(cè)
· 眼睛檢測(cè)
· 車輛檢測(cè)
· 鼻子/嘴巴檢測(cè)
· 身體檢測(cè)
· 車牌檢測(cè)
Haar 級(jí)聯(lián)將其特征存儲(chǔ)在一個(gè) XML 文件中;這些文件可以直接加載到 OpenCV 中,使用 Haar 級(jí)聯(lián)進(jìn)行對(duì)象檢測(cè)。
在 OpenCV 中實(shí)現(xiàn) Haar 級(jí)聯(lián)
如果你正在使用 OpenCV 提供的存儲(chǔ)庫(kù)中可用的任何預(yù)訓(xùn)練對(duì)象檢測(cè),則只需下載預(yù)訓(xùn)練的 XML 文件。
在 Python 中安裝 OpenCV
可以使用 python 中的 pip 包管理器安裝 OpenCV。
!pip install opencv-python
#---OR ---
!pip install opencv-contrib-python
在 OpenCV 中加載 Haar 級(jí)聯(lián)
我們可以使用函數(shù)cv2.CascadeClassifier加載 haar-cascade XML 文件。
face_detector=cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
eye_dectector = cv2.CascadeClassifier(‘haarcascade_eye.xml’)
一旦加載了 XML 文件,我們就可以調(diào)用檢測(cè)器函數(shù)。
results = face_detector.detectMultiScale(gray_img, scaleFactor=1.15,minNeighbors=5,minSize=(34, 35), flags=cv2.CASCADE_SCALE_IMAGE)
# import the necessary packages
import cv2
face_detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_dectector = cv2.CascadeClassifier('haarcascade_eye.xml')
image = cv2.imread('tomato.jpg')
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
results = face_detector.detectMultiScale(gray_img, scaleFactor=1.15,minNeighbors=5,minSize=(34, 35), flags=cv2.CASCADE_SCALE_IMAGE)
print(results)
results是檢測(cè)到的對(duì)象周圍的邊界框坐標(biāo) (x,y,w,h) 的列表。
detectMultiScale中的參數(shù):
· scaleFactor:這表示對(duì)象的大小與原始圖像相比減小了多少。
· minNeighbors:此參數(shù)告訴在單個(gè)邊界框中應(yīng)該有多少個(gè)鄰居。
· minSize?:這表示我們圖像中對(duì)象的最小可能大小。如果我們的對(duì)象小于 minSize ,它將被忽略。
注意:對(duì)于對(duì)象檢測(cè),我們必須使用gray_image, minNeighbors,scaleFactor等參數(shù)。
人臉檢測(cè)
讓我們以第一個(gè)使用預(yù)訓(xùn)練 haar 級(jí)聯(lián)的對(duì)象檢測(cè)示例為例,我們將使用 Python 從圖片中檢測(cè)人臉。
import numpy as np
import cv2
#---loading the Haar 級(jí)聯(lián) detector using CascadeClassifier---face_detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#---Loading the image from local -----
img = cv2.imread('team_india.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
results = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in results:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
· results它包含圖片中邊界框的坐標(biāo)。
· detectMultiScale此方法僅適用于灰度圖片。
· cv2.rectangle允許我們?cè)趥鬟f坐標(biāo)后繪制矩形。
· scaleFactor = 1.3FineTuning 參數(shù),取值范圍從 1 到 2。
分級(jí)檢測(cè)
Haarcascade 支持分級(jí)檢測(cè),這意味著 Haar 級(jí)聯(lián)能夠以分級(jí)方式檢測(cè)單個(gè)幀內(nèi)的多個(gè)對(duì)象。
假設(shè)我們必須檢測(cè)人類的面部和眼睛。要繼續(xù)執(zhí)行任務(wù),我們需要執(zhí)行以下步驟。
· 檢測(cè)人臉
· 對(duì)于每張臉,裁剪人臉并將其轉(zhuǎn)發(fā)以進(jìn)行眼睛檢測(cè)
· 在找到眼睛的坐標(biāo) ( ex,ey,ew,eh) 后,在原始圖片中的眼睛周圍繪制一個(gè)邊界框。
· 在原始圖片上使用坐標(biāo)(x,y,w,h)在面部周圍繪制一個(gè)邊界框。
import numpy as np
import cv2
face_detector1=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_detector1 = cv2.CascadeClassifier('haarcascade_eye.xml')
img = cv2.imread('uman.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces_result = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces_result:
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_detector.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()
實(shí)時(shí)實(shí)現(xiàn)人臉檢測(cè)
我們可以在 OpenCV 視頻流中使用 Haar 級(jí)聯(lián)進(jìn)行對(duì)象檢測(cè),只需要在 OpenCV 中讀取視頻或攝像頭,其余的都是一樣的。
視頻源是一系列幀,因此代碼與單個(gè)幀相同。由于其輕計(jì)算要求,Haar 級(jí)聯(lián)每秒運(yùn)行良好。
我們將讀取 OpenCV 視頻攝像頭輸入以實(shí)時(shí)拍攝圖像。
import cv2
face_detector1 = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_dectector1 = cv2.CascadeClassifier('haarcascade_eye.xml')
# reading the input image now
cap = cv2.VideoCapture(0)
while cap.isOpened():
_, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_detector1.detectMultiScale(gray,1.1, 4 )
for (x,y, w, h) in faces:
cv2.rectangle(frame, pt1 = (x,y),pt2 = (x+w, y+h), color = (255,0,0),thickness = 3)
roi_gray = gray[y:y+h,x:x+w]
roi_color = frame[y:y+h, x:x+w]
eyes = eye_dectector1.detectMultiScale(roi_gray)
for (ex,ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex,ey), (ex+ew, ey+eh), (0,255,0), 5)
cv2.imshow("window", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
frame.release()
眼睛和面部的邊界框?qū)⑹菍?shí)時(shí)的,并且每幀都會(huì)發(fā)生變化。
Haar 級(jí)聯(lián)人臉檢測(cè)的局限性
Haar 級(jí)聯(lián)對(duì)于人臉、汽車等一些對(duì)象仍然很受歡迎,這些對(duì)象很容易區(qū)分。
Haar 級(jí)聯(lián)不能用于深度目標(biāo)檢測(cè),如谷物類型等。
Haar 級(jí)聯(lián)算法有一些限制:
· 與現(xiàn)代對(duì)象檢測(cè)器相比,精度較低。
· 高假陽(yáng)性檢測(cè)。
· 需要手動(dòng)調(diào)整參數(shù)。
· 為自定義對(duì)象訓(xùn)練 haar 級(jí)聯(lián)并不容易。
結(jié)論
在本文中,我們討論了 haar 級(jí)聯(lián)的工作原理以及如何在 python 中使用 OpenCV實(shí)現(xiàn) haar 級(jí)聯(lián)以進(jìn)行對(duì)象檢測(cè)。我們使用預(yù)訓(xùn)練的 haar 級(jí)聯(lián)文件進(jìn)行人臉檢測(cè)和眼睛檢測(cè),然后我們實(shí)時(shí)執(zhí)行相同的操作。
我們還談到了 haar 級(jí)聯(lián)算法的局限性,為什么它仍然被廣泛使用,為什么它這么快。
· 可以使用手動(dòng)參數(shù)調(diào)整來(lái)修復(fù)誤報(bào)率。
· YOLO、SSD 和其他深度學(xué)習(xí)對(duì)象檢測(cè)算法保證了更高的準(zhǔn)確性。
· 訓(xùn)練自定義 haar 級(jí)聯(lián)既耗時(shí)又低效。
原文標(biāo)題 : 在 python 中使用 Haar-Cascade 進(jìn)行人臉檢測(cè)
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-10.29立即報(bào)名>> 2024德州儀器嵌入式技術(shù)創(chuàng)新發(fā)展研討會(huì)
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月14日立即報(bào)名>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
推薦專題
- 1 Intel宣布40年來(lái)最重大轉(zhuǎn)型:年底前裁員15000人、拋掉2/3房產(chǎn)
- 2 因美封殺TikTok,字節(jié)股價(jià)骨折!估值僅Meta1/5
- 3 宏山激光重磅發(fā)布行業(yè)解決方案,助力智能制造產(chǎn)業(yè)新飛躍
- 4 國(guó)產(chǎn)AI芯片公司破產(chǎn)!白菜價(jià)拍賣
- 5 具身智能火了,但規(guī)模落地還需時(shí)間
- 6 國(guó)產(chǎn)英偉達(dá)們,抓緊沖刺A股
- 7 三次錯(cuò)失風(fēng)口!OpenAI前員工殺回AI編程賽道,老東家捧金相助
- 8 英特爾賦能智慧醫(yī)療,共創(chuàng)數(shù)字化未來(lái)
- 9 英偉達(dá)的麻煩在后頭?
- 10 將“網(wǎng)紅”變成“商品”,AI“爆改”實(shí)力拉滿
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市