版权声明:本文为博主原创文章,码字不易,未经博主允许,不得转载:https://mp.csdn.net/postedit/79718833。
这篇文章:DEX: Deep EXpectation of apparent age from a single image (点我下载)
是2015年ChaLearn LAP(Look At People)的冠军之作,也是我准备搞基于深度学习年龄估计方面阅读的第一篇重要文章,也是我第一次发表原创博客的开篇。文笔一定不怎么样,但是主要目的是想开始通过总结读过的优秀文章,将其进行整理,以便建立一个系统的知识架构,也算是自己的宝贵财富吧!
由于对人脸年龄估计,人脸识别这块接触不是很多,所以难免会有理解不到的地方,只是将主要思想进行下整理,将来阅读多了或者接触到更多的资料,可能会了解更加深入,不过目前为止,也只能这样了先。
说起人脸估计,首先得搞清楚一件事情,年龄的种类,有的朋友可能要问了,年龄有种类?当然,这也是我从文章中看到的,在此进行一下记录,也顺便再复习一遍。出处(A Cascaded Convolutional Neural Network for Age Estimation of Unconstrained Faces(点我下载) )
分类:
真实年龄(Actual age:real age of an individual ):实际上就是我们正常人从出生到现在按照年份计算的年龄
外貌年龄(Appearance age:age information shown on the visual appearance. ):就是一个人的外貌透露出来的年龄。
表面年龄(Apparent age:suggested age by human subjects from the visual appearance ):这个是其他人对你的外貌进行评估,认为的你的年龄,也就是别人对你的年龄的估计(99%不准确,但如果是多人评估的均值就会准确多了)。
估计年龄(Estimated age: recognized age by an algorithm from the visual appearance ):这个就是通过你的外貌,利用算法计算出来的年龄。
当然,第二条和第三条之间的划分我觉得比较模糊,甚至有点不解。外貌年龄不就是别人看你的年龄嘛,和第三条没啥区别吧?不过大神是这样划分的,我也只能暂时理解成这样:表面年龄就是你自己照镜子时感觉出来的你的年龄(我还年轻!),而表面年龄就是别人看你时,感觉出的你的年龄。如果这样解释,区别还是存在的,自我感觉当然和别人感觉不一样,肯定是自我感觉良好嘛!
---------------------------------------------------快乐的分割线- -!---------------------------------------------------------
本文正式开始:
文章的主旨是利用深度学习的方法进行表面年龄估计,姑且先不管结果怎样,个人感觉最大的贡献就在于:IMDB-WIKI(点击名称打不开的话,点我)数据集的公开。。。因为年龄和性别之类的都属于个人隐私,现有的数据集数据量太少,想要大量获得又不是很方便,(除非你是XX地方的人),训练时很容易过拟合,因而有了这个数据集,你就可以做很多工作,可以说是做年龄估计、人脸检测、识别方面最宝贵的资源了。
先贴算法流程
通过上面流程可以一目了然,有了这个基础之后就好理解了。
论文摘要部分翻译起来大概是这样的:
通过将年龄估计问题看做是回归->分类+softmax期望结合的问题,使用的网络是VGG-16,先在ImageNet上进行分类预训练,然后在作者搜集的IMDB-WIKI(点击名称打不开的话,点我)数据集上进行微调,最终获得了第一名。重要的是:这篇文章中并没有使用人脸特征点提取等预处理方法。
这里说一下利用深度学习进行年龄估计问题时的解决方法:
(1)分类问题:很明显,可以将人的年龄看做不同的类,比如0-100岁,共101个类别。
(2)回归问题:这个也比较明显,因为人年龄的连续性,所以可以将其看做一个连续数值的预测,只不过这个连续区间是整数。
(3)分类回归问题:通过将年龄进行分组,比如0-10,11-20...,这样就可以先将年龄划分到某一个区间,然后在这个区间进行分类或者回归,个人理解,这两个步骤应该都有研究,比如先分类后回归,或者先回归后分类。只不过目前看的文章还很少,也不是很确定。
本文中,作者就是将人的年龄划分为0-100共101个类别,通过对年龄进行分类,并获得每个预测年龄的可能性,再乘以各标签年龄,最终得到年龄。因此作者称这种方法为:We pose the age regression problem as a deep classification problem followed by a softmax expected value refinement
论文的主要步骤如下:
(1)面部检测
对于训练数据和测试数据,作者首先使用了Mathias面部检测器进行面部位置检测,然后进行面部校准(配准?)。
校准过程不仅对原始图像进行面部检测,而且对同一张原始图像旋转之后的图像也进行了检测,旋转度数为-60°~60°,每隔5°旋转一次。而且也进行了-90°, 90°,180°三种旋转,并利用面部检测器进行检测。最终利用最严格的检测分数获得的面部图像,将其旋转至正面的位置(We take the face with the strongest detection score and rotate it accordingly to a up-frontal position.)(这里不太理解,可能没用过Mathias这个东西,但感觉可能就是将面部进行配准,然后使其正面朝前的意思,便于后续进行特征提取等)。对于不能检测到面部的图像,作者将其整个作为输入(简单粗暴,实际上在最终测试的时候,仅仅有一张图片没有检测到,不影响大局)。
在获得了面部图像之后,作者紧接着分别对该面部图像进行了上下左右四个方向的扩充,分别扩充该面部图像原始大小的40%,这样做的好处就是为了增加上下文信息,提升预测精度(应该是常用手段吧?类似yolo里面进行的各向异性缩放?)。如果面部图像已经占据了整个图像大小的大部分,那么就在图像边缘地方进行扩充,以保证脸部始终在图像的相同位置。(这点有点不懂)然后对所有获得的面部图像进行简单粗暴的resize,结果为256*256大小
(2)网络架构
所使用的网络为VGG16,预先在ImageNet上进行分类训练,然后在作者搜集到的IMDB-WIKI数据集上进行微调。
单独回归器训练的时候,将VGG16最后一层神经元改为1个,从而获得回归年龄。
单独分类器训练的时候,将最后一层神经元数目改为101进行分类,从而获得每个类别的概率。
最终通过将分类器各个类别概率乘以对应的年龄,得到网络预测的年龄:
,其中,O表示输出层的101个维度,o表示属于某个类别的可能性,y表示某一个年龄。
(3)网络集成
在IMDB-WIKI数据集上进行了微调之后,作者又对ChaLearn LAP数据集的数据进行了微调,方法如下:
将数据集划分为20个不同的分组,每个分组中的90%图像用来训练,另外10%进行验证。其中,这每个分组中训练集与验证集的划分并不是随意划分的,而是在保证每个分组中,年龄的分布都相同的前提下进行的。
同时,在对每个小组进行训练验证集划分之后,对于训练集和验证集中的每张图片都进行10倍数据量的数据增强,做法是是图像随机旋转-10°~10°,平移-10%~10%,随机缩放系数为0.9~1.1,这样可以保证在训练集和验证集都不存在交叉(否则先对小组数据进行数据增强之后,再进行训练验证集划分时,可能导致验证集也包含有训练集的增强图片,导致结果虚高)
这样,便可以在20个分组下训练得到20个不同的网络。将每个网络中获得结果最好的权重保留下来。
在最后进行预测的时候,是20个网络的平均值作为预测结果。
下图是在LAP数据集的验证集上取得的结果
(4)评价指标(损失函数)
本文对结果进行评价时采用的方法分别是MAE和,其中后者是该比赛要求使用的标准评价方法。
MAE:顾名思义,就是mean absolute error,计算结果与标签之间的绝对值误差
:因为LAP数据集标注的年龄是不同人对于同一个人进行年龄估计的均值,因此其包含均值和方差两个属性。因此,该误差的计算方式如下:
总结:
可以看出,本文的运算量其实是很大的,仅仅ImageNet上的预训练就花了5天,在最后微调的时候,每个网络分别花了3小时。
但你懂得,凡是能够取得state-of-art精度的算法,有几个不是过程繁琐,计算复杂的?
贴一张该算法预测成功案例:
再贴一张失败案例:
可以看出,失败案例中,失败的原因有多方面:人脸检测时检测到背景模糊的人脸,黑人兄弟的肤色和光照问题,面部遮挡问题,黑白照片问题(这是肯定的)。
最后贴一张2015 ChaLearn LAP比赛的前三名结果:
其中序号3不知原因,也懒得去查,如果有幸找到论文的话,可以进行一下拜读。
看完这篇文章,有两个最不明白的地方:
1.为什么预训练的时候选用的是ImageNet数据集,而不是人脸检测时用到的各种数据集,按理说,在后者进行预训练,会更多的利用到人脸的特征信息,不是更有利于后面的训练吗?
2.训练过程是先进行回归器的训练,然后再将最后一层改为101个神经元进行分类训练,得到结果?
文章创新点:
1. 提出了将年龄估计问题看做是回归-分类问题,使用分类概率乘以对应标签,得到一个回归结果。该结果比单独分类、回归精度高很多
2. 作者开放了数据集IMDB-WIKI(下载请点我,如果点不开,请点我),有利于今后进行进一步研究,也为年龄估计提供了更深入的思考空间。
如果改进:
如果将VGG16改成其他网络比如ResNet类,利用更深层次的网络训练,不仅可以减少参数,而且应该还能提升精度和速度。
此篇文章权当练笔,表达较为直白,没有很多大牛的幽默风趣,引人入胜。日后有机会,再慢慢修炼吧。
也许是没有看源码的缘故,可能理解不够,也有不到位的地方,请大家指正!
下一篇计划写该比赛第二名的文章。
参考文献:
DEX: Deep EXpectation of apparent age from a single image
A Cascaded Convolutional Neural Network for Age Estimation of Unconstrained Faces