Windows 平臺(tái)下實(shí)現(xiàn)人臉識(shí)別入門

本教程基于虹軟免費(fèi)的人臉認(rèn)知引擎,介紹了人臉檢測(cè)和人臉識(shí)別如何應(yīng)用于實(shí)踐狐血。

此為小白教程淀歇,高手可略過(guò)。

第一步:

先從虹軟官網(wǎng)下載Windows版SDK氛雪。

附鏈接:http://www.arcsoft.com.cn/ai/arcface.html

簡(jiǎn)單注冊(cè)房匆,并下載對(duì)應(yīng)版本后,會(huì)提供如下APP Id和SDK key.(開(kāi)發(fā)的時(shí)候會(huì)用到)

第二步:

下載后解壓,我們發(fā)現(xiàn)壓縮包內(nèi)容如下:

有三個(gè)包浴鸿,分別是Detection(人臉檢測(cè))井氢,Recognition(人臉識(shí)別),Tracking(人臉跟蹤)

簡(jiǎn)單介紹下這三個(gè)包的區(qū)別——

Detection(人臉檢測(cè))——用于圖片的人臉檢測(cè)岳链,獲取的人臉坐標(biāo)可用于人臉識(shí)別

Recognition(人臉識(shí)別)——用于比對(duì)目標(biāo)圖像和提前注冊(cè)好的圖片間的相似度

Tracking(人臉跟蹤)——用于視頻類花竞,如攝像頭場(chǎng)景時(shí)人臉檢測(cè)效率高于Detection

第三部:

創(chuàng)建Visual Studio的C++工程(我用的是vs2012):

這里我選擇了控制臺(tái)程序。

由于習(xí)慣用Multi-Byte的方式開(kāi)發(fā)掸哑,可以在工程右鍵屬性中按如下方式配置Character Set.

第三步:

在工程目錄下創(chuàng)建inc文件夾约急,將三個(gè)壓縮包中的頭文件,放在該目錄中苗分,

另外創(chuàng)建lib文件夾厌蔽,將壓縮包中的lib庫(kù)放入該目錄中。

Dll放入生成可執(zhí)行文件的路徑下(因?yàn)槲椰F(xiàn)在用的是Debug版本摔癣,因此放在了Debug下面)

第四步:

在工程里包含需要的頭文件和lib庫(kù)奴饮。

如下我這里只用了Detection和Recognition。

第五步:

實(shí)現(xiàn)照片注冊(cè)择浊。

需要用到人臉檢測(cè)和人臉識(shí)別戴卜。

注意:虹軟用到的圖像數(shù)據(jù)格式并非Jpeg等格式,而是解碼后的格式琢岩,如RGB格式投剥,官方給的是(ASVL_PAF_RGB24_B8G8R8)

所謂注冊(cè),即通過(guò)人臉識(shí)別算法將人臉特征信息提取出來(lái)担孔,并保存到數(shù)據(jù)庫(kù)江锨,用于后續(xù)的人臉特征比對(duì)。

附注冊(cè)代碼如下:

intRegisterFace(ASVLOFFSCREEN*imginfo,TCHAR*regName)

{

//FD

MByte* pfd_Mem = (MByte*)malloc(FD_MEMSIZE);

MHandlehfd_Engine =NULL;

MRESULTres = AFD_FSDK_InitialFaceEngine(APP_ID,FD_SDK_KEY, pfd_Mem,FD_MEMSIZE, &hfd_Engine,

AFD_FSDK_OPF_0_HIGHER_EXT,16,10);

if(res !=MOK)

{

SafeFree(pfd_Mem);

returnres;

}

LPAFD_FSDK_FACERESfaces;

res =AFD_FSDK_StillImageFaceDetection(hfd_Engine,imginfo, &faces);

if(res !=MOK)

printf("FD Detect

Failed\r\n");

if(faces->nFace == 0)

{

printf("No faces

detected\r\n");

SafeFree(pfd_Mem);

return-1;

}

//FR

MByte* pfr_Mem = (MByte*)malloc(FR_MEMSIZE);

MHandlehfr_Engine =NULL;

res = AFR_FSDK_InitialEngine(APP_ID,

FR_SDK_KEY, pfr_Mem,FR_MEMSIZE, &hfr_Engine);

if(res !=MOK)

{

SafeFree(pfd_Mem);

SafeFree(pfr_Mem);

returnres;

}

AFR_FSDK_FACEMODELfaceModel = { 0 };

AFR_FSDK_FACEINPUTfaceInput = { 0 };

faceInput.lOrient = (AFR_FSDK_OrientCode)*faces->lfaceOrient;

//memcpy(&faceInput.rcFace ,

&faces->rcFace[0],sizeof(MRECT));

intleffff = faces->rcFace[0].left;

faceInput.rcFace.left =faces->rcFace[0].left;

faceInput.rcFace.bottom =faces->rcFace[0].bottom;

faceInput.rcFace.right =faces->rcFace[0].right;

faceInput.rcFace.top =faces->rcFace[0].top;

res =AFR_FSDK_ExtractFRFeature(hfr_Engine,imginfo, &faceInput,&faceModel);

if(res ==MOK&& faceModel.lFeatureSize> 0 && faceModel.pbFeature)

{

SaveFeature(&faceModel,regName);//保存特征

printf("注冊(cè)成功!");

}

else

{

printf("注冊(cè)(提取特征)失敗");

returnMERR_BASIC_BASE;

}

res =AFD_FSDK_UninitialFaceEngine(hfd_Engine);

res = AFR_FSDK_UninitialEngine(hfr_Engine);

SafeFree(pfd_Mem);

SafeFree(pfr_Mem);

returnMOK;

}

VoidRegist()

{

ASVLOFFSCREENimageInfo = {0};

char* filepath =argv[2];

IplImage* img =cvLoadImage(filepath,1);

imageInfo.i32Width =img->width;

imageInfo.i32Height = img->height;

imageInfo.u32PixelArrayFormat =ASVL_PAF_RGB24_B8G8R8;

imageInfo.pi32Pitch[0] =imageInfo.i32Width*3;

imageInfo.ppu8Plane[0] = (MUInt8*)malloc(imageInfo.i32Height*imageInfo.pi32Pitch[0]);

memcpy(imageInfo.ppu8Plane[0],img->imageData,imageInfo.i32Height*imageInfo.pi32Pitch[0]);

RegisterFace(&imageInfo,"Leo");

}

第六步:

識(shí)別比對(duì)人臉攒磨。

所謂識(shí)別泳桦,即通過(guò)人臉識(shí)別算法將人臉特征信息提取出來(lái),與之前的保存的特征進(jìn)行比較娩缰,獲取相似度值灸撰。

以下為單人臉識(shí)別比對(duì)示例,將已經(jīng)保存的特征值進(jìn)行逐一比對(duì)拼坎,即可找到注冊(cè)人群中最相似的人浮毯,即1:N場(chǎng)景。如果是1:1場(chǎng)景的話泰鸡,只需把當(dāng)前的需要識(shí)別的圖像和指定的特征值進(jìn)行比較即可债蓝。

//faceModels2為已保存(注冊(cè))的人臉特征

intRecoginizeFace(ASVLOFFSCREEN*imginfo,char**regName)

{

//FD

MByte* pfd_Mem = (MByte*)malloc(FD_MEMSIZE);

MHandlehfd_Engine =NULL;

MRESULTres = AFD_FSDK_InitialFaceEngine(APP_ID,FD_SDK_KEY, pfd_Mem,FD_MEMSIZE, &hfd_Engine,

AFD_FSDK_OPF_0_HIGHER_EXT,16,10);

if(res !=MOK)

{

SafeFree(pfd_Mem);

returnres;

}

LPAFD_FSDK_FACERESfaces;

res =AFD_FSDK_StillImageFaceDetection(hfd_Engine,imginfo, &faces);

if(res !=MOK)

printf("FD Detect

Failed\r\n");

res = AFD_FSDK_UninitialFaceEngine(hfd_Engine);

if(faces->nFace == 0)

{

printf("No faces

detected\r\n");

SafeFree(pfd_Mem);

return-1;

}

//FR

MByte* pfr_Mem = (MByte*)malloc(FR_MEMSIZE);

MHandlehfr_Engine =NULL;

res = AFR_FSDK_InitialEngine(APP_ID,

FR_SDK_KEY, pfr_Mem,FR_MEMSIZE, &hfr_Engine);

if(res !=MOK)

SafeFree(pfd_Mem);

SafeFree(pfr_Mem);

returnres;

AFR_FSDK_FACEMODELfaceModel = { 0 };

AFR_FSDK_FACEINPUTfaceInput = { 0 };

faceInput.lOrient = (AFR_FSDK_OrientCode)faces->lfaceOrient;

res =AFR_FSDK_ExtractFRFeature(hfr_Engine,imginfo, &faceInput,&faceModel);

if(res ==MOK&& faceModel.lFeatureSize> 0 && faceModel.pbFeature)

{

MFloatfSimilScore = 0.0f;

//在這里和原來(lái)保存的Feature進(jìn)行對(duì)比

//loadFeatures();

//MRESULT ret =

AFR_FSDK_FacePairMatching(hfr_Engine, &faceModel, &faceModels2,

&fSimilScore);

//fsimilScore該值即獲得

}

else

{

printf("注冊(cè)(提取特征)失敗");

returnMERR_BASIC_BASE;

}

res =AFR_FSDK_UninitialEngine(hfr_Engine);

SafeFree(pfd_Mem);

SafeFree(pfr_Mem);

returnMOK;

return0;

}

測(cè)試了下,常規(guī)情況下0.63左右的相似度作為閾值盛龄,基本可以區(qū)分是否查找比對(duì)成功饰迹。即高于0.63應(yīng)該是查找匹配成功芳誓。實(shí)際的相似度可能還需和使用場(chǎng)景掛鉤,在0.5-0.7的范圍內(nèi)選擇適合所在場(chǎng)景的值作為分界線啊鸭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锹淌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赠制,更是在濱河造成了極大的恐慌赂摆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钟些,死亡現(xiàn)場(chǎng)離奇詭異烟号,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)政恍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門汪拥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人抚垃,你說(shuō)我怎么就攤上這事喷楣√舜螅” “怎么了鹤树?”我有些...
    開(kāi)封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逊朽。 經(jīng)常有香客問(wèn)我罕伯,道長(zhǎng),這世上最難降的妖魔是什么叽讳? 我笑而不...
    開(kāi)封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任追他,我火速辦了婚禮,結(jié)果婚禮上岛蚤,老公的妹妹穿的比我還像新娘邑狸。我一直安慰自己,他們只是感情好涤妒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布单雾。 她就那樣靜靜地躺著,像睡著了一般她紫。 火紅的嫁衣襯著肌膚如雪硅堆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天贿讹,我揣著相機(jī)與錄音渐逃,去河邊找鬼。 笑死民褂,一個(gè)胖子當(dāng)著我的面吹牛茄菊,可吹牛的內(nèi)容都是我干的疯潭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼面殖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼袁勺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起畜普,我...
    開(kāi)封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤期丰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后吃挑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钝荡,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年舶衬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埠通。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逛犹,死狀恐怖端辱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虽画,我是刑警寧澤舞蔽,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站码撰,受9級(jí)特大地震影響渗柿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脖岛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一朵栖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柴梆,春花似錦陨溅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至揣苏,卻和暖如春悯嗓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卸察。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工脯厨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坑质。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓合武,卻偏偏與公主長(zhǎng)得像临梗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稼跳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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