訂閱
糾錯
加入自媒體

在 python 中使用 Haar-Cascade 進行人臉檢測

介紹

在本文中,我們將討論在 OpenCV python 中使用 Haar Cascade(級聯(lián))實現(xiàn)人臉檢測器。

識別圖像中的給定對象稱為對象檢測?梢允褂枚喾N技術(shù)來完成此任務(wù),但在本文中,我們將使用帶有預(yù)訓(xùn)練 XML 文件的 haar 級聯(lián)。這是執(zhí)行對象檢測的最簡單方法。

Haar 級聯(lián)已用于低邊緣設(shè)備上的對象檢測,它是 OpenCV 中最流行的對象檢測算法之一。

Haar 級聯(lián)計算量不大;因此它適用于計算能力較小的小型設(shè)備。

Haar 級聯(lián)

什么是 Haar 級聯(lián),它是如何工作的?

Haar 級聯(lián) 是一種基于特征的對象檢測算法,用于從圖像中檢測對象。Cascade 函數(shù)在大量正負圖像上進行訓(xùn)練以進行檢測。

該算法不需要大量計算并且可以實時運行。我們可以為動物、汽車、自行車等自定義對象訓(xùn)練自己的級聯(lián)函數(shù)。

Haar 級聯(lián) 不能用于人臉識別,因為它只能識別匹配的形狀和大小。

Haar 級聯(lián)使用 Cascade 函數(shù)和 Cascade 窗口。它嘗試計算每個窗口的特征并進行正負分類。如果窗口可以是對象的一部分,則為正,否則為負。

Haar 級聯(lián)可以理解為二進制分類器。它為那些可以成為我們對象一部分的級聯(lián)窗口指定正值,為那些不能成為我們對象的一部分的窗口指定負值。

· Haar 級聯(lián)可以實時工作。

· 與現(xiàn)代對象檢測算法相比,Haar 級聯(lián)并不準確。

· 它檢測到許多誤報。這可以在一定程度上進行調(diào)整,但不能完全刪除。

· 實現(xiàn)起來非常簡單。

· Haar 級聯(lián)最大的缺點是它的誤報檢測。

預(yù)訓(xùn)練的 Haar 級聯(lián)

有許多預(yù)訓(xùn)練的 haar 級聯(lián)文件使實施變得超級容易。我們也可以訓(xùn)練自己的 haar 級聯(lián),但這需要大數(shù)據(jù)進行訓(xùn)練。

OpenCV 庫在 GitHub 上管理所有流行的 haar 級聯(lián)預(yù)訓(xùn)練文件的存儲庫

這些文件可用于各種對象檢測任務(wù),例如:

· 人臉檢測

· 眼睛檢測

· 車輛檢測

· 鼻子/嘴巴檢測

· 身體檢測

· 車牌檢測

Haar 級聯(lián)將其特征存儲在一個 XML 文件中;這些文件可以直接加載到 OpenCV 中,使用 Haar 級聯(lián)進行對象檢測。

在 OpenCV 中實現(xiàn) Haar 級聯(lián)

如果你正在使用 OpenCV 提供的存儲庫中可用的任何預(yù)訓(xùn)練對象檢測,則只需下載預(yù)訓(xùn)練的 XML 文件。

在 Python 中安裝 OpenCV

可以使用 python 中的 pip 包管理器安裝 OpenCV。

!pip install opencv-python

#---OR ---

!pip install opencv-contrib-python

在 OpenCV 中加載 Haar 級聯(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)用檢測器函數(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是檢測到的對象周圍的邊界框坐標(biāo) (x,y,w,h) 的列表。

detectMultiScale中的參數(shù):

· scaleFactor:這表示對象的大小與原始圖像相比減小了多少。

· minNeighbors:此參數(shù)告訴在單個邊界框中應(yīng)該有多少個鄰居。

· minSize?:這表示我們圖像中對象的最小可能大小。如果我們的對象小于 minSize ,它將被忽略。

注意:對于對象檢測,我們必須使用gray_image, minNeighbors,scaleFactor等參數(shù)。

人臉檢測

讓我們以第一個使用預(yù)訓(xùn)練 haar 級聯(lián)的對象檢測示例為例,我們將使用 Python 從圖片中檢測人臉。

import numpy as np

import cv2

#---loading the Haar 級聯(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允許我們在傳遞坐標(biāo)后繪制矩形。

· scaleFactor = 1.3FineTuning 參數(shù),取值范圍從 1 到 2。

分級檢測

Haarcascade 支持分級檢測,這意味著 Haar 級聯(lián)能夠以分級方式檢測單個幀內(nèi)的多個對象。

假設(shè)我們必須檢測人類的面部和眼睛。要繼續(xù)執(zhí)行任務(wù),我們需要執(zhí)行以下步驟。

· 檢測人臉

· 對于每張臉,裁剪人臉并將其轉(zhuǎn)發(fā)以進行眼睛檢測

· 在找到眼睛的坐標(biāo) ( ex,ey,ew,eh) 后,在原始圖片中的眼睛周圍繪制一個邊界框。

· 在原始圖片上使用坐標(biāo)(x,y,w,h)在面部周圍繪制一個邊界框。

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()

實時實現(xiàn)人臉檢測

我們可以在 OpenCV 視頻流中使用 Haar 級聯(lián)進行對象檢測,只需要在 OpenCV 中讀取視頻或攝像頭,其余的都是一樣的。

視頻源是一系列幀,因此代碼與單個幀相同。由于其輕計算要求,Haar 級聯(lián)每秒運行良好。

我們將讀取 OpenCV 視頻攝像頭輸入以實時拍攝圖像。

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ū)⑹菍崟r的,并且每幀都會發(fā)生變化。

Haar 級聯(lián)人臉檢測的局限性

Haar 級聯(lián)對于人臉、汽車等一些對象仍然很受歡迎,這些對象很容易區(qū)分。

Haar 級聯(lián)不能用于深度目標(biāo)檢測,如谷物類型等。

Haar 級聯(lián)算法有一些限制:

· 與現(xiàn)代對象檢測器相比,精度較低。

· 高假陽性檢測。

· 需要手動調(diào)整參數(shù)。

· 為自定義對象訓(xùn)練 haar 級聯(lián)并不容易。

結(jié)論

在本文中,我們討論了 haar 級聯(lián)的工作原理以及如何在 python 中使用 OpenCV實現(xiàn) haar 級聯(lián)以進行對象檢測。我們使用預(yù)訓(xùn)練的 haar 級聯(lián)文件進行人臉檢測和眼睛檢測,然后我們實時執(zhí)行相同的操作。

我們還談到了 haar 級聯(lián)算法的局限性,為什么它仍然被廣泛使用,為什么它這么快。

· 可以使用手動參數(shù)調(diào)整來修復(fù)誤報率。

· YOLO、SSD 和其他深度學(xué)習(xí)對象檢測算法保證了更高的準確性。

· 訓(xùn)練自定義 haar 級聯(lián)既耗時又低效。

       原文標(biāo)題 : 在 python 中使用 Haar-Cascade 進行人臉檢測

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號