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更快,而且不需要像前两者那样构造大量的训练对。

看一张图:

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现_第1张图片

在左图中,我们发现一个类如果太胖,那么出现的结果就是类内距离>类间距离。(任意红点之间的距离应该小于红蓝之间的距离。)
左边时softmax一般结果,右边时centerloss结果。我们期望特征不仅可分,而且时必须差异大。如右边图。

2、centerloss

2-1 softmax loss

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现_第2张图片

其中: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. 数据集就一样图片。那么公式就是简化成:

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现_第3张图片


我还是一图解千言吧:

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现_第4张图片

可以发现,这个softmax的损失仅仅与正确那项的概率相关。


2-2 center loss

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现_第5张图片

其中,Cyi 代表第 yi 类深度特征的类心。


2-3运行截图:

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现_第6张图片

3、验证

在lfw上验证结果:
这里写图片描述

这个图片回答了:batch_size 对于训练收敛速度有没有影响。

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现_第7张图片

我们看到bath_size 大的情况下。虽然每次迭代时间消耗比batch_size =70 的时候大。但是batch_size =256的情况下。下降的更加稳健。比较少的出现波动。另外,对于最终的对于测试LFW精确率有一定的影响。

4、小结

对于深度学习,数据成为核心,那么这个实验的核心也是数据的预处理。
LFW的数据处理应该与CASIA数据集处理方式相同。
其中检查自己的数据处理方式好不好的一个直接有效的方式是:

【1】LFW中有很多图片包含多人脸。你的算法是不是裁剪的图片正中心的那个人?

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现_第8张图片

【2】Alignment做的怎么样?很明显最后一张对齐有问题。

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现_第9张图片

【资源分享】
【1】我这里提供一个已经裁剪好的LFW用来测试:http://pan.baidu.com/s/1kVzA599
【2】这里补充一个剪裁好的图片用于LFW测试的正负样本对
POSTIVE_PAIR.txt
NEGATIVE_PAIR.txt
【3】一份用模型提取特征的matlab脚本

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、为什么我的效果不行?
很可能时你的数据没有对其。这里,我给出一个当时训练的记录。

A Discriminative Feature Learning Approach for Deep Face Recognition 原理及在caffe实验复现_第10张图片
如果你训练的结果与最终的结果不同,那么很可能时数据处理有问题,具体可以参见这个。

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

请参见我的另一个博客:图像特征提取系列之pca

注意:恳请大家不要加qq或者微信,原因有两点
1-开始确实加了一些人,后来发现人太多。而且讨论的问题都是私下讨论,如果我恰好能解答你提出得这个问题,那我可能得回答好多遍
2-我还是觉得 有问题大家讨论,思路多,把问题写出来,然后,我也可以更新博客,其他人遇到问题,也有地方查找,省去不必要的弯路。
谢谢

你可能感兴趣的:(caffe,faceRecg)