FaceNet2ExpNet: Regularizing a Deep Face Recognition Net for Expression Recognition论文个人解读
本文章纯属作者对该论文的个人理解,如有错误,欢迎大家指正~
问题:
表情识别的小数据集在人脸识别模型上进行迁移学习,使用表情数据微调人脸识别模型后存在两个问题:
(1)经过微调的人脸识别网络可能仍然包含对人脸样本识别的信息。这是由于面部数据集和表情数据集之间存在较大的差距(几个数量级),可以参考下图1。
(2)针对人脸识别领域设计的网络对于表情任务来说往往过于庞大,因此存在过严重的拟合问题。
从该图可以看出,微调的人脸网络仍然保存了大量的人脸信息
方法:
本文提出了一种新的学习算法FaceNet2ExpNet,该算法结合人脸领域知识,对表情识别网络的训练进行调整。首先提出了一种新的分布函数,利用人脸识别模型中获得的信息对表情模型的高级神经元进行建模。接下来,为了进一步提升特征的判别力,通过标签的强监督信息来精炼网络。我们采用一个在卷积块后接全连接层的传统架构来设计我们的表情网络。训练实施分为两个步骤:
(1)仅仅训练卷积层。利用人脸网络的深层特征作为监督,使学习变得更加容易。它还包含关于人脸的有意义的知识,这对表情识别也很重要。
(2)在第一阶段学习完成后,加入随机初始化的全连接(FC)层,并在第二阶段利用类别label信息训练整个网络。有研究出,FC层通常捕获区域特定的语义。所以我们只使用FaceNet来指导卷积层的学习,FC层是从头开始训练的。此外,我们通过实证发现,由于低熵神经元(后面会解释)的信息丰富性,中后期(如vgg - 16的pool5)更适合进行监督训练。在这两个训练阶段,只使用表情图像。
1、定义卷积层训练的损失
Xc表示网络第L层输出的feature map的第c个通道的均值,令Xl = [X1,X2...Xc]表示第L层输出的每个通道的均值的集合,也将其作为网络的输出,与对应的FaceNet的卷积层的输出做cost function:
其中||Xl-u||pp表示对其取Lp范数,Cp为归一化常数,u表示FaceNet的卷积层输出的通道均值向量(与1式一样),注意这里u和X的通道数要一样,如果不一样可以使用1x1的卷积使通道数其变得一样。根据极大似然估计求得:
这里的G(I)表示FaceNet某卷积层的输出,g(I)表示ExpNet的卷积层输出。这里是使两个输出的Lp范数最小。文章使用的是L2范数。
2、训练方法
(1)通过1的方法训练卷积层。
将face net参数冻结,用最后一个pooling层的输出来对ExpNet进行监督学习,即用pooling的输出作为ExpNet的监督值。卷积层的配置为卷积加maxpooling,卷积核的个数分别为64,128, 256, 512, 512。卷积和大小为3x3,maxpooling大小为3x3,strids为2。 并在该阶段训练的时候使用非常小的学习率1e-7, 300个epoch,每100次进行学习率衰减。
(2)训练全连接层。
在第一步训练的卷积层后面加上全连接层,为了避免过拟合仅用了一个256大小的全连接层,且用高斯分布随机初始化权重。该阶段的学习率设置为1e-4,每20个epoch衰减0.1。两阶段都是用的SGD进行优化。
测试时,将图片的中间区域进行裁剪成224x224。采用的Face net网络为“Deep Face Recognition”论文中的网络。
3、选择FaceNet哪一层的输出作为监督?
论文以VGG16为例,研究了神经元对表情的敏感性。对于每一个神经元,images被最大响应值排名,然后top K的images被抽出来。响应值的定义看下面论文部分截图:
这一部分大致意思是将top 100的图像根据其标签分类,然后计算该神经元x的熵值H(x),下面是我对这个H(x)的理解:
p(i)是类别i中含有的图像数目,n表示的所选取的top 100图像中有多少个label。对每一个类别i,做p(i)*log(p(i)),当然如果直接将p(i)代进去的话是得不到下图中熵值在0-3之间的。
作者在上文中的括号中写道“we normalize the histogram to sum to 1”,他这里其实是将p(i)转化为概率了,即p(i) = p(i)/100.0。 这样的话就可以让神经元的熵值H(x)取值在上图中的(0,3)之间了。不妨来做做实验。
番外实验:
假设我们的top 100是这样的:
a = [1,5,20,30,10,11,23] #一共有7个类别,其中对应的是每个类别的频数。
a = np.array(a)/100.0 #将其转化为概率
#计算熵值H(x)
H = -sum(a*np.log(a))
#结果为:
H = 1.69
如果神经元有较低的熵值,则它应该对表情更敏感,因为较低的熵值可以表示其表情分布有峰值,越低峰值越明显,这个可以自行计算一下就会发现这个道理。
由于低熵值的神经元表明了隐藏层的判别力,我们接下来计算每一层的低表情值(LES)神经元的数量。这里的LES指的是小于最小平局熵值(所选择的层中熵均值最小的那个)的那部分值。在论文中,作者选择的是VGG16的pool4、pool5、FC6、FC7四层的输出作为实验。结果如下:
发现从pool5开始,fine-tuned网络的LES神经元数量显著增加。此外,卷积层的LES神经元数量明显比FC层多。表明pool5在监督信息丰富和具有判别性中是一个不错的层。因此我们可以选择将该层的输出做为对ExpNet的监督信息。