openCV人臉識(shí)別

在之前講到的人臉測(cè)試后聚请,提取出人臉來(lái),并且保存下來(lái)涩搓,以供訓(xùn)練或識(shí)別是用拇派,提取人臉的代碼如下:

[html]view plaincopy

print?

void?GetImageRect(IplImage*?orgImage,?CvRect?rectInImage,?IplImage*?imgRect,double?scale)

{

//從圖像orgImage中提取一塊(rectInImage)子圖像imgRect

IplImage?*result=imgRect;

CvRect?size;

size.x=rectInImage.x*scale;

size.y=rectInImage.y*scale;

size.width=rectInImage.width*scale;

size.height=rectInImage.height*scale;

//result=cvCreateImage(?size,?orgImage->depth,?orgImage->nChannels?);

//從圖像中提取子圖像

cvSetImageROI(orgImage,size);

cvCopy(orgImage,result);

cvResetImageROI(orgImage);

}

[html]view plaincopy

print?

void?GetImageRect(IplImage*?orgImage,?CvRect?rectInImage,?IplImage*?imgRect,double?scale)

{

//從圖像orgImage中提取一塊(rectInImage)子圖像imgRect

IplImage?*result=imgRect;

CvRect?size;

size.x=rectInImage.x*scale;

size.y=rectInImage.y*scale;

size.width=rectInImage.width*scale;

size.height=rectInImage.height*scale;

//result=cvCreateImage(?size,?orgImage->depth,?orgImage->nChannels?);

//從圖像中提取子圖像

cvSetImageROI(orgImage,size);

cvCopy(orgImage,result);

cvResetImageROI(orgImage);

}

人臉預(yù)處理

現(xiàn)在你已經(jīng)得到一張人臉,你可以使用那張人臉圖片進(jìn)行人臉識(shí)別途戒。然而坑傅,假如你嘗試這樣簡(jiǎn)單地從一張普通圖片直接進(jìn)行人臉識(shí)別的話(huà),你將會(huì)至少損失10%的準(zhǔn)確率喷斋!

在一個(gè)人臉識(shí)別系統(tǒng)中唁毒,應(yīng)用多種預(yù)處理技術(shù)對(duì)將要識(shí)別的圖片進(jìn)行標(biāo)準(zhǔn)化處理是極其重要的。多數(shù)人臉識(shí)別算法對(duì)光照條件十分敏感星爪,所以假如在暗室訓(xùn)練浆西,在明亮的房間就可能不會(huì)被識(shí)別出來(lái)等等。這個(gè)問(wèn)題可歸于“l(fā)umination dependent”顽腾,并且還有其它很多例子近零,比如臉部也應(yīng)當(dāng)在圖片的一個(gè)十分固定的位置(比如眼睛位置為相同的像素坐標(biāo)),固定的大小,旋轉(zhuǎn)角度久信,頭發(fā)和裝飾猪瞬,表情(笑,怒等)入篮,光照方向(向左或向上等),這就是在進(jìn)行人臉識(shí)別前幌甘,使用好的圖片預(yù)處理過(guò)濾器十分重要的原因潮售。你還應(yīng)該做一些其它事情,比如去除臉部周?chē)亩嘤嘞袼兀ㄈ缬脵E圓遮罩锅风,只顯示其內(nèi)部的人臉區(qū)域而不是頭發(fā)或圖片背景酥诽,因?yàn)樗麄兊淖兓嘤谀槻繀^(qū)域)。

為簡(jiǎn)單起見(jiàn)皱埠,我展示給你的人臉識(shí)別系統(tǒng)是使用灰度圖像的特征臉?lè)椒ò拐省K晕覍⑾蚰阏f(shuō)明怎樣簡(jiǎn)單地把彩色圖像轉(zhuǎn)化為灰度圖像,并且之后簡(jiǎn)單地使用直方圖均衡化(Histogram Equalization)作為一種自動(dòng)的標(biāo)準(zhǔn)化臉部圖像亮度和對(duì)比度的方法边器。為了得到更好的結(jié)果训枢,你可以使用彩色人臉識(shí)別(color face recognition,ideally with color histogram fitting in HSV or another color space instead of RGB),或者使用更多的預(yù)處理忘巧,比如邊緣增強(qiáng)(edge enhancement),輪廓檢測(cè)(contour detection),手勢(shì)檢測(cè)(motion detection),等等恒界。

你可以看到一個(gè)預(yù)處理階段的例子:

這是把一幅RGB格式的圖像或灰度圖像轉(zhuǎn)變?yōu)榛叶葓D像的基本代碼。它還把圖像調(diào)整成了固定的維度砚嘴,然后應(yīng)用直方圖均衡化來(lái)實(shí)現(xiàn)固定的亮度和對(duì)比度十酣。

PCA原理

現(xiàn)在你已經(jīng)有了一張經(jīng)過(guò)預(yù)處理后的臉部圖片,你可以使用特征臉(PCA)進(jìn)行人臉識(shí)別际长。OpenCV自帶了執(zhí)行PCA操作的”cvEigenDecomposite()”函數(shù)耸采,然而你需要一個(gè)圖片數(shù)據(jù)庫(kù)(訓(xùn)練集)告訴機(jī)器怎樣識(shí)別當(dāng)中的人。

所以你應(yīng)該收集每個(gè)人的一組預(yù)處理后的臉部圖片用于識(shí)別工育。比如虾宇,假如你想要從10人的班級(jí)當(dāng)中識(shí)別某個(gè)人,你可以為每個(gè)人存儲(chǔ)20張圖片翅娶,總共就有200張大小相同(如100×100像素)的經(jīng)預(yù)處理的臉部圖片文留。

特征臉的理論在Servo Magazine的兩篇文章(Face Recognition with Eigenface)中解釋了,但我仍會(huì)在這里嘗試著向你解釋竭沫。

我們使用“主元分析”把你的200張訓(xùn)練圖片轉(zhuǎn)換成一個(gè)代表這些訓(xùn)練圖片主要區(qū)別的“特征臉”集燥翅。首先它將會(huì)通過(guò)獲取每個(gè)像素的平均值,生成這些圖片的“平均人臉圖片”蜕提。然后特征臉將會(huì)與“平均人臉”比較森书。第一個(gè)特征臉是最主要的臉部區(qū)別,第二個(gè)特征臉是第二重要的臉部區(qū)別,等……直到你有了大約50張代表大多數(shù)訓(xùn)練集圖片的區(qū)別的特征臉凛膏。

在上面這些示例圖片中你可以看到平均人臉和第一個(gè)以及最后一個(gè)特征臉杨名。注意到,平均人臉顯示的是一個(gè)普通人的平滑臉部結(jié)構(gòu)猖毫,排在最前的一些特征臉顯示了一些主要的臉部特征台谍,而最后的特征臉(比如Eigenface 119)主要是圖像噪聲。你可以在下面看到前32張?zhí)卣髂槨?/p>

簡(jiǎn)單地說(shuō)吁断,特征臉?lè)椒?Principal Component Analysis)計(jì)算出了訓(xùn)練集中圖片的主要區(qū)別趁蕊,并且用這些“區(qū)別”的組合來(lái)代表每幅訓(xùn)練圖片。

比如仔役,一張訓(xùn)練圖片可能是如下的組成:

(averageFace) + (13.5% of eigenface0) – (34.3% of eigenface1) + (4.7% of eigenface2) + … + (0.0% of eigenface199).

一旦計(jì)算出來(lái)掷伙,就可以認(rèn)為這張訓(xùn)練圖片是這200個(gè)比率(ratio):

{13.5, -34.3, 4.7, …, 0.0}.

用特征臉圖片分別乘以這些比率,并加上平均人臉圖片 (average face)又兵,從這200個(gè)比率還原這張訓(xùn)練圖片是完全可以做到的任柜。但是既然很多排在后面的特征臉是圖像噪聲或者不會(huì)對(duì)圖片有太大作用,這個(gè)比率表可以被降低到只剩下最主要的,比如前30個(gè)沛厨,不會(huì)對(duì)圖像質(zhì)量有很大影響宙地。所以現(xiàn)在可以用30個(gè)特征臉,平均人臉圖片俄烁,和一個(gè)含有30個(gè)比率的表绸栅,來(lái)代表全部的200張訓(xùn)練圖片。

在另一幅圖片中識(shí)別一個(gè)人页屠,可以應(yīng)用相同的PCA計(jì)算粹胯,使用相同的200個(gè)特征臉來(lái)尋找200個(gè)代表輸入圖片的比率。并且仍然可以只保留前30個(gè)比率而忽略其余的比率辰企,因?yàn)樗鼈兪谴我姆缇馈H缓笸ㄟ^(guò)搜索這些比率的表,尋找在數(shù)據(jù)庫(kù)中已知的20個(gè)人牢贸,來(lái)看誰(shuí)的前30個(gè)比率與輸入圖片的前30個(gè)比率最接近竹观。這就是尋找與輸入圖片最相似的訓(xùn)練圖片的基本方法,總共提供了200張訓(xùn)練圖片潜索。

訓(xùn)練圖片

創(chuàng)建一個(gè)人臉識(shí)別數(shù)據(jù)庫(kù)臭增,就是訓(xùn)練一個(gè)列出圖片文件和每個(gè)文件代表的人的文本文件,形成一個(gè)facedata.xml“文件竹习。

比如誊抛,你可以把這些輸入一個(gè)名為”trainingphoto.txt”的文本文件:

joke1.jpg

joke2.jpg

joke3.jpg

joke4.jpg

lily1.jpg

lily2.jpg

lily3.jpg

lily4.jpg

它告訴這個(gè)程序,第一個(gè)人的名字叫“joke整陌,而joke有四張預(yù)處理后的臉部圖像拗窃,第二個(gè)人的名字叫”lily”瞎领,有她的四張圖片。這個(gè)程序可以使用”loadFaceImgArray()”函數(shù)把這些圖片加載到一個(gè)圖片數(shù)組中随夸。

為了從這些加載好的圖片中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)九默,你可以使用OpenCV的”cvCalcEigenObjects()”和”cvEigenDecomposite()”函數(shù)。

獲得特征空間的函數(shù):

[html]view plaincopy

print?

void?cvCalcEigenObjects(?int?nObjects,?void*?input,?void*?output,?int?ioFlags,?int?ioBufSize,?void*?userData,CvTermCriteria*?calcLimit,?IplImage*?avg,?float*?eigVals?)

[html]view plaincopy

print?

void?cvCalcEigenObjects(?int?nObjects,?void*?input,?void*?output,?int?ioFlags,?int?ioBufSize,?void*?userData,CvTermCriteria*?calcLimit,?IplImage*?avg,?float*?eigVals?)

nObjects:目標(biāo)的數(shù)目宾毒,即輸入訓(xùn)練圖片的數(shù)目驼修。

input:輸入訓(xùn)練的圖片。

output:輸出特征臉诈铛,總共有nEigens

ioFlags邪锌、ioBufSize:默認(rèn)為0

userData:指向回調(diào)函數(shù)(callback function)必須數(shù)據(jù)結(jié)構(gòu)體的指針。

calcLimit:終止迭代計(jì)算目標(biāo)特征的條件癌瘾。根據(jù)calcLimit的參數(shù),計(jì)算會(huì)在前nEigens主要特征目標(biāo)被提取后結(jié)束(這句話(huà)有點(diǎn)繞饵溅,應(yīng)該就是提取了前nEigens個(gè)特征值妨退,),另一種結(jié)束的情況是:目前特征值同最s大特征值的比值降至calcLimit的epsilon值之下蜕企。

賦值如下calcLimit = cvTermCriteria( CV_TERMCRIT_ITER, nEigens, 1);

它的類(lèi)型定義如下:

typedef struct CvTermCriteria

{

int type;  int max_iter;    //最大迭代次數(shù)

double epsilon;    //結(jié)果精確性

}

avg:訓(xùn)練樣本的平均圖像

eigVals:以降序排列的特征值的行向量指針咬荷。可以為0轻掩。

最后將所得數(shù)據(jù)形成一個(gè)facedata.xml“文件保存下來(lái)幸乒,它可以隨時(shí)被重新載入來(lái)識(shí)別經(jīng)訓(xùn)練過(guò)的人。

圖像在特征空間的投影:

[html]view plaincopy

print?

void?cvEigenDecomposite(?IplImage*?obj,?int?nEigObjs,?void*?eigInput,int?ioFlags,?void*?userData,?IplImage*?avg,?float*?coeffs?);

[html]view plaincopy

print?

void?cvEigenDecomposite(?IplImage*?obj,?int?nEigObjs,?void*?eigInput,int?ioFlags,?void*?userData,?IplImage*?avg,?float*?coeffs?);

obj:輸入圖像唇牧,訓(xùn)練或識(shí)別圖像

nEigObjs:特征空間的eigen數(shù)量

eigInput:特征空間中的特征臉

ioFlags罕扎、userData:默認(rèn)為0

avg:特征空間中的平均圖像

coeffs:這是唯一一個(gè)輸出,即人臉在子空間的投影丐重,特征值

識(shí)別的過(guò)程

1. 讀取用于測(cè)試的圖片腔召。

2. 平均人臉,特征臉和特征值(比率)使用函數(shù)“l(fā)oadTrainingData()” 從人臉識(shí)別數(shù)據(jù)庫(kù)文件(the face recognition database fil)“facedata.xml”載入扮惦。

3. 使用OpenCV的函數(shù)“cvEigenDecomposite()”臀蛛,每張輸入的圖片都被投影到PCA子空間,來(lái)觀察哪些特征臉的比率最適合于代表這張圖片崖蜜。

4. 現(xiàn)在有了特征值(特征臉圖片的比率)代表這張輸入圖片浊仆,程序需要查找原始的訓(xùn)練圖片,找出擁有最相似比率的圖片豫领。這些用數(shù)學(xué)的方法在“findNearestNeighbor()”函數(shù)中執(zhí)行抡柿,采用的是“歐幾里得距離(Euclidean Distance)”,但是它只是基本地檢查輸入圖片與每張訓(xùn)練圖片的相似性氏堤,找到最相似的一張:一張?jiān)跉W幾里得空間上與輸入圖片距離最近的圖片沙绝。就像在 Servo Magazine的文章上提到的那樣搏明,如果使用馬氏距離( the Mahalanobis space,需要在代碼里定義 USE_MAHALANOBIS_DISTANCE)闪檬,你可以得到更準(zhǔn)確的結(jié)果星著。

5. 在輸入圖片與最相似圖片之間的距離用于確定可信度(confidence),作為是否識(shí)別出某人的指導(dǎo)。1.0的可信度意味著完全相同粗悯,0.0或者負(fù)的可信度意味著非常不相似虚循。但是需要注意,我在代碼中用到的可信度公式只是一個(gè)非逞基本的可信度測(cè)量横缔,不是很可靠,但是我覺(jué)得多數(shù)人會(huì)想要看到一個(gè)粗略的可信度值衫哥。你可能發(fā)現(xiàn)它對(duì)你的圖片給出錯(cuò)誤的值茎刚,所以你可以禁用它(比如:把可信度設(shè)為恒定的1.0)。

一旦指導(dǎo)哪張訓(xùn)練圖片和輸入圖片最相似撤逢,并假定可信度值不是太低(應(yīng)該至少是0.6或更高)膛锭,那么它就指出了那個(gè)人是誰(shuí),換句話(huà)說(shuō)蚊荣,它識(shí)別出了那個(gè)人初狰!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市互例,隨后出現(xiàn)的幾起案子奢入,更是在濱河造成了極大的恐慌,老刑警劉巖媳叨,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腥光,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡糊秆,警方通過(guò)查閱死者的電腦和手機(jī)柴我,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扩然,“玉大人艘儒,你說(shuō)我怎么就攤上這事》蚺迹” “怎么了界睁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)兵拢。 經(jīng)常有香客問(wèn)我翻斟,道長(zhǎng),這世上最難降的妖魔是什么说铃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任访惜,我火速辦了婚禮嘹履,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘债热。我一直安慰自己砾嫉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布窒篱。 她就那樣靜靜地躺著焕刮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墙杯。 梳的紋絲不亂的頭發(fā)上配并,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音高镐,去河邊找鬼溉旋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嫉髓,可吹牛的內(nèi)容都是我干的低滩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼岩喷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了监憎?” 一聲冷哼從身側(cè)響起纱意,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲸阔,沒(méi)想到半個(gè)月后偷霉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褐筛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年类少,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渔扎。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硫狞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晃痴,到底是詐尸還是另有隱情残吩,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布倘核,位于F島的核電站泣侮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏紧唱。R本人自食惡果不足惜活尊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一隶校、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛹锰,春花似錦深胳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至翎苫,卻和暖如春权埠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煎谍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工攘蔽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呐粘。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓满俗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親作岖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唆垃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容