1. 程式人生 > >用基於center loss的人臉識別模型對LFW人臉資料集進行評測(c++)

用基於center loss的人臉識別模型對LFW人臉資料集進行評測(c++)

接上一篇博文,這篇博文主要是進行人臉識別中的第③和第四個步驟:特徵提取以及相似度計算。

             center loss是2016的一篇ECCV論文中提出來的,A Discriminative Feature Learning Approach for Deep Face Recognition,個人理解,center loss的思想有點類似於SVM,對於線性可分的資料,SVM不僅僅是求得的超平面線性劃分訓練資料,還要求劃分後的最小間隔最大化,而加入了center loss的卷積神經網路,不僅要求劃分出各個類別,還要求類與類之間的距離儘可能大,而類之間的元素之間距離儘可能小,這樣當一副新的未出現過的人臉送入網路進行測試時,能更好的泛化其特徵,而減少了因為類類間“太近”而導致的誤判。就如論文中的圖: 

                     

這裡顯示的是賦予center loss不同權重的效果圖,左上角的權重比較小,類類間間距相對小,而右下角的權重比較大,得到的結果是類與類之間的距離相對很大。更詳細的博文,大家可以看       https://sanwen8.cn/p/5c76qMZ.html

       簡而言之,為了實現center loss,作者在caffe裡自定義了一個center loss層,添加了標頭檔案以及原始檔後,重新編譯caffe即可。

環境配置好後,我們下載WebFace 資料集,該資料集一共有10575個人的圖片,總共50W左右張圖片,此時,我們應該先將這些人臉圖片進行對齊(上篇部落格主要介紹了對齊方法),然後我們將對齊好的圖片分為訓練集、驗證集,開始訓練我們的神經網路了。

       訓練完後,我們得到了一個caffemodel,我們想在LFW上驗證我們的模型,看看效能到底怎麼樣,我們將LFW的資料下載回來,一共有5749個人的人臉圖片,每個人一個資料夾,  而LFW的評價指標是 給出了6000對人臉圖片,其中3000對人臉圖片是同一個人,另外3000對圖片不是同一個人,現在我們需要拿出自己的模型,對這6000對人臉圖片,分別回答是同一個人與否,並且畫出ROC曲線來評價我們的模型。

     具體的方法是,假設前3000對是同一個人,後3000對不是同一個人,我們設同一個人的標籤是1,不是同一個人的標籤是0,則6000個標籤中,前3000是1,後三千是0,現在,我們用我們模型進行預測,對於每一個圖片對,我們會根據計算兩張圖片的相似度,得到一個相似度(0~1),然後根據其是否大於一個給定的閾值,會得到6000個結果,這個結果不是0就是1,比如閾值是0.7,現在模型對一個圖片對算出來的相似度是0.6,則我們認為這對圖片不是同一個人,因為其相似度0.6沒有達到閾值0.7,這樣,對於每一個閾值,我們能得到該閾值下的查準率P、查全率R、真正例率TPR、假正例率FPR。我們現在設定6000個閾值(因為有6000個測試圖片對),就可以畫出ROC曲線和PR曲線了, 我用一個迭代了10W次模型,進行測試,ROC曲線和PR曲線如下圖:

                                               

圖很醜,,大家別笑~~ 這是用opencv畫出來的,左邊的是ROC曲線,右邊的是PR曲線,對於ROC曲線,有一個評價指標,是畫一條從左上角到右下角的直線與ROC曲線的交點的縱座標,也就是對應的真正例率TPR,算出來是0.947, 同時,我也試了所有的分類閾值,在最好的分類閾值的情況下,準確率為0.953,也就是6000對圖片中,我正確識別了6000*0.953=5718對 ,至於在LFW資料集上的實際評價標準,我暫時也搞不清楚是用哪個,或者算AUC? 這個還請知道的同學告知~~

具體的怎麼用C++提取一張人臉經過caffe網路產生的特徵,會再寫一篇部落格供大家參考~