关于Caffe之Contrastive + Softmax在CASIA-WebFace上的实验

来源:互联网 发布:前端软件外包交易平台 编辑:程序博客网 时间:2024/06/09 16:51

有了在MNIST上softmax和contrastive结合在一起的实验的经验,故可较容易的推广到人脸大数据库CASIA-WbeFace上,类似的通过修改部分的caffe源码来跑些网络实验之。


前记:

我是在工作中接触到深度学习并有了些了解,算是基本入门,同时也了解一些人脸识别的技术,但平常的工作都和这些无关。由于时间和资源有限等的限制,本次的整理也是在做完实验的半年后了,但希望本实验对大家有用。如果下面的一些描述有问题麻烦反馈给我。


本文代码在百度云盘,链接: http://pan.baidu.com/s/1o8CTe8i 密码: 5abc


1.   文献综述

1.1 参考文献:  

[1]. Deep Learning Face Representation byJoint Identification-Verification, Yi Sun, Yuheng Chen,

Xiaogang Wang, Xiaoou Tang.

[2]. Learning Face Representation fromScratch, Dong Yi, Zhen Lei, Shengcai Liao and Stan Z. Li.

[3]. Learning Robust Deep FaceRepresentation, Xiang Wu.

[4] Deep convolutional net-work cascade for facial pointdetection. Y. Sun, X. Wang, and X. Tang.

[5]. FACE++_Naive-Deep Face Recognition Touching theLimit of LFW Benchmark or Not, Erjin Zhou, Zhimin Cao,Qi Yin.

 

文献[1]是大家熟知的DeepID2,大牛们写的文章,在网络上有了较多的介绍,特别是CSDN上雨石的几篇文章,也有跑的model释放。DeepID2用到了Joint Identification-Verification即是softmax和contrastive结合在一起的想法(当然还有多网)。

 

文献[2]中中科院李子青教授团队的文章,释放了10575个人的人脸数据库CASIA-WbeFace,是10个卷积层 + 1个全连接层 + dropout + softmax + contastive的网络结构。

 

文献[3]提出了一个网络(曾跑过,跑的结果和文献中一样),这里提及文献[3]主要是因为作者释放了model和做人脸5个关键点处理的Matlab代码(我做实验时借用了),另外文献[3]借用了文献[4]中提供的人脸5个关键点的exe工程(我也是用的这个)。

 

文献[5]中提及了图像少的人可能对训练结果有坏的影响,最好舍掉这些人的图像。另外也提及用Joint identification and verification没有效果?。

 

1.2 鉴于以上文献,本实验是通过以下来组织的:

Step 1. 利用文献[4]中提供的人脸检测和人脸特征点定位工程exe,运行在文献[2]中释放的人脸数据库上;

Step 2. 根据文献[5]的说法,去掉人脸检测后图像少的人,即只选取10575中的图像最多的10010人;

Step 3. 利用文献[3]中的5个人脸关键点的Maltab处理代码做人脸归一化144*144,并通过截取部分即128*128和镜像变换来增大图像库;

Step 4. 利用caffe构造leveldb,训练之,这里的网络结构是文献[2](不过因为输入是128*128,所以修改了pool5即 avg size 7*7变成 8*8),具体见相关代码。

注1:曾跑过DeepID、熟练很快,但单网时在LFW上只有80%多,原因可能很多,故在这里不直接跑DeepID2。

注2:上面的Step1~3有很多的处理方式,这里的处理是因为资源有限,本实验主要是实现Step 4中的softmax + contrastive.

 

 

2. 实验的目的:

在CASIA-WebFace上实现softmax和contrastive的结合(其中网络结构是文献[3]),并在LFW上做一些结果比较。

 

3.   实验方法:

为了实现softmax和contrastive的结合,需要尝试修改caffe源码,包括 accuracy_layer.cpp, contrastive_layer.cu(cpp), softmax_layer.cu(cpp)等(具体的修改细节见下方或提供的修改后的caffe代码)。

 

3.1   创建训练用的leveldb

人脸检测和5个关键点定位做归一化后,只选取10575中的图像最多的10010人,接着写些代码生成训练和测试leveldb用的两个txt文件,如train_softmax_contrasitive.txt(for train leveldb),test_softmax_contrasitive.txt(for validleveldb)。生成后的txt内容如下:

0004266/001_cc0.jpg1 0004266/539_ur2.jpg 1

… …

0004266/299_rs1.jpg1 0543383/153_ul2.jpg 312

… …

 

即每一行都有两个图像的名称和它的label(取值1~10010),比如在后一行中,第一个图像名是0004266/299_rs1.jpg,它的label是 1,第二个图像名是0543383/153_ul2.jpg ,它的label是312(注:第一个图像中004266是CASIA-WebFace中人的编号,001_rs1中001是原图像001.jpg, _rs1是扩增图像时自定义的标志)。

 

这里0004266/001_cc0.jpg 1 0004266/539_ur2.jpg 1是相同label的contrastivepair,而0004266/299_rs1.jpg 1 0543383/153_ul2.jpg 312是不同label的contrastivepair.

 

这里test_与train_的样本比例是1:5,而构造训练样本的contrastive pair时同一个label与不同label的比例是1:10。在文献[2]中大体提及了如何构造pairs:For Softmax cost, we just need input face images and their labels,but for Contrastive cost, we need generate face pairs by sampling from thetraining set.Toreduce the consumption of memory and disk space, we just sample thepositive and negative face pairsonline within each batch. The face pairs acrossbatch are not covered. How to generate complete face pairs effectively is left tofuture work.文献[2]是线上,这里是线下。

 

接着,利用train_softmax_contrasitive.txt和test_softmax_contrasitive.txt生成leveldb,通过example/CREATE_CASIA_SOFTMAX_CONTRASITIVE_LEVELDB/convert_imageset_casia_softmax_contrasitive.cpp,它读取txt里的信息并生成leveldb,这个cpp有个主要的函数是ReadImageToDatum_double(),它是在include/caffe/util/io.hpp定义的(注:仿照已有的函数ReadImageToDatum()自定义的),实现是在src/caffe/util/io.cpp中。

由于使用shuffle方法,所以也修改了include/caffe/util/rng.hpp即在rng.hpp中添加了template<class RandomAccessIterator, class RandomGenerator> inline voidshuffle_double()函数。

 

小结,以上为了生成训练用的leveldb,我们修改的caffe源码文件有:

include/caffe/util/io.hpp

src/caffe/util/io.cpp

include/caffe/util/rng.hpp

 

特别的,我们对于ReadImageToDatum_double()生成leveldb时label的处理如下:

label = 第一张图像的label*100000 + 第二张图像的label;

这样的处理是为了:

>  Softmax层,可以提取出第一张图像的label;

>  contrastive层,可以提取出第一张和第二张图像的label以判断它们的label.是不是相同

注:关于第一张图像乘以的10w,如果库里的人数大于10w时,应该考虑修改此处label的计算公式。

 

3.2需要修改网络结构和代码来训练

首先,修改网络结构,具体见:

examples/CASIA_SOFTMAX_CONTRASITIVE/cias_web_train_test.prototxt

 

接着,修改三个涉及到label的cpp,即

src/caffe/layers/accuracy_layer.cpp,

src/caffe/layers/contrastive_layer.cu(GPU),

src/caffe/layers/softmax_layer.cu(GPU),

修改的细节主要是对应的label处,具体见代码。

 

3.3 关于训练过程的一些细节点,即constrastive的margin, Hyperparame和dropout

在训练的过程中,需要考虑三个参数:

>  Hyperparame , DeepID2中给出0,0.05,正无穷时的对比;

>  margin,需要手动调节,正如DeepID2中所说:Instead, m is fixed and updated every N training pairs (N ≈ 200,000 inour experiments) ,一般的,训练刚开始时,一个pair的L2非常小,训练比如10w后,会变得非常大。

在训练过程中,可以打印一些pair的L2数据,观察之以调整margin。另外训练过程中,如果发现accuracy不再提升,这时应该要考虑调整margin和Hyperparame 了。下面给出我调整的一次过程:

               迭代次数                

       Hyperparame        

        margin    

1w~16w

0

40

16w~21w

0.05

80

21w~30w

0.05

120

30w~35w

0.01

300

35w~47w

0.005

1000

47w~59w

0.005

2000

59w~600w

0.005

3000

这里,constrastive的margin和Hyperparame 的调整是在 src/caffe/layers/contrastive_layer.cu(GPU)中。

 

> 关于dropout,发现如果dropout设置的太大,比如0.7时会导致网络不收敛,这里在训练dropout的值设置如下:

迭代次数            

dropout               

1w~300w

0.3

300w~380w

0.5

380w~600w

0.7

这里,dropout的调整是在 examples/CASIA_SOFTMAX_CONTRASITIVE/cias_web_train_test.prototxt 


3.4 最后,利用训练的model来提取特征

提取特征的过程和只有softmax一样,具体见

examples/CASIA_SOFTMAX_CONTRASITIVE_EXTRACT_FEATURE/

 

实验结果:

在LFW做个对比实验,对比的结果可能会有些潜意识的偏向,请大家仔细实验辨别。

这里,对比实验的方式有两种:

> 一种是不用contrastive即只用softmax(dropout =0.3,修改的原因是发现0.4时收敛慢些)

>  另一种是softmax+contrastive即和文献[2]的一样。

另外提取特征时用的model是训练时loss稳定时的model。 

实验方式

PCA前(即320 dim)

PCA后(即160 dim)

Softmax

 (iter 240w)

cosin: 96.40

cosin: 97.03

L2: 92.78

L2: 92.78

Softmax+contrastive

(iter 420w)

cosin: 96.90

cosin: 97.3667

L2: 96.25

L2: 96.25

以上数据显示 :有了contrastive层后, L2的结果提升了很多即从92.78提升到96.25

DeepID2中选取的25个不同的人脸区域的得分是从91.40到96.33,而这里训练的L2的结果96.25跟DeepID2最高的96.33差不多,故或许用多网、在LFW上的结果会再好些。

 

撰写者:孔勇20161015

注:本实验大体是在4月份做的,但困于时间且手头上的资源有限、拖后整理了。



0 0
原创粉丝点击