1. 程式人生 > >A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe實驗復現

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe實驗復現

文主要講centerloss 的原理,及其創新點。然後用caffe 跑自己的資料(CASIA-WebFace | MsCelebV1-Faces-Aligned
Reference paper:A Discriminative Feature Learning Approach for Deep Face Recognition ECCV:2016
github:https://github.com/ydwen/caffe-face

1、簡介

一句話:通過新增center loss 讓簡單的softmax 能夠訓練出更有內聚性的特徵

作者意圖,在配合softmax適用的時候,希望使學習到的特徵具有更好的泛化性和辨別能力。通過懲罰每個種類的樣本和該種類樣本中心的偏移,使得同一種類的樣本儘量聚合在一起。
相對於triplet

(Google FaceNet: A Unified Embedding for Face Recognition and Clustering:2015)和contrastive(湯曉鷗 Deep LearningFace Representation by Joint Identification-Verification:2014)來說,這個目標其實相對‘清晰’, 所以網路收斂的速度甚至比僅僅用softmax更快,而且不需要像前兩者那樣構造大量的訓練對。

看一張圖:

這裡寫圖片描述

在左圖中,我們發現一個類如果太胖,那麼出現的結果就是類內距離>類間距離。(任意紅點之間的距離應該小於紅藍之間的距離。)
左邊時softmax一般結果,右邊時centerloss結果。我們期望特徵不僅可分,而且時必須差異大。如右邊圖。


2、centerloss

2-1 softmax loss

這裡寫圖片描述

其中:xi 代表 d 維空間中第 i 個deep feature。屬於第 yi 類。
d——特徵空間的維度。
W——全連線層的引數矩陣。W={d*n}。d行n列。聯想線性分類器 f=Wx+b。
Wj——W的第j
m——The size of mini-batch 。
n——and the number of class。
b——偏置。
將問題簡化(人不要為難自己,看一大堆爛公式,還不明白,代個數試試唄)

假設batch=1. 也就是m=1. 資料集就一樣圖片。那麼公式就是簡化成:

這裡寫圖片描述


我還是一圖解千言吧:

這裡寫圖片描述

可以發現,這個softmax的損失僅僅與正確那項的概率相關。

2-2 center loss

這裡寫圖片描述

其中,Cyi 代表第 yi 類深度特徵的類心。

2-3執行截圖:

這裡寫圖片描述

3、驗證

在lfw上驗證結果:
這裡寫圖片描述

這個圖片回答了:batch_size 對於訓練收斂速度有沒有影響。

這裡寫圖片描述

我們看到bath_size 大的情況下。雖然每次迭代時間消耗比batch_size =70 的時候大。但是batch_size =256的情況下。下降的更加穩健。比較少的出現波動。另外,對於最終的對於測試LFW精確率有一定的影響。

4、小結

對於深度學習,資料成為核心,那麼這個實驗的核心也是資料的預處理。
LFW的資料處理應該與CASIA資料集處理方式相同。
其中檢查自己的資料處理方式好不好的一個直接有效的方式是:

【1】LFW中有很多圖片包含多人臉。你的演算法是不是裁剪的圖片正中心的那個人?

這裡寫圖片描述

【2】Alignment做的怎麼樣?很明顯最後一張對齊有問題。

這裡寫圖片描述

clear;clc;
addpath('/DATA/bin.wang/caffe-face/matlab');
caffe.reset_all();



% load face model and creat network
caffe.set_device(0);
caffe.set_device(1);
caffe.set_device(2);
caffe.set_device(3);
caffe.set_mode_gpu();
model = '/home/bin.wang/caffe-face/face_example/face_deploy.prototxt';
weights = '/home/bin.wang/caffe-face/face_example/face_train_test_iter_27000.caffemodel';
net = caffe.Net(model, weights, 'test');

%load lfw_key_point mat struct
load('lfw_KeyPoint.mat');

% load face image, and align to 112 X 96
imgSize = [112, 96];
coord5points = [30.2946, 65.5318, 48.0252, 33.5493, 62.7299; ...
                51.6963, 51.5014, 71.7366, 92.3655, 92.2041];


features = [];
facial5points = [];

for i = 1:length(lfwNamelist)

    facial5points(2,:) = faceKeyPoint(i,1:5);
    facial5points(1,:) = faceKeyPoint(i,6:10);
    image = imread(char(lfwNamelist(i)));

    Tfm =  cp2tform(facial5points', coord5points', 'similarity');
    cropImg = imtransform(image, Tfm, 'XData', [1 imgSize(2)],...
                                  'YData', [1 imgSize(1)], 'Size', imgSize);


    %ImgPath= ['./lfw_cut/',num2str(i),'.jpg'];
    %imwrite(cropImg,char(ImgPath));

    % transform image, obtaining the original face and the horizontally flipped one
    if size(cropImg, 3) < 3
        cropImg(:,:,2) = cropImg(:,:,1);
        cropImg(:,:,3) = cropImg(:,:,1);
    end
    cropImg = single(cropImg);
    cropImg = (cropImg - 127.5)/128;
    cropImg = permute(cropImg, [2,1,3]);
    cropImg = cropImg(:,:,[3,2,1]);

    cropImg_(:,:,1) = flipud(cropImg(:,:,1));
    cropImg_(:,:,2) = flipud(cropImg(:,:,2));
    cropImg_(:,:,3) = flipud(cropImg(:,:,3));

    % extract deep feature
    res = net.forward({cropImg});
    res_ = net.forward({cropImg_});
    features(i,:) = [res{1}; res_{1}];
end

save('LFW_Feature.mat','features','lfwNamelist');

caffe.reset_all();

宣告:大家最近在做這個center loss 實驗的。如果有問題需要探討:可以直接在評論中寫明即可,我會盡快回復。

回答問題部分

1、訓練的prototxt。

這裡寫圖片描述

2、為什麼我的效果不行?
很可能時你的資料沒有對其。這裡,我給出一個當時訓練的記錄。

這裡寫圖片描述
如果你訓練的結果與最終的結果不同,那麼很可能時資料處理有問題,具體可以參見這個。

3、作者在文章中提到了pca,到底如何對特徵pca?

注意:懇請大家不要加qq或者微信,原因有兩點
1-開始確實加了一些人,後來發現人太多。而且討論的問題都是私下討論,如果我恰好能解答你提出得這個問題,那我可能得回答好多遍
2-我還是覺得 有問題大家討論,思路多,把問題寫出來,然後,我也可以更新部落格,其他人遇到問題,也有地方查詢,省去不必要的彎路。
謝謝