1. 程式人生 > >【Caffe實踐】基於Caffe的人臉識別實現

【Caffe實踐】基於Caffe的人臉識別實現

導言

深度學習深似海、尤其是在影象人臉識別領域,最近幾年的頂會和頂刊常常會出現沒有太多的理論創新的文章,但是效果擺在那邊。

DeepID是深度學習方法進行人臉識別中的一個簡單,卻高效的一個網路模型,其結構的特點可以概括為兩句話:1、訓練一個多個人臉的分類器,當訓練好之後,就可以把待測試影象放入網路中進行提取特徵,2對於提取到的特徵,然後就是利用其它的比較方法進行度量。具體的論文可以參照我的一篇論文筆記:【深度學習論文筆記】Deep Learning Face Representation from Predicting 10,000 Classes

首先我們完全參考論文的方法用Caffe設計一個網路結構:

其拓撲圖如圖1所示:

DeepID網路結構
圖1:DeepID的網路結構,影象比較大,需要放大才能看的清楚

網路定義檔案:

<code class="hljs  has-numbering">略</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

2. 資料選擇

訓練一個好的深度模型,一個好的訓練資料是必不可少的。針對人臉識別的資料,目前公開的資料也有很多:比如最近的MegaFace、港大的Celbra A、中科研的WebFace 等等。在這裡,我選擇WebFace人臉資料庫作為訓練(人臉庫不是很乾淨,噪聲較多),影象公共50萬張左右,共10575個人,但是資料不平衡。

要評測一個演算法的效能,需要找一個公平的比對資料庫來評測,在人臉驗證中,LFW資料庫無疑是最好的選擇。在lfw評測中,給出6000千對人臉影象對進行人匹配。

3. 資料處理

訓練資料和測試資料都選擇好之後,就需要進行資料處理了,為了提供較好的識別準確度,我採用了訓練資料和測試資料統一的預處理方法(雖然LFW上有提供已經預處理過的人臉影象,但是預處理的具體引數還是未知的),測試資料和訓練資料都取樣相同的人臉檢測和對齊方法。

主要分為3個步驟:
1,人臉檢測
2,人臉特徵點檢測
3、人臉的對齊

這三個步驟可以用我做的一個小工具:FaceTools 來一鍵完成。

具體來說,需要選擇一個標準的人臉影象作為對齊的基準,我挑選一位帥哥當標準影象:
如圖:
標準的對齊參考影象

訓練資料通過對齊後是這樣的:
訓練資料對齊

LFW測試資料通過對齊後是這樣的:
這裡寫圖片描述

4.資料轉換

影象處理好之後,需要將其轉化為Caffe 可以接受的格式。雖然Caffe支援直接讀影象檔案的格式進行訓練,但是這種方式磁碟IO會比較的大,所以我這裡不採用影象列表的方式,而是將訓練和驗證圖片都轉化為LMDB的格式處理。

4.1 劃分訓練集驗證集

劃分訓練集和驗證集(我取樣的是9:1的比例)
指令碼如下:

<code class="hljs  has-numbering">略</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

4.2 資料轉換

再呼叫Caffe 提供的轉化函式:
指令碼如下:

<code class="hljs  has-numbering">略</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

這樣之後,訓練的資料就準備好了。

訓練網路

上面的這些步驟之後,資料就已經處理好了,現在需要指定網路的超引數:

具體超引數設定如下:

<code class="hljs  has-numbering">略</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

訓練的時候,可以檢視學習曲線:
Loss

6.LFW上測試

LFW上,提供了6000對的人臉影象對來作為評測資料,由於我採用的是自己選的人臉檢測和對齊方法,所以有些人臉在我的預處理裡面丟失了(檢測不到),為了簡單的處理這種情況,在提特徵的時候,沒有檢測到的影象就用原來的影象去替代。

<code class="hljs  has-numbering">略</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

然後進行人臉的比對

<code class="hljs  has-numbering">略</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

結果ROC曲線:
ROC

通過選擇合適的指令碼,得到的準確度為:0.826333333333, 有點低。

7.結果分析

實驗的結果沒有理想中的那麼好,主要的原因分為幾個:
1、資料集不夠好:有較多的噪聲資料
2、資料集合不平衡:每個人的圖片個數從幾十張到幾百張不等。
3,、網路結構沒優化:原始的DeepID的大小為:48*48,而我選擇的人臉影象大小為64*64,網路結構卻沒有相對應的調整。(主要影響在於全連線層的個數太多了)