Windows 平臺下實現人臉識別入門

本教程基于虹軟免費的人臉認知引擎,介紹了人臉檢測和人臉識別如何應用于實踐。

此為小白教程,高手可略過。

第一步:

先從虹軟官網下載Windows版SDK。

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

簡單注冊,并下載對應版本后,會提供如下APP Id和SDK key.(開發的時候會用到)

第二步:

下載后解壓,我們發現壓縮包內容如下:

有三個包,分別是Detection(人臉檢測),Recognition(人臉識別),Tracking(人臉跟蹤)

簡單介紹下這三個包的區別——

Detection(人臉檢測)——用于圖片的人臉檢測,獲取的人臉坐標可用于人臉識別

Recognition(人臉識別)——用于比對目標圖像和提前注冊好的圖片間的相似度

Tracking(人臉跟蹤)——用于視頻類,如攝像頭場景時人臉檢測效率高于Detection

第三部:

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

這里我選擇了控制臺程序。

由于習慣用Multi-Byte的方式開發,可以在工程右鍵屬性中按如下方式配置Character Set.

第三步:

在工程目錄下創建inc文件夾,將三個壓縮包中的頭文件,放在該目錄中,

另外創建lib文件夾,將壓縮包中的lib庫放入該目錄中。

Dll放入生成可執行文件的路徑下(因為我現在用的是Debug版本,因此放在了Debug下面)

第四步:

在工程里包含需要的頭文件和lib庫。

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

第五步:

實現照片注冊。

需要用到人臉檢測和人臉識別。

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

所謂注冊,即通過人臉識別算法將人臉特征信息提取出來,并保存到數據庫,用于后續的人臉特征比對。

附注冊代碼如下:

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("注冊成功!");

}

else

{

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

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");

}

第六步:

識別比對人臉。

所謂識別,即通過人臉識別算法將人臉特征信息提取出來,與之前的保存的特征進行比較,獲取相似度值。

以下為單人臉識別比對示例,將已經保存的特征值進行逐一比對,即可找到注冊人群中最相似的人,即1:N場景。如果是1:1場景的話,只需把當前的需要識別的圖像和指定的特征值進行比較即可。

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

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;

//在這里和原來保存的Feature進行對比

//loadFeatures();

//MRESULT ret =

AFR_FSDK_FacePairMatching(hfr_Engine, &faceModel, &faceModels2,

&fSimilScore);

//fsimilScore該值即獲得

}

else

{

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

returnMERR_BASIC_BASE;

}

res =AFR_FSDK_UninitialEngine(hfr_Engine);

SafeFree(pfd_Mem);

SafeFree(pfr_Mem);

returnMOK;

return0;

}

測試了下,常規情況下0.63左右的相似度作為閾值,基本可以區分是否查找比對成功。即高于0.63應該是查找匹配成功。實際的相似度可能還需和使用場景掛鉤,在0.5-0.7的范圍內選擇適合所在場景的值作為分界線。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容