一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - OpenCV實現人臉識別

OpenCV實現人臉識別

2020-09-28 10:04ht-beyond Python

本文主要介紹了python使用opencv實現人臉識別的相關資料。具有很好的參考價值。下面跟著小編一起來看下吧

主要有以下步驟:

1、人臉檢測

2、人臉預處理

3、從收集的人臉訓練機器學習算法

4、人臉識別

5、收尾工作

人臉檢測算法:

基于Haar的臉部檢測器的基本思想是,對于面部正面大部分區域而言,會有眼睛所在區域應該比前額和臉頰更暗,嘴巴應該比臉頰更暗等情形。它通常執行大約20個這樣的比較來決定所檢測的對象是否為人臉,實際上經常會做上千次。

基于LBP的人臉檢測器基本思想與基于Haar的人臉檢測器類似,但它比較的是像素亮度直方圖,例如,邊緣、角落和平坦區域的直方圖。

這兩種人臉檢測器可通過訓練大的圖像集找到人臉,這些圖像集在opencv中存在XML文件中以便后續使用。

這些級聯分類檢測器通常至少需使用1000個獨特的人臉圖像和10000個非人臉圖像作為訓練,訓練時間一般LBP要幾個小時,

Haar要一個星期。

項目中的關鍵代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
initDetectors
faceCascade.load(faceCascadeFilename);
eyeCascade1.load(eyeCascadeFilename1);
eyeCascade2.load(eyeCascadeFilename2);
 
initWebcam
videoCapture.open(cameraNumber);
 
cvtColor(img, gray, CV_BGR2GRAY);
//有需要則縮小圖片使檢測運行更快,之后要恢復原來大小
resize(gray, inputImg, Size(scaledWidth, scaledHeight));
equalizeHist(inputImg, equalizedImg);
cascade.detectMultiScale(equalizedImg......);

人臉預處理:

實際中通常訓練(采集圖像)和測試(來自攝像機圖像)的圖像會有很大不同,受(如光照、人臉方位、表情等),

結果會很差,因此用于訓練的數據集很重要。

人臉預處理目的是減少這類問題,有助于提高整個人臉識別系統的可靠性。

人臉預處理的最簡單形式就是使用equalizeHist()函數做直方圖均衡,這與人臉檢測那步一樣。

實際中,為了讓檢測算法更可靠,會使用面部特征檢測(如,檢測眼睛、鼻子、嘴巴和眉毛),本項目只使用眼睛檢測。

使用OpenCV自帶的訓練好的眼部探測器。如,正面人臉檢測完畢后,得到一個人臉,在使用眼睛檢測器提取人臉的左眼區域和右眼區域,并對每個眼部區域進行直方圖均衡。

這步涉及的操作有以下內容:

1、幾何變換和裁剪

人臉對齊很重要,旋轉人臉使眼睛保持水平,縮放人臉使眼睛之間距離始終相同,平移人臉使眼睛總是在所需高度上水平居中,

裁剪人臉外圍(如圖像背景、頭發、額頭、耳朵和下巴)。

2、對人臉左側和右側分別用直方圖均衡

3、平滑

用雙邊濾波器來減少圖像噪聲

4、橢圓掩碼

將剩余頭發和人臉圖像背景去掉

項目中的關鍵代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
detectBothEyes(const Mat &face, CascadeClassifier &eyeCascade1, CascadeClassifier &eyeCascade2,
Point &leftEye, Point &rightEye, Rect *searchedLeftEye, Rect *searchedRightEye);
topLeftOfFace = face(Rect(leftX, topY, widthX, heightY));
//在左臉區域內檢測左眼
detectLargestObject(topLeftOfFace, eyeCascade1, leftEyeRect, topLeftOfFace.cols);
//右眼類似,這樣眼睛中心點就得到了
leftEye = Point(leftEyeRect.x + leftEyeRect.width/2, leftEyeRect.y + leftEyeRect.height/2);
//再得到兩眼的中點,然后計算兩眼之間的角度
Point2f eyesCenter = Point2f( (leftEye.x + rightEye.x) * 0.5f, (leftEye.y + rightEye.y) * 0.5f );
//仿射扭曲(Affine Warping)需要一個仿射矩陣
rot_mat = getRotationMatrix2D(eyesCenter, angle, scale);
//現在可變換人臉來得到檢測到的雙眼出現在人臉的所需位置
warpAffine(gray, warped, rot_mat, warped.size());
 
//先對人臉左側和右側分開進行直方圖均衡
equalizeHist(leftSide, leftSide);
equalizeHist(rightSide, rightSide);
//再合并,這里合并時左側1/4和右側1/4直接取像素值,中間的2/4區域像素值通過一定計算進行處理。
 
//雙邊濾波
bilateralFilter(warped, filtered, 0, 20.0, 2.0);
 
//采用橢圓掩碼來刪除一些區域
filtered.copyTo(dstImg, mask);

收集并訓練人臉:

一個好的數據集應包含人臉變換的各種情形,這些變化可能出現在訓練集中。如只測試正面人臉,則只需訓練圖像有完全正面人臉即可。

因此一個好的訓練集應包含很多實際情形。

本項目收集的圖像之間至少有一秒的間隔,使用基于L2范數的相對錯誤評價標準來比較兩幅圖像素之間的相似性。

?
1
2
errorL2 = norm(A, B, CV_L2);
similarity = errorL2 / (double)(A.rows * A.cols);

再與收集新人臉的閾值相比來決定是否收集這次圖像。

可用很多技巧來獲取更多的訓練數據,如,使用鏡像人臉、加入隨機噪聲、改變人臉圖像的一些像素、旋轉等。

?
1
2
//翻轉
flip(preprocessedFace, mirroredFace, 1);

對每個人收集到足夠多的人臉圖像后,接下來必須選擇適合人臉識別的機器學習算法,通過它來學習收集的數據,從而訓練出一個人臉識別系統。

人臉識別算法:

1、特征臉,也稱PCA(主成分分析)

2、Fisher臉,也稱LDA(線性判別分析)

3、局部二值模式直方圖(Local Binary Pattern Histograms,LBPH)

其他人臉識別算法:www.face-rec.org/algorithms/

OpenCV提供了CV::Algorithm類,該類有幾種不同的算法,用其中一種算法就可以完成簡單而通用的人臉識別。

OpenCV的contrib模板中有一個FaceRecognizer類,它實現以上這些人臉識別算法。

?
1
2
3
4
initModule_contrib();
model = Algorithm::create<FaceRecognizer>(facerecAlgorithm);
 
model->train(preprocessedFaces, faceLabels);

這一代碼將執行所選人臉識別的整個訓練算法。

人臉識別:

1、人臉識別:通過人臉來識別這個人

可以簡單調用FaceRecognizer::predict()函數來識別照片中的人,

int identity = model->predict(preprocessedFace);

它帶來的問題是它總能預測給定的人(即使輸入圖像不屬于訓練集中的人)。

解決此問題的辦法是制定置信度標準,置信度過低則可判讀是一個不認識的人。

2、人臉驗證:驗證圖像中是否有想找的人

為了驗證是否可靠,或者說系統是否能對一個不認識的人進行正確識別,這需要進行人臉驗證。

這里計算置信度的方法是:

使用特征向量和特征值重構人臉圖,然后將輸入的圖像與重構圖進行比較。如果一個人在訓練集中有多張人臉圖,用特征向量和特征

值重構后應該有非常好的效果,如果沒有則差別很大,表明它可能是一個未知的人臉。

subspaceProject()函數將人臉圖像映射到特征空間,再用subspaceReconstruct()函數從特征空間重構圖像。

收尾:交互式GUI

利用OpenCV函數很容易繪制一些組件,鼠標點擊等。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!

原文鏈接:http://www.cnblogs.com/ht-beyond/p/5188234.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人久久精品一区二区三区 | 成人免费播放器 | 四川一级毛片 | 亚洲国产中文字幕在线视频综合 | 99视频精品国在线视频艾草 | 欧美日韩国产精品自在自线 | 岛国虐乳紧缚媚药调教 | 国产小视频在线播放 | 免费特黄一区二区三区视频一 | 特黄特色大片免费视频播放 | 日韩有码 | 本站只有精品 | 国产精品久久久99 | 四虎成人免费 | 好 舒服 好 粗 好硬 好爽 | 1024国产精品视频观看 | 国产精品欧美亚洲韩国日本99 | 久久国产精品免费网站 | 人与禽交3d动漫羞羞动漫 | 狠狠色狠狠色综合曰曰 | 亚洲第一综合天堂另类专 | 成人精品区 | 图片专区小说专区卡通动漫 | 久见久热 这里只有精品 | 欧美日韩高清完整版在线观看免费 | 亚洲精品综合一二三区在线 | 2020韩国三级理论在线观看 | 日产中文乱码卡一卡二 | 奇米影视在线观看 | 91国内在线国内在线播放 | 亚洲不卡高清免v无码屋 | 无码国产成人午夜在线观看不卡 | 国产重口老太伦 | 92福利网| 干操网 | haodiaose在线精品免费视频 | 国产欧美一区二区三区久久 | 俺去啦最新地址 | 韩国免费视频 | 国产亚洲精品高清在线 | 亚洲福利天堂 |