《AgeNet-Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation》阅读笔记

年龄一个人的基础属性,它就好像一个年轮,每年在我们脸上刻出新的印记。
女人永远希望自己年轻,小伙子不愿意别人感觉自己年龄尚小。这是大家的一个秘密。

有没有一种能窥探他人年龄的神器呢[斜眼笑]?

先来谈谈如何定义我们想知道的年龄吧。
我们可以把年龄分为两种:

  1. 实际年龄(real age)
  2. 表观年龄(apparent age)

从字面意思很容易理解,除非严格地从骨龄信息去推导,我们所能知道的,总是他/她的样貌年龄。而若我们估测的样貌年龄能最大限度的等同于实际年龄,会让大家有一种:“哇塞,怎么这么准!”的感觉。

本文将整理总结表观年龄估测的重要系列研究成果。

age-estimate-cover-1.jpg

背景与基础概念

首先需要详细定义一下表观年龄,表观年龄是在仅给出每个个体的照片的情况下由不同的志愿者标注出的年龄。与真实年龄相比,标注的表观年龄是可变的,但是不同标注者标注出的年龄均值通常是高度稳定的。

表观年龄目前使用得比较多的数据集:

  • ICCV2015 Looking at People Challenge dataset,总共包含了 4699 张图像,每一张图像带有一个均值标注以及标注的标准差。
    iccv-2015-dataset.png
    其中Apparent age是最终的平均表观年龄,Std是标准差

AgeNet

论文全名为《AgeNet:AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation》

该论文由中科大智能信息处理重点实验室和腾讯优图团队共同完成。

摘要

该文提出将年龄预测拆解成实数值的回归模型高斯标签分布 (Gaussian label distribution)两种预测模型,并进行融合分析的解决方法。在ICCV2015 Looking for People Apprant Age Estimation Challenge中取得了开发组第一、最终测试组第二的成绩。

创新点

该论文的拥有两个个创新点:

  1. 将年龄预测独立的分成分类和回归两个任务,基于深度卷积网络进行训练后,把分类模型和年龄回归模型进行融合,把最终的融合结果作为年龄的最终预测值。

  2. 为了降低在小规模训练集上的过拟合训练风险,提出了一套通用到特定(general to specific)的迁移学习训练路线:首先使用大规模的从互联网收集人脸图像进行分类预训练,随后使用大规模的带有噪声的真实年龄数据集进行微调,最后才在很小的表观年龄训练数据集上进行微调。

概念基础

文章总结了一下常见的对年龄进行编码的方式:

  1. dimension real-value encoding
    用一个实数值代表一个人的年龄,可以用回归模型进行建模。

  2. 0/1 encoding
    把不同的年龄当做不同的类,即 [0,0,0…,1,0,0],把年龄估计看做分类问题。

  3. Gaussian Label distribution encoding
    是高斯标签分布,对于一张给定的图片I,如果它的年龄是 y,那么使用一个多维向量来表达这个年龄label,这个多维向量的第j维是:

$$
l_j=exp(\frac{-(j-y)^2}{2*\sigma^2})/\sigma,j=1,…,M
$$

其中j是代表第j维值,y是年龄的ground-truth,σ是样本标准差,M是样本最大年纪。

gaussian-age-label.png
上图表示的是:表观年龄为21,标准差为4.0265的高斯分布年龄表述。

网络设计

network-structure.png

本文方法的基本思想是将年龄估计器同时建模为一个分类和回归问题,最后将两个模型进行互补性地融合来获取更好的性能。

本文的网络在GoogLeNet上进行了两处修改,首先移除了两个辅助损失层,然后在每一个ReLU前增加了BN,并且移除掉了所有的dropout来加速收敛。

在deep age regressor中,使用欧式距离来度量两个一维实值编码年龄的距离。为了避免网络中尺度不平衡的问题,在欧式距离loss前加入了sigmoid。

在deep age classifier中,年龄被编码为85维的高斯向量,使用交叉熵进行训练。

Deeply Learned Age Regressor

建模为端到端的回归问题,将表观年龄除以 100,然后将网络输出的标签增加一个 sigmoid 层归一化到 [0,1] 之间。随后计算欧式 loss:
$$
E(W)=\frac1{2N}\sum_{i=1}^N||\hat y_n-y_n||_2^2
$$

最后的年龄估计为:
$$
R=f(\hat y_n*100+0.5)
$$

Deeply Learned Age Classifier

最简单的方式是使用 0/1 编码结合 softmax loss,但是这种策略在编码距离时平等地对待了所有的年龄,没有考虑到邻近年龄估计的关系。(比如 label 是 35 岁,在网络输出 35 岁概率 0.1、38 岁的概率 0.9 与网络输出 35 岁概率 0.1、80 岁的概率是 0.9 两种情况下,产生的 loss 是相同的)。

因此在这里本文使用了前文介绍的 label distribution 方法编码,使用 sigmoid 交叉熵进行分类:
compute.png
网络在预测时,使用输出置信度最大的那一维代表的年龄作为估计值。

从通用到特定的训练方法

即前文已经介绍的 pre-train with face identities, fine-tune with real age, fine-tune with apparent age. 三个阶段的训练。

training-process.png
此外进行了一些人脸检测、人脸特征点定位以及人脸归一化的预处理。

最终模型的输出融合了 8 个网络的结果,使用不同的裁剪大小来训练分类以及回归器,在训练阶段只使用图像中央部位的 patch 输入到网络。
interior-exterior.png

上图的Face Template区分了Interior和Exterior,究竟什么是Interior和Exterior,下图能比较清晰的展现出来:
interior-exterior-example.png

其中,Exterior不仅包括了完整的人脸信息,还有部分背景,这样能增强识别的泛化效果;而Interior仅仅包含完整的人脸信息。

最终作者评估得到如下结论:

  1. 最佳效果的单模型是deeply learned age regressor with Exterior face template and crop size as 248。且总的来说,deeply learned age regressor总是比deeply learned age classifier更好一些

  2. 在年龄分类任务中,Gaussian Label distribution显著优于 0/1 encoding

  3. 总的模型融合能达到最好的结果输出

另外,作者还有如下的痛彻的训练心得:

  • 不预训练直接随机初始化训练网络时效果不好,因为网络在小的训练集上面过拟合。

  • 预训练人脸多分类网络比在真实年龄数据集上预训练效果更好,意味着从与相似的任务上使用大规模数据集训练可以提升网络的泛化性。

  • 尽管互联网搜集的人脸真实年龄标签有很多噪声,但是还是可以帮助提升表观年龄估计的性能,证明了这个从通用到特殊的迁移学习方法的鲁棒性。

ICCV2015上的实测结果

final-result.png|center
最终结果排第二名,很棒的对不对。然而可惜的是没有开源的代码,复现起来需要一定的时间。

-End-