本文主要讲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
一句话:通过添加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. 数据集就一样图片。那么公式就是简化成:
我还是一图解千言吧:
2-2 center loss
其中,Cyi 代表第 yi 类深度特征的类心。
2-3运行截图:
3、验证
这个图片回答了:batch_size 对于训练收敛速度有没有影响。
我们看到bath_size 大的情况下。虽然每次迭代时间消耗比batch_size =70 的时候大。但是batch_size =256的情况下。下降的更加稳健。比较少的出现波动。另外,对于最终的对于测试LFW精确率有一定的影响。
4、小结
对于深度学习,数据成为核心,那么这个实验的核心也是数据的预处理。
LFW的数据处理应该与CASIA数据集处理方式相同。
其中检查自己的数据处理方式好不好的一个直接有效的方式是:
【1】LFW中有很多图片包含多人脸。你的算法是不是裁剪的图片正中心的那个人?
【2】Alignment做的怎么样?很明显最后一张对齐有问题。
【资源分享】
【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、为什么我的效果不行?
很可能时你的数据没有对其。这里,我给出一个当时训练的记录。
如果你训练的结果与最终的结果不同,那么很可能时数据处理有问题,具体可以参见这个。
3、作者在文章中提到了pca,到底如何对特征pca?
请参见我的另一个博客:图像特征提取系列之pca
注意:恳请大家不要加qq或者微信,原因有两点
1-开始确实加了一些人,后来发现人太多。而且讨论的问题都是私下讨论,如果我恰好能解答你提出得这个问题,那我可能得回答好多遍
2-我还是觉得 有问题大家讨论,思路多,把问题写出来,然后,我也可以更新博客,其他人遇到问题,也有地方查找,省去不必要的弯路。
谢谢