本篇论文事实上可以看作人脸识别的深度卷积神经网络训练和测试指南。论文中对网络结构的篇幅并不长,但是论文中关于数据收集、训练方式和测试方式的结论值得借鉴。
本篇文章的目的有两个:一是“以少胜多”,对于一般研究机构而言,获取庞大的数据集是不太现实的,但是深度卷积神经网络的训练效果和训练数据的规模有关系,本论文提供了一种能用有限的人力资源获取规模较大的人脸数据的方法;二是“去粗取精”,本篇论文尝试了各种人脸识别的CNN结构,探究结构中哪些部分对人脸识别的效果有贡献,哪些部分起不到积极作用。
一、数据收集:
Stage1. 获取数据集的名单:从IMDB名人名单里选取2500个男性和2500个女性,去掉正脸太少的名人,去跟标准基准数据集重合的数据,人工筛选同名的或者图像不足的,再删掉出现在LFW和YTF 中的。这样我们得到2622人的名单。
Stage2. 获取图片:在Google或者Bing搜人名,每个搜索引擎每人各下载500张图,再搜人名+演员,每搜索引擎每人各下载500张图,得到每人2000张图。
Stage3. 用自动过滤器提升纯度:用前50张Google搜素得到的图片作为正训练样本,以线性SVM和Fisher向量描述器评估其他人脸与这50张人脸的相似度,每个人留下1000张图。
Stage4. 移除复制的图片:计算每张图的VLAD描述,用非常苛刻的阈值对1000张图片聚类,能聚到一类说明可能是同一张图或者是同一张图做了一点颜色调整变换的,聚类结果中每一类只取一张图。
Stage5. 人工过滤:用训练过的AlexNet中的softmax层判断一组人脸中是否有错误的人脸,每组200张图送入网络,如果纯度达到95%以上则认为这200张图片是比较纯净的。最后留下982803张图,其中有95%的正脸和5%的侧脸。
二、网络结构和训练
本文用了A,B,D三种网络结构,A的网络结构如上图,B的网络结构比A多2个卷积层,D的网络结构比A多5个卷积层。网络输入224*224的图片,A是从头开始训练的,B和D是在A的基础上finetune的。
一种训练模式为:将每张图片送入网络提取特征,再用输出为N(N=2622)的全连接层(在A中就是fc8)把每个特征对应的分数算出来组成向量,和各个类的独热向量比较,计算softmax对数损失。
分数向量:
Softmax对数损失:
另一种训练模式为:令triplet损失最小化。提完特征后,将它标准化并投影到维数更低的空间,再计算triplet损失。也就是说,替换fc8和之后的部分。
标准化和投影:
计算triplet损失:
测试时,用是否大于阈值来判断是不是同一个人,这个阈值是用与训练集不同的验证集计算出来的。
三、测试与实验
1. LFW:分别剪下256*256,384*384,512*512的人脸,翻转,从原人脸和翻转人脸的四角和中心各取一张,共30张,取平均为该图片的特征。用EER和ROC评估。
从中可以看出该方法的优越性。
还可以看出:
①数据:C为一中stage5的结果,F为一种stage3的结果,即使有噪声,更多的训练样本也对训练网络更有帮助,而stage5事实上把一些比较难的训练样本过滤掉了;
② Alignment:训练集做不做Alignment差别不大,但是测试集做一下会有提升;
③结构:B的效果最好,而D的网络层数太多了,需要训练的参数也多了很多;
④ Triplet:可以提升效果。
2. YTF:YTF每一个人都有好几个视频片段,每一个片段下有很多帧的图片,对它们做alignment,然后根据颅面特征点的分数,选取最好的K帧,对正脸做Alignment,不对侧脸做,平均K个人脸的特征作为这一截视频的特征。
四、我的疑问和思考:
1. 尚不明了triplet的具体实现方式。
2. 从512*512,384*384那么大的区域裁224*224的人脸?没有尝试过,不敢相信效果会更好。
3. 不明白论文第7页training部分的一句话:The data was further augmented byflipping the image left to right with 50% probability
相关链接:
http://www.robots.ox.ac.uk/~vgg/software/vgg_face/