人臉識別之caffe-face

該論文為2016年的一篇ECCV,ADiscriminative Feature Learning Approach for Deep Face Recognition。還是深圳先進院喬宇老師組的一篇。不管是思想還是效果都非常的棒。

論文思想:

整體流程就是讀取輸入的影象,然後做個前向傳播,應用softmax loss center loss學習到DiscriminativeFeatures,然後進行標籤的預測。

         softmaxloss可以實現將2個類別分開,center loss可以實現減少類類距離,增加類間距離的效果,有點類似,線性判別分析LDA(Linear Discriminant Analysis)的思想。在效果上優於contrastiveloss和triplet loss,解決了這2個方法在取樣問題中的trick。

         其中,softmaxloss公式如下:

center loss公式如下:

總體的損失函式就是下面的式子:

實際的mnist測試效果如下圖所示:

左圖為不加center_loss的效果,右圖為加了center_loss的效果。可見效果確實是不錯的。

最後,測試2張人臉影象的相似性,直接計算cosine distance,簡單的理解,2個特徵向量越相似,夾角就會越小,cos值就會越大,也就是2個人臉越相似。

注意事項:

因為必須首先確保matcaffe的正確安裝,linux下安裝成功的標誌為在cafferoot/matlab/ caffe/目錄下有caffe_.mexa64存在。同理,windows為caffe\Build\x64\Release\matcaffe\ caffe\private下有caffe_.mexw64存在。

 

直接跑測試的demo的話,原版的caffe就可以跑,因為雖然作者使用了center_loss,但是在檢測的過程中,只用到了前向傳播,在face_deploy.prototxt中是沒有center_loss這個layer的。

跑訓練的話就需要編譯作者提供的caffe了,裡面用到了center_loss,原版的caffe是不帶的,或者自己加進去,重新編譯下。可以看到在face_train_test.prototxt中是包含center_loss這一層的。

實驗結果:

測試影象如下,大小為816*816,

matlab原始碼執行效果:

本人改好的c語言release下執行效果(8G記憶體 XeonE3-1225)

本人改好的CUDA下執行效果(titanX)

官方程式連結:https://github.com/ydwen/caffe-face

http://ydwen.github.io/

人臉識別訓練:

該訓練最重要的其實還是資料集的準備,也就是先期資料的預處理,所有的圖片都要crop為112*96的大小,因為這裡是使用的caffe自帶的train進行訓練的。

修改face_train_test.prototxt中的相關引數,

18行:source的位置,訓練的圖片,格式為路徑/圖片名  類別(從0開始)

39行:source的位置,測試的圖片,格式為路徑/圖片名  類別

1146行:num_output,輸出的個數,CASIA有10575個,但是有3個和LFW一樣,所以這裡作者用了10572個

1175行:num_output,輸出的個數,CASIA有10575個,但是有3個和LFW一樣,所以這裡作者用了10572個

1180行:loss_weight,這裡作者程式中給的是0.008,論文中驗證的是0.003最佳,可以結合自己的資料集實際測試,本人測試效果差距不大,該引數為center_loss的乘積引數

然後下面的指令碼開始訓練,

cd $CAFFE-FACE_ROOT
./build/tools/caffe train -solver face_example/face_solver.prototxt -gpu X,Y

ps:CASIA-WebFace和LFW重複照片的對應關係為,

LFW識別率測試:

由於作者提供了其LFW資料集提取出來的特徵矩陣,所以,本人也對其LFW識別率進行了測試。

首先,LFW的這個測試,包含了6000對測試比對,其中3000對為同一個人的比對,3000對不同人之間的比對,下面貼一個本人寫的matlab小程式。

%directed by watersink2016.12.26
%any question,send me [email protected]
clc;clear;
pair = importfile('pair.txt',1, 6001);
pic1=pair(:,1);
num1=pair(:,2);
pic2_num2=pair(:,3);
num2=pair(:,4);
LFW_Feature=load('LFW_Feature');
similarone=[];
similartwo=[];
for i=2:6001
%    第一行不做處理
i
str1='';
str2='';
if  length(pic2_num2{i})<4
%處理同一個人
str1=strcat(strcat(strcat(pic1{i},'_'),num2str(num1{i},'%04d')),'.jpg');
str2=strcat(strcat(strcat(pic1{i},'_'),num2str(str2num(pic2_num2{i}),'%04d')),'.jpg');
else
%處理不同人
str1=strcat(strcat(strcat(pic1{i},'_'),num2str(num1{i},'%04d')),'.jpg');
str2=strcat(strcat(strcat(pic2_num2{i},'_'),num2str(num2{i},'%04d')),'.jpg');
end
numnum1=find(strcmp(LFW_Feature.list,str1)==1);
numnum2=find(strcmp(LFW_Feature.list,str2)==1);
similar=dot(LFW_Feature.feature(:,numnum1),LFW_Feature.feature(:,numnum2))/norm(LFW_Feature.feature(:,numnum1))...
/norm(LFW_Feature.feature(:,numnum2));
if length(pic2_num2{i})<4
similarone=[similarone;similar];
else
similartwo=[similartwo;similar];
end
end
%畫最後相似性得分圖
figure,plot(similarone);
xlabel('category');ylabel('similarity');title('oneself to oneself');
figure,plot(similartwo);
xlabel('category');ylabel('similarity');title('oneself to otherselves');
%測試不同閾值下的最終識別率
similiarityAll=[];
for threshold=0:0.0001:1
threshold
numpos=0;
numneg=0;
for i=1:size(similarone,1)
if similarone(i)>=threshold
numpos=numpos 1;
else
numneg=numneg 1;
end
if similartwo(i)<threshold
numpos=numpos 1;
else
numneg=numneg 1;
end
end
similiarity=numpos/(numpos numneg);
similiarityAll=[similiarityAll;similiarity];
end
bestthreshold=find(similiarityAll==max(similiarityAll));
figure,plot([0:0.0001:1],similiarityAll),hold on,plot(bestthreshold/10000,max(similiarityAll),'*r');
xlabel('threshold');ylabel('similarity');title('different threshold generate different similiarity');

上面第一個圖為,3000對自己和自己的影象進行比對的cos距離值,第二幅圖為自己和別人的圖片進行比對的cos距離值,第三幅圖為不同閾值(0-1)下的識別率,紅色標記的*表示為最佳的識別率。

本人測試的最終的最佳識別率為0.9875,該識別率下的閾值為

    0.4164
    0.4165
    0.4166
    0.4167
    0.4395
    0.4396
    0.4397
    0.4398
    0.4399
    0.4400
    0.4401
    0.4402
    0.4403

和作者論文中的0.9928還是有個小差距的。可能出錯的地方可能就是本人處理資料的某些細節可能和作者的不一樣把,或者這裡提供的不是最好的那個模型,而是一個供開源測試的模型吧,本人猜測。這裡,希望可以得到大神的指正。

程式和所需檔案下載連結:http://download.csdn.net/detail/qq_14845119/9721049