VGG人臉識別訓練心得
20170929進行更新:將程式碼傳至github上。網址:https://github.com/KaiJin1995/MTCNN-VGG-face。
該網路可以直接進行人臉檢測、識別以及陌生人報警。構成安全防盜系統。
----------------------------------------------------------------------
在使用VGG進行人臉訓練過程中,我是用log日誌記錄了訓練過程中的資料。訓練過程中的引數對於訓練而言,有著較大的影響,引數設定不當,(1)容易出現訓練結束,但未收斂到最佳狀態。(2)早就收斂,迭代次數過多,浪費時間。
本篇部落格主要講述我在使用VGG訓練人臉的過程中,迭代次數對於訓練效果的影響。以及,對LFW測試集準確率的影響。
首先,採取VGG11訓練網路,將VGG11訓練網路後得到的caffemodel送至VGG16進行fintune。
訓練結束後,我們提取VGG的fc7的值作為特徵向量。通過比較特徵向量之間的距離,我們可以衡量兩個不同人臉之間的差距。
一、VGG11網路訓練。
VGG11初始值為高斯。訓練採用VGG11,
表1.1 VGG迭代10萬次訓練情況
Learning rate | iteration | Loss | Accuracy |
0.025 | 2W | 9->6 | 0.08 |
0.0025 | 2W | 6->3 | 0.447625 |
0.00025 | 2W | 3->2 | 0.554812 |
0.000025 | 2W | 不變 | 0.57 |
0.0000025 | 2W | 不變 | 0.575625 |
表1.2 VGG finetune表格
Learning rate | iteration | Loss | Accuracy |
0.025 | 2W | 1.97348 | 0.604312 |
0.0025 | 5W | 1.76364 | 0.709125 |
0.0025 | 5W | 1.79849 | 0.73 |
0.00025 | 5W | 1.52852 | 0.804875 |
0.000025 | 5W | 1.52191 | 0.8115 |
在lr=0.0025迭代2W仍有上升空間,故再迭代5W+5W時,發現準確率不再上升,故將準確率再下降訓練。
再用lr=0.00025迭代5W次,到0.80,穩定下來。再用0.000025迭代5W次,發現僅僅只有很少的提升,到81%
故用此caffemodel在LFW資料集上進行測試。當採用L2Norm+euclidean時,準確率0.903+-0.013。當採用L2Norm+cosine時,90.5+-0.012。當非L2Norm+cos時:90.5+-0.012。 非L2Norm+euclidean:0.5(因為不歸一化,數字太大,均超過閾值)。
底部是我的readme寫的
(第一次初始值設為0.025時,迭代兩萬次,降到0.0025,迭代10W次。得到caffemodel,發現準確率偏低,發現由於0.025時準確率還在上升時,lr便降了一個數量級
故使用10W次的caffemodel進行finetune,使用lr=0.025進行finetune。迭代了2W次,發現在0.0025仍有上升空間,於是,又在此基礎上迭代了5萬次,發現準確率還有上升空間。
於是又用5W次的caffemodel再迭代5W次,發現準確率不再上升。
故降低準確率,0.00025,迭代5萬次,準確率穩定在80%不再上升。再根據此降低準確率。準確率降低十倍,發現穩定在81%難以提升。
選擇此model測試,使用L2+euclidean,得到0.903+-0.013。L2+cos:90.5+-0.012 非L2+cos:90.5+-0.012 非L2+euclidean:0.5(因為不歸一化,數字太大,均超過閾值)。
注:cos距離不需要歸一化,因為僅僅時兩個向量之間的夾角
由於fc7的4096維向量過多,於是我們採用PCA 進行降維,降至500維,測試得到準確率92%+-0.013。
另外,當使用fc6測試時,得到準確率92.2%+-0.012。但並非說用fc6一定好,當用vgg16時,發現有一個百分點的下降。
當我用VGGFace官方團隊給的caffemodel進行測試時,得到的準確率是96.4+-0.009(cos距離),而歐式距離與cos距離相近,不會有0.2個百分點以上的提升。
二、VGG16網路finetune
vgg16其餘層使用高斯
Learning rate | iteration | Loss | Accuracy |
0.025 | 2W5 | 2.78113 | 0.527562 |
0.0025 | 5W | 1.96276 | 0.67425 |
0.00025 | 2W5 | 1.38997 | 0.7915 |
0.00025 | 1W5 | 1.38345 | 0.798813 |
2.5e-05 | 1W7 | 1.38007 | 0.800625 |
首先採用5000次0.025的lr進行學習,在到25000次下降十倍,發現Acc仍然還具備上升空間,故在25000次使用caffemodel重新訓練,訓練5W次0.0025,發現收斂,得到100000次的caffemodel 0.00025短暫看來也沒提升,僅固定在80%動不了。為了進一步觀測,再用0.00025訓練幾萬次,觀測收斂情況,
發現未收斂到最優,則陷入區域性的極小值,得到6W的caffemodel
為了擺脫區域性極小值,採用0.025訓練6W次的資料,觀測情況,Loss越來越高,直至發散
故再嘗試0.0025,發現跟之前相似,均收斂到70%不下降
故再降低準確率0.00025,再次測試,再次在80%處停止住。準確率不易上升。降低至0.000025,穩定在80%+,接近於81%的位置。
最終再降低。
用LFW測試,得到92.0%+-0.009。
三、center loss的訓練
由於對此效果不滿意,故選用center loss在原有基礎上訓練。
使用0.0025訓練,同時centerloss的學習率與之對應。lose_weight=0.008,但是在0.00025時便恆定在73%。vgg_10575_train.log_1。得到/home/free/caffe-face/face_example/vgg_CenterLoss/vgg_10575_iter_50000_1.caffemodel
故增大centerloss的學習率,lr_mult為2000.在之前caffemodel的基礎上繼續訓練。發現centerloss相比於之前,增加了一些,到達76%。故降低學習率,lr_mult為200,再繼續訓練。學習率從0.00025開始,發現並沒太大的變化。放棄。
從0.0025開始,lose_weight=0.003,繼續觀測。發現收斂到80%附近,訓練完成達到82%的準確率。
而0.0025仍有上升空間,故選用此lr繼續訓練,並不斷下降準確率,最終得到84%的準確率。
對此,可以列表格如下:
Learning Rate | iteration | loss | accuracy | loss_weight | center lr_mult |
0.0025 | 36000 | 3.5 | 74%左右 | 0.008 | 1 |
0.00025 | 44000 | 3 | 76% | 0.008 | 2000 |
0.0025(期間有下降到0.00025) | 41000 | 2附近 | 82.4% | 0.003 | 200 |
0.0025 | 6000 | 2.5附近 | 80% | 0.003 | 200 |
0.00025 | 30000 | 1.2 | 83% | 0.003 | 200 |
0.000025 | 10000 | 1.2 | 84% | 0.003 | 200 |
小結:對於訓練而言,要掌握好訓練的技巧。不要設定的迭代次數過多,也不要過少。過多浪費時間,過少,可能驗證準確率少一個百分點。
由於資料量過少,只有50W張人臉圖,跟VGGFACE官方團隊的200萬相比,還是過少。而50萬張的小資料集對於VGGface團隊也只是做到92%,沒差。