人臉識(shí)別是指程序?qū)斎氲娜四槇D像進(jìn)行判斷,并識(shí)別出其對(duì)應(yīng)的人的過程。人臉識(shí)別程 序像我們?nèi)祟愐粯?,“看到”一張人臉后就能夠分辨出這個(gè)人是家人、朋友還是明星。
當(dāng)然,要實(shí)現(xiàn)人臉識(shí)別,首先要判斷當(dāng)前圖像內(nèi)是否出現(xiàn)了人臉,也即人臉檢測(cè)。只有檢 測(cè)到圖像中出現(xiàn)了人臉,才能根據(jù)人臉判斷這個(gè)人到底是誰。
人臉檢測(cè)
當(dāng)我們預(yù)測(cè)的是離散值時(shí),進(jìn)行的是“分類”。例如,預(yù)測(cè)一個(gè)孩子能否成為一名優(yōu)秀的運(yùn)動(dòng)員,其實(shí)就是看他是被劃分為“好苗子”還是“普通孩子”的分類。對(duì)于只涉及兩個(gè)類別的“二分類”任務(wù),我們通常將其中一個(gè)類稱為“正類”(正樣本),另一個(gè)類稱為“負(fù)類”(反類、負(fù)樣本)。
例如,在人臉檢測(cè)中,主要任務(wù)是構(gòu)造能夠區(qū)分包含人臉實(shí)例和不包含人臉實(shí)例的分類器。這些實(shí)例被稱為“正類”(包含人臉圖像)和“負(fù)類”(不包含人臉圖像)。
本節(jié)介紹分類器的基本構(gòu)造方法,以及如何調(diào)用OpenCV中訓(xùn)練好的分類器實(shí)現(xiàn)人臉檢測(cè)。
基本原理
OpenCV 提供了三種不同的訓(xùn)練好的級(jí)聯(lián)分類器,下面簡(jiǎn)單介紹其中涉及的一些概念。
- 級(jí)聯(lián)分類器
通常情況下,分類器需要對(duì)多個(gè)圖像特征進(jìn)行識(shí)別。例如,識(shí)別一個(gè)動(dòng)物到底是狗(正類)還是其他動(dòng)物(負(fù)類),我們可能需要根據(jù)多個(gè)條件進(jìn)行判斷,這樣比較下來是非常煩瑣的。
但是,如果首先就比較它們有幾條腿:
- 有“四條腿”的動(dòng)物被判斷為“可能為狗”,并對(duì)此范圍內(nèi)的對(duì)象繼續(xù)進(jìn)行分析和判斷。
- 沒有“四條腿”的動(dòng)物直接被否決,即不可能為狗。
這樣,僅僅比較腿的數(shù)目,根據(jù)這個(gè)特征就能排除樣本集中大量的負(fù)類(例如雞、鴨、鵝等不是狗的其他動(dòng)物實(shí)例)。級(jí)聯(lián)分類器就是基于這種思路,將多個(gè)簡(jiǎn)單的分類器按照一定的順序級(jí)聯(lián)而成的。
級(jí)聯(lián)分類器的基本原理如圖 23-1 所示。
級(jí)聯(lián)分類器的優(yōu)勢(shì)是,在開始階段僅進(jìn)行非常簡(jiǎn)單的判斷,就能夠排除明顯不符合要求的實(shí)例。在開始階段被排除的負(fù)類,不再參與后續(xù)分類,這樣能極大地提高后面分類的速度。這有點(diǎn)像我們經(jīng)常收到的騙子短信,大多數(shù)人通常一眼就能識(shí)別出這些短信是騙人的,也不可能上當(dāng)受騙。騙子們隨機(jī)大量發(fā)送大多數(shù)人明顯不會(huì)上當(dāng)受騙的短信,這種做法雖然看起來非常蠢,但總還是會(huì)有人上當(dāng)。這些短信,在最開始的階段經(jīng)過簡(jiǎn)單的篩選過濾就能夠?qū)⑼耆豢赡苌袭?dāng)?shù)娜伺懦谕?。不回?fù)短信的人,是不可能上當(dāng)?shù)?;而回?fù)短信的人,才是目標(biāo)人群。
這樣,騙子輕易地就識(shí)別并找到了目標(biāo)人群,能夠更專注地“服務(wù)”于他們的“最終目標(biāo)人群”(不斷地進(jìn)行短信互動(dòng)),從而有效地避免了與“非目標(biāo)人群”(不回復(fù)短信的人群)發(fā)生進(jìn)一
步的接觸而“浪費(fèi)”時(shí)間和精力。
OpenCV 提供了用于訓(xùn)練級(jí)聯(lián)分類器的工具,也提供了訓(xùn)練好的用于人臉定位的級(jí)聯(lián)分類器,都可以作為現(xiàn)成的資源使用。
-
Haar級(jí)聯(lián)分類器
OpenCV 提供了已經(jīng)訓(xùn)練好的 Haar 級(jí)聯(lián)分類器用于人臉定位。Haar 級(jí)聯(lián)分類器的實(shí)現(xiàn),經(jīng)過了以下漫長(zhǎng)的歷史:
-
首先,有學(xué)者提出了使用 Haar 特征用于人臉檢測(cè),但是此時(shí) Haar 特征的運(yùn)算量超級(jí)大,這個(gè)方案并不實(shí)用。
-
接下來,有學(xué)者提出了簡(jiǎn)化 Haar 特征的方法,讓使用 Haar 特征檢測(cè)人臉的運(yùn)算變得簡(jiǎn)單易行,同時(shí)提出了使用級(jí)聯(lián)分類器提高分類效率。
-
后來,又有學(xué)者提出用于改進(jìn) Haar 的類 Haar 方案,為人臉定義了更多特征,進(jìn)一步提高了人臉檢測(cè)的效率。
下面用一個(gè)簡(jiǎn)單的例子來敘述上述方案。假設(shè)有兩幅 4×4 大小的圖像,如圖 23-2 所示。
針對(duì)這兩幅圖像,我們可以通過簡(jiǎn)單的計(jì)算來判斷它們?cè)谧笥谊P(guān)系這個(gè)維度是否具有相關(guān)性。
’用兩幅圖像左側(cè)像素值之和減去右側(cè)像素值之和:
- 針對(duì)左圖,sum(左側(cè)像素) - sum(右側(cè)像素) = (128+96) - (108+76) = 40
- 針對(duì)右圖,sum(左側(cè)像素) - sum(右側(cè)像素) = (47+88) - (27+68) = 40
這兩幅圖像中,“左側(cè)像素值之和”減去“右側(cè)像素值之和”都是 40。所以,可以認(rèn)為在“左側(cè)像素值之和”減去“右側(cè)像素值之和”這個(gè)角度,這兩幅圖像具有一定的相關(guān)性。
進(jìn)一步擴(kuò)展,我們可以從更多的角度考慮圖像的特征。學(xué)者 Papageorgiou 等人提出了如圖23-3 所示的 Haar 特征,這些特征包含垂直特征、水平特征和對(duì)角特征。他們利用這些特征分
別實(shí)現(xiàn)了行人檢測(cè)(Pedestrian Detection Using Wavelet Templates)和人臉檢測(cè)(A GeneralFramework For Object Detection)。
Haar 特征反映的是圖像的灰度變化,它將像素劃分為模塊后求差值。Haar 特征用黑白兩種矩形框組合成特征模板,在特征模板內(nèi),用白色矩形像素塊的像素和減去黑色矩形像素塊的像素和來表示該模板的特征。
經(jīng)過上述處理后,人臉部的一些特征就可以使用矩形框的差值簡(jiǎn)單地表示了。比如,眼睛的顏色比臉頰的顏色要深,鼻梁兩側(cè)的顏色比鼻梁的顏色深,唇部的顏色比唇部周圍的顏色深。
關(guān)于 Harr 特征中的矩形框,有如下 3 個(gè)變量。
- 矩形位置:矩形框要逐像素地劃過(遍歷)整個(gè)圖像獲取每個(gè)位置的差值。
- 矩形大?。壕匦蔚拇笮】梢愿鶕?jù)需要做任意調(diào)整。
- 矩形類型:包含垂直、水平、對(duì)角等不同類型。
上述 3 個(gè)變量保證了能夠細(xì)致全面地獲取圖像的特征信息。但是,變量的個(gè)數(shù)越多,特征的數(shù)量也會(huì)越多。
例如,僅一個(gè) 24×24 大小的檢測(cè)窗口內(nèi)的特征數(shù)量就接近 20 萬個(gè)。由于計(jì)算量過大,該方案并不實(shí)用,除非有人提出能夠簡(jiǎn)化特征的方案。
后來,Viola 和 Jones 兩位學(xué)者在論文 Rapid Object Detection Using A Boosted Cascade OfSimple Features 和 Robust Real-time Face Detection 中提出了使用積分圖像快速計(jì)算 Haar 特征的方法。他們提出通過構(gòu)造“積分圖(Integral Image)”,讓 Haar 特征能夠通過查表法和有限次簡(jiǎn)單運(yùn)算快速獲取,極大地減少了運(yùn)算量。同時(shí),在這兩篇文章中,他們提出了通過構(gòu)造級(jí)聯(lián)分類器讓不符合條件的背景圖像(負(fù)樣本)被快速地拋棄,從而能夠?qū)⑺懔\(yùn)用在可能包含人臉的對(duì)象上。
為了進(jìn)一步提高效率,Lienhart 和 Maydt 兩位學(xué)者,在論文 An Extended Set Of Haar-LikeFeatures For Rapid Object Detection 中提出對(duì) Haar 特征庫進(jìn)行擴(kuò)展。他們將 Haar 特征進(jìn)一步劃分為如圖 23-4 所示的 4 類:
- 4 個(gè)邊特征。
- 8 個(gè)線特征。
- 2 個(gè)中心點(diǎn)特征。
- 1 個(gè)對(duì)角特征。
Lienhart 和 Maydt 兩位學(xué)者認(rèn)為在實(shí)際使用中,對(duì)角特征(見圖 23-4 底部)和線特征中的“e”和“g”(見圖 23-4 的第 2 行,(e)圖和(g)圖)是相近的,因此通常情況下無須重復(fù)計(jì)算。
同時(shí),該論文還給出了計(jì)算 Haar 特征數(shù)的方法、快速計(jì)算方法,以及級(jí)聯(lián)分類器的構(gòu)造方法等內(nèi)容。
OpenCV 在上述研究的基礎(chǔ)上,實(shí)現(xiàn)了將 Haar 級(jí)聯(lián)分類器用于人臉部特征的定位。我們可以直接調(diào)用 OpenCV 自帶的 Haar 級(jí)聯(lián)特征分類器來實(shí)現(xiàn)人臉定位。
級(jí)聯(lián)分類器的使用
在 OpenCV
1.邊特征
2.線特征
3.中心點(diǎn)特征
4.對(duì)角特征中,有一些訓(xùn)練好的級(jí)聯(lián)分類器供用戶使用。這些分類器可以用來檢測(cè)人臉、臉部特征(眼睛、
鼻子)、人類和其他物體。這些級(jí)聯(lián)分類器以 XML 文件的形式存放在 OpenCV 源文件的 data 目錄下,加載不同級(jí)聯(lián)分類器的 XML 文件就可以實(shí)現(xiàn)對(duì)不同對(duì)象的檢測(cè)。
下載地址
https://github.com/opencv/opencv/tree/4.x/data/haarcascades
OpenCV 自帶的級(jí)聯(lián)分類器存儲(chǔ)在 OpenCV 根文件夾的 data 文件夾下。該文件夾包含三個(gè)子文件夾:haarcascades、hogcascades、lbpcascades,里面分別存儲(chǔ)的是 Harr 級(jí)聯(lián)分類器、HOG級(jí)聯(lián)分類器、LBP 級(jí)聯(lián)分類器。
其中,Harr 級(jí)聯(lián)分類器多達(dá) 20 多種(隨著版本更新還會(huì)繼續(xù)增加),提供了對(duì)多種對(duì)象的檢測(cè)功能。部分級(jí)聯(lián)分類器如表 23-1 所示。
加載級(jí)聯(lián)分類器的語法格式為:
<CascadeClassifier object> = cv2.CascadeClassifier( filename )
式中,filename 是分類器的路徑和名稱。
下面的代碼是一個(gè)調(diào)用實(shí)例:
faceCascade =
cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
使用級(jí)聯(lián)分類器時(shí)需要注意:如果你是通過在anaconda中使用pip的方式安裝的OpenCV,則無法直接獲取級(jí)聯(lián)分類器的 XML 文件??梢酝ㄟ^以下兩種方式獲取需要的級(jí)聯(lián)分類器 XML
文件:
- 安裝 OpenCV 后,在其安裝目錄下的 data 文件夾內(nèi)查找 XML 文件。
- 直接在網(wǎng)絡(luò)上找到相應(yīng) XML 文件,下載并使用。
同樣,如果使用 opencv_createsamples.exe 和 opencv_traincascade.exe,也需要采用上述方式獲取 XML 文件。
cv2.CascadeClassifier.detectMultiScale() 函數(shù)介紹
在 OpenCV 中,人臉檢測(cè)使用的是 cv2.CascadeClassifier.detectMultiScale()函數(shù),它可以檢
測(cè)出圖片中所有的人臉。該函數(shù)由分類器對(duì)象調(diào)用,其語法格式為:
objects = cv2.CascadeClassifier.detectMultiScale( image[,
scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]] )
式中各個(gè)參數(shù)及返回值的含義為:
- image:待檢測(cè)圖像,通常為灰度圖像。
- scaleFactor:表示在前后兩次相繼的掃描中,搜索窗口的縮放比例。
- minNeighbors:表示構(gòu)成檢測(cè)目標(biāo)的相鄰矩形的最小個(gè)數(shù)。默認(rèn)情況下,該值為 3,意味著有 3 個(gè)以上的檢測(cè)標(biāo)記存在時(shí),才認(rèn)為人臉存在。如果希望提高檢測(cè)的準(zhǔn)確率,可以將該值設(shè)置得更大,但同時(shí)可能會(huì)讓一些人臉無法被檢測(cè)到。
- flags:該參數(shù)通常被省略。在使用低版本 OpenCV(OpenCV 1.X 版本)時(shí),它可能會(huì)被設(shè)置為 CV_HAAR_DO_CANNY_PRUNING,表示使用 Canny 邊緣檢測(cè)器來拒絕一些區(qū)域。
- minSize:目標(biāo)的最小尺寸,小于這個(gè)尺寸的目標(biāo)將被忽略。
- maxSize:目標(biāo)的最大尺寸,大于這個(gè)尺寸的目標(biāo)將被忽略。
- objects:返回值,目標(biāo)對(duì)象的矩形框向量組。
示例:使用函數(shù) cv2.CascadeClassifier.detectMultiScale()檢測(cè)一幅圖像內(nèi)的人臉
原圖:
import cv2
# 讀取待檢測(cè)的圖像
image = cv2.imread('face\\face3.jpg')
# 獲取 XML 文件,加載人臉檢測(cè)器
faceCascade = cv2.CascadeClassifier('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)
# 打印輸出的測(cè)試結(jié)果
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) #矩形標(biāo)注
# 顯示結(jié)果
cv2.imshow("dect",image)
# 保存檢測(cè)結(jié)果
cv2.imwrite("re.jpg",image)
cv2.waitKey(0)
運(yùn)行結(jié)果:文章來源:http://www.zghlxwxcb.cn/news/detail-697270.html
同時(shí),在控制臺(tái)會(huì)顯示檢測(cè)到的人臉的具體位置信息及個(gè)數(shù),具體結(jié)果如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-697270.html
[[129 59 61 61]
[ 35 76 62 62]
[565 65 61 61]
[443 62 71 71]
[290 13 77 77]]
發(fā)現(xiàn) 5 個(gè)人臉!
到了這里,關(guān)于opencv 進(jìn)階10-人臉識(shí)別原理說明及示例-cv2.CascadeClassifier.detectMultiScale()的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!