1 人臉檢測(cè)介紹
1.1 什么是人臉檢測(cè)
人臉檢測(cè)的目標(biāo)是確定圖像或視頻中是否存在人臉。如果存在多個(gè)面,則每個(gè)面都被一個(gè)邊界框包圍,因此我們知道這些面的位置。
人臉檢測(cè)算法的主要目標(biāo)是準(zhǔn)確有效地確定圖像或視頻中人臉的存在和位置。這些算法分析數(shù)據(jù)的視覺(jué)內(nèi)容,搜索與面部特征相對(duì)應(yīng)的模式和特征。通過(guò)采用機(jī)器學(xué)習(xí)、圖像處理和模式識(shí)別等各種技術(shù),人臉檢測(cè)算法旨在將人臉與視覺(jué)數(shù)據(jù)中的其他對(duì)象或背景元素區(qū)分開(kāi)來(lái)。
人臉很難建模,因?yàn)橛性S多變量可以改變,例如面部表情、方向、照明條件以及太陽(yáng)鏡、圍巾、口罩等部分遮擋。檢測(cè)結(jié)果給出了面部位置參數(shù),并且可以要求有多種形式,例如覆蓋面部中央部分、眼睛中心或包括眼睛、鼻子和嘴角、眉毛、鼻孔等的標(biāo)志的矩形。
1.2 常用的人臉檢測(cè)算法
在人們?nèi)粘I钪?,最常?jiàn)的生物識(shí)別方式一定是人臉識(shí)別,身份驗(yàn)證、門禁、監(jiān)控等都需要用上人臉識(shí)別。對(duì)于數(shù)據(jù)結(jié)構(gòu)工程師和算法工程師來(lái)說(shuō),人臉識(shí)別算法是需要接觸的常見(jiàn)算法之一。那本文列舉了七種最常見(jiàn)的人臉識(shí)別算法。
- 卷積神經(jīng)網(wǎng)絡(luò)(CNN)
卷積神經(jīng)網(wǎng)絡(luò)(CNN)是一類包含卷積計(jì)算且具有深度結(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡(luò),也是人工神經(jīng)網(wǎng)絡(luò)和人工智能的常見(jiàn)算法之一,隸屬于機(jī)器學(xué)習(xí)中的深度學(xué)習(xí)。它的原理是:模型學(xué)習(xí)直接對(duì)圖像、視頻、文本或聲音執(zhí)行分類結(jié)果。它常用于計(jì)算機(jī)視覺(jué)、自然語(yǔ)言處理和最大的圖像分類數(shù)據(jù)集。
- 特征臉(Eigenface)
特征臉(Eigenface)是指用于機(jī)器視覺(jué)領(lǐng)域中的人臉識(shí)別問(wèn)題的一組特征向量,用于確定圖像數(shù)據(jù)集中的人臉?lè)讲?,被認(rèn)為是第一種有效的人臉識(shí)別方法。原理是通過(guò)機(jī)器學(xué)習(xí)對(duì)人臉進(jìn)行編碼解碼。一組特征臉是通過(guò)對(duì)大量人臉圖像的統(tǒng)計(jì)分析確定的“標(biāo)準(zhǔn)化人臉成分”的集合,注意這種算法不使用數(shù)字圖片,而是通過(guò)統(tǒng)計(jì)數(shù)據(jù)庫(kù),面部特征被分配數(shù)字值,人臉是這些值以不同百分比的組合。
- Fisherfaces
Fisherfaces是最流行的人臉識(shí)別算法之一,是特征臉(Eigenface)算法的延伸品,在訓(xùn)練過(guò)程中的類別區(qū)分方面比特征臉更加優(yōu)秀。Fisherfaces的優(yōu)點(diǎn)在于它能夠?qū)庹蘸兔娌勘砬樽兓M(jìn)行內(nèi)插和外推。若在與處理階段與PCA方法結(jié)合,算法準(zhǔn)確度高達(dá)93%。
- 內(nèi)核方法:PCA和SVM
主成分分析(PCA)是一種有用的通用統(tǒng)計(jì)方法,在人臉識(shí)別過(guò)程中,PCA能減少源數(shù)據(jù)同時(shí)保留最相關(guān)的信息,原理是:生成一組加權(quán)特征向量,這些特征向量依次構(gòu)建特征臉(大量不同的人臉圖像),而這些人臉圖像的線性組合代表訓(xùn)練集中的每個(gè)圖像,PCA作用是從訓(xùn)練圖像集的協(xié)方差矩陣中接收這些特征向量。
支持向量機(jī)(SVM)屬于機(jī)器學(xué)習(xí)算法,它使用兩組分類原則來(lái)區(qū)分人臉和非人臉,對(duì)于每個(gè)類別,SVM模型將接收一個(gè)標(biāo)記的訓(xùn)練數(shù)據(jù)集來(lái)對(duì)新的測(cè)試數(shù)據(jù)進(jìn)行分類。
- Haar Cascade
Haar Cascade是一種用于在圖像上定位對(duì)象的對(duì)象檢測(cè)方法,他將從大量正樣本和負(fù)樣本中學(xué)習(xí),前者包括感興趣的對(duì)象,后者包括除你要查找對(duì)象之外的任何內(nèi)容。訓(xùn)練后,分類器可在新圖像上找到感興趣的對(duì)象。Haar Cascade常與局部二值模式算法結(jié)合用于刑事鑒定的人臉識(shí)別。
- 三維識(shí)別
3D人臉識(shí)別的基本原理是人類頭骨的獨(dú)特結(jié)構(gòu),人的頭骨結(jié)構(gòu)具有獨(dú)特性,可用幾十個(gè)參數(shù)來(lái)描述,它的原理是將3D面部掃描與數(shù)據(jù)庫(kù)模式進(jìn)行比較,它最大的優(yōu)勢(shì)是不會(huì)因?yàn)榛瘖y、面部毛發(fā)等外界因素影響到檢測(cè)識(shí)別。
- 皮膚紋理分析
皮膚紋理識(shí)別通常使用高分辨率圖像。皮膚紋理分析的特殊情況使用不同的獨(dú)特參數(shù),如痣、膚色、膚色等,常用于人臉檢測(cè)、不良圖像過(guò)濾、手勢(shì)分析等。
1.3 Haar級(jí)聯(lián)分類器
人臉檢測(cè)是計(jì)算機(jī)視覺(jué)中的一個(gè)重要任務(wù),在現(xiàn)實(shí)生活中有著廣泛的應(yīng)用價(jià)值。Haar級(jí)聯(lián)分類器是OpenCV中實(shí)現(xiàn)人臉檢測(cè)其中一種算法,它通過(guò)分析相鄰圖像區(qū)域之間的對(duì)比度,確定給定圖像或子圖像是否與已知類型匹配。我們來(lái)考慮如何在層次結(jié)構(gòu)中組合多個(gè)Haar級(jí)聯(lián)分類器,以便用一個(gè)分類器識(shí)別父區(qū)域(就目標(biāo)而言是一張人臉),用其他分類器識(shí)別子區(qū)域(比如眼睛)。在OpenCV源代碼的副本中會(huì)有一個(gè)文件data/haarcascades。該文件夾包含了所有OpenCV的人臉檢測(cè)的XML文件,這些文件可用于檢測(cè)靜止圖像、視頻和攝像頭所得到圖像中的人臉。
從文件名可知這些級(jí)聯(lián)是用于人臉、眼睛、鼻子和嘴的跟蹤。這些文件需要正面、直立的人臉圖像。創(chuàng)建人臉檢測(cè)器時(shí)會(huì)使用這些文件,創(chuàng)建自己的級(jí)聯(lián),并訓(xùn)練這些級(jí)聯(lián)來(lái)檢測(cè)各種對(duì)象。
代碼地址:https://github.com/opencv/opencv/tree/4.x/data/haarcascades
2 使用opencv進(jìn)行人臉檢測(cè)
在靜態(tài)圖像或視頻中檢測(cè)人臉的操作非常相似。視頻人臉檢測(cè)只是從攝像頭讀出每幀圖像,然后采用靜態(tài)圖像中的人臉檢測(cè)方法進(jìn)行檢測(cè)。當(dāng)然,視頻人臉檢測(cè)還涉及其他的概念,例如跟蹤,而靜態(tài)圖像中的人臉檢測(cè)就沒(méi)有這樣的概念,但它們的基本理論是一致的。
2.1 靜態(tài)圖像人臉檢測(cè)
檢測(cè)步驟為讀取靜態(tài)圖像,調(diào)用模型進(jìn)行檢測(cè)。
在OpenCV中,人臉檢測(cè)使用的是cv2.CascadeClassifier.detectMultiScale()函數(shù),它可以檢測(cè)出圖片中所有的人臉。
cv2.detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)
參數(shù):
image: 輸入圖像, 灰度圖;
scaleFactor: 圖像尺寸縮小比例, 決定兩個(gè)不同大小的窗口掃描之間有多大的跳躍;
minNeighbors: 被檢測(cè)到幾次才算目標(biāo);
minSize: 目標(biāo)最小尺寸;
maxSize: 目標(biāo)最大尺寸;
人臉檢測(cè)代碼:
import cv2
image = cv2.imread('../data/girl01.jpg')
# 獲取XML文件,加載人臉檢測(cè)器
faceCascade = cv2.CascadeClassifier('../data/haarcascade_frontalface_default.xml')
# 色彩轉(zhuǎn)換,轉(zhuǎn)換為灰度圖像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 調(diào)用函數(shù)detectMultiScale
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.15, minNeighbors=5, minSize=(5, 5))
print(faces)
print("發(fā)現(xiàn){0}個(gè)人臉!".format(len(faces)))
# 逐個(gè)標(biāo)注人臉
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+w), (0, 255, 0), 2)
cv2.imshow("face", image)
cv2.imwrite("../data/detect_result.jpg", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
檢測(cè)結(jié)果如下:
[[242 115 159 159]]
發(fā)現(xiàn)1個(gè)人臉!
?
2.2 視頻人臉檢測(cè)
檢測(cè)步驟為讀取視頻的每一幀圖像,對(duì)每一幀圖像逐一進(jìn)行人臉檢測(cè)
import cv2
# 1.讀取視頻
cv2.namedWindow("CaptureFace")
cap = cv2.VideoCapture('../data/girl.mp4')
# 2.人臉識(shí)別器分類器
classfier = cv2.CascadeClassifier('../data/haarcascade_frontalface_alt2.xml')
color = (0, 255, 0)
while cap.isOpened():
flag, frame = cap.read()
frame = cv2.flip(frame, 1) # 鏡像操作
if not flag:
break
# 3.灰度轉(zhuǎn)換
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 4.人臉檢測(cè),1.2和2分別為圖片縮放比例和需要檢測(cè)的有效點(diǎn)數(shù)
facerects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(facerects) > 0: # 大于0則檢測(cè)到人臉
for faceRect in facerects: # 單獨(dú)框出每一張人臉
x, y, w, h = faceRect
# 5.畫圖
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 3)
cv2.imshow("CaptureFace", frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
運(yùn)行結(jié)果顯示如下:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-861776.html
2.3 攝像頭人臉檢測(cè)
檢測(cè)步驟為打開(kāi)攝像頭,捕獲攝像頭的每一幀數(shù)據(jù),針對(duì)每一幀數(shù)據(jù)進(jìn)行檢測(cè)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-861776.html
import cv2
# 1.調(diào)用攝像頭
cv2.namedWindow("CaptureFace")
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
# 2.人臉識(shí)別器分類器
classfier = cv2.CascadeClassifier('../data/haarcascade_frontalface_alt2.xml')
color = (0, 255, 0)
while cap.isOpened():
flag, frame = cap.read()
frame = cv2.flip(frame, 1) # 鏡像操作
if not flag:
break
# 3.灰度轉(zhuǎn)換
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 4.人臉檢測(cè),1.2和2分別為圖片縮放比例和需要檢測(cè)的有效點(diǎn)數(shù)
facerects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(facerects) > 0: # 大于0則檢測(cè)到人臉
print('檢測(cè)到人臉')
for faceRect in facerects: # 單獨(dú)框出每一張人臉
x, y, w, h = faceRect
# 5.畫圖
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 3)
cv2.imshow("CaptureFace", frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
檢測(cè)到人臉
檢測(cè)到人臉
檢測(cè)到人臉
檢測(cè)到人臉
檢測(cè)到人臉
檢測(cè)到人臉
到了這里,關(guān)于使用opencv實(shí)現(xiàn)人臉檢測(cè):Haar級(jí)聯(lián)分類器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!