• 使用深度神经网络技术实现图片的相貌打分功能
  • 发布于 2个月前
  • 353 热度
    2 评论
国人对打分有一种异常的执着,无论是技能水平、考试成绩、年终表现还是——个人颜值。早在去年七八月份,一些开发者就注意到了华南理工大学人机交互实验室的开源项目——一个包含女生图片和打分记录的数据集,尽管有点恶趣味,甚至还有点冒犯,但这并不能阻止开发者们前赴后继去复现结果的决心。今年1月,相关论文SCUT-FBP5500:A Diverse Benchmark Dataset for Multi-Paradigm Facial Beauty Prediction终于浮出水面,这一次他们的数据集更大了(5500张),里面不再只包含女性,也添加了男性的内容……

摘要
面部美容预测(FBP)是一个重要的视觉识别问题,它可以被用来衡量由面部吸引力导致的人类感知情况变化。如果要实现这样一个能判断美丑的深度学习模型,一个优秀的基准数据集不可或缺。以前的研究一直把面部美容预测作为分类、回归或排序的特定监督学习问题来处理,这表明FBP在本质上是一个多范式的计算问题。然而现如今大多数FBP基准数据集数据量少、不具普适性,这就直接限制了模型的性能和灵活性。

为了解决这个问题,华南理工大学人机交互实验室开源了这个多样化程度较高的FBP基准数据集SCUT-FBP5500,它包含5500张正脸图像,具有不同的属性(男性/女性、亚洲/高加索人、年龄)和标签(面部标志、1—5五个打分等级、得分分布)。通过它,研究人员就能建立模型为各个人群的“颜值”打分,找出“美丽”的秘密,例如对于亚洲人/高加索人/女性来说,什么样的五官/脸型最有可能为目标人脸贡献美感。

SCUT-FBP5500数据集
SCUT-FBP5500数据集可以根据种族和性别分为4类,包括2000名亚洲女性、2000名亚洲男性、750名白人女性和750名白人男性。其中大部分图像都是在网上收集的,有一部分亚洲人像来自DataTang、亚洲像素和人机交互实验室,一部分白人图像来自美国成人人脸数据集(10k)。

实验室招募了60名志愿者为每张图片打分,分1—5五个等级,1分颜值最低,5分最高。同时他们也为准确定位图像中面部位置定义了86个面部标记。为了分别获得面部美容评分和面部标志位置,他们还开发了一个基于网络的GUI系统。

为了确保志愿者打得分数贴近“真实”分数,研究人员计算了得分的标准差,发现它们的分布符合高斯分布,且大部分标准差在[0.6, 0.7]的合理范围内。

论文成果
研究人员用了两种方法来评估SCUT-FBP5500数据集对面部美容预测模型的影响:
5倍交叉验证。对于每次交叉验证,他们把80%的样本(4400张图像)作为训练集,剩下的20%(1100张图像)作为测试集;
直接把60%的样本(3300张图像)作为训练集,剩下的40%(2200张图像)作为测试期。

论文测试用的CNN模型分别是AlexNet、ResNet-18和ResNeXt-50,指标则是Pearson相关性系数(PC)、最大绝对误差(MAE)和均方根误差(RMSE)。实验证明,ResNeXt-50的预测性能较其他两个模型更好,而5倍交叉验证的结果也比直接把数据集四六分的好。

实现一:女性图像颜值打分
去年8月,CSDN网友roguesir已经在文章你的颜值打几分?——基于tensorflow实现人脸打分模型中介绍过相关实现。当时华南理工的这个数据集只包含带有颜值得分(1—5)的500张女性图像,虽然人脸和评论是分开的,但他们还没有提供很完善的、用于人脸检测的标记。在预处理数据时,roguesir先用face_recognition提取人脸,再把提取得到的图片的大小设置为128× 128。

网络设计
虽然论文展示了AlexNet、ResNet-18和ResNeXt-50三个模型的结果,但无论是去年还是今年,他们始终没有给出相应的代码和确切的做法。

roguesir基于原始CNN代码训练了三种不同架构的模型:一种是三层卷积层和两层完全连接的层;另一个是有五个卷积层和三个完全连接的层,如AlexNet;最后一个是13个卷积层和三个完全连接的层,如VGG-16。感兴趣的读者可以访问github直接下载模型。

原始模型:含有三层卷积层和两层全连接层的CNN网络,网络结构较简单。github.com/roguesir/DL-ML-project/tree/master/Face-Scoring

Alex模型:类似AlexNet分类模型,含有五层卷积层和三层全连接层的CNN网络。github.com/roguesir/DL-ML-project/tree/master/Face-Scoring

VGG-16模型:类似VGG-16模型,含有13层卷积层和三层全连接层的CNN网络。

模型中加入BN,防止梯度爆炸。

训练

训练过程如下:
在GitHub上面clone代码
运行rename.py脚本将数据重新命名
运行findfacesinpicture.py,通过facerecognition库提取人脸图片
运行resize_image.py将提取的人脸图片设置为128×128
运行train.py训练原始模型,trainalex.py训练AlexNet模型,trainvgg.py训练VGG-16模型
运行test.py、testalex.py、testvgg.py即可对上述三个模型进行测试
说明:test脚本文件对应的模型结构一致,在train脚本文件中将训练的模型存储,以方便test文件调用。

测试

需要注意的是,这些模型是十分制的,而且可以直接使用。但由于只在女性图像上训练过,它们只能用于估计女生的颜值。如果要扩展到男女、种族层面的图像,请务必按照所列说明在新的数据集上重新训练。

实现二:DIY的Keras实现
第二个实现来自Medium网友Dima Shulga。在阅读完论文后,他看到了3.78分的Julia Robert、3.7分的以色列名模Bar Refaeli,觉得这个打分机制非常吸引他,于是打算重现论文结果并评估自己的长相水平。

3.78分的Julia Robert

3.7分的Bar Refaeli


Keras

不同于论文作者使用AlexNet、ResNet18和ResNext50,也不同于roguesir自己改良了三个模型,实现二的突出特点是简(偷)化(懒)。Dima Shulga发现Keras中有一个模块叫applications,它是一组不同的预先训练好的模型,其中包含resnet50,虽然调用的模型不同,但从理论上来看,这样训练出的模型在性能上也能接近ResNet18和ResNext50的表现。
from keras.applications import ResNet50
在Keras中打开resnet50后,Dima Shulga删除了原神经网络的最后一层(softmax),并添加了一个没有激活函数的全连接层执行回归。
resnet = ResNet50(include_top=False, pooling=’avg’)
model = Sequential()
model.add(resnet)
model.add(Dense(1))
model.layers[0].trainable = False
print model.summary()
# Output:
  Layer (type)                 Output Shape              Param #    ================================================================= resnet50 (Model)             (None, 2048)              23587712   _________________________________________________________________ dense_1 (Dense)              (None, 1)                 2049       ================================================================= Total params: 23,589,761
Trainable params: 23,536,641 
Non-trainable params: 53,120

他的思路是先只训练最后这个全连接层,可以看到,如果是训练整个resnet50,模型要跑的参数是23,589,761个,而如果不动它,参数就只有2049个。为了进一步简化训练,模型的学习率也要尽可能地小。
model.compile(loss ='mean_squared_error',optimizer = Adam())
model.fit(batch_size = 32,x = train_X,y = train_Y,epochs = 30)

完成第一步训练后,Dima Shulga又把全连接层和resnet50组成起来训练30个epoch。这里trainX表示图像(如numpy形数组(350, 350, 3)),trainY表示图像得分。

结果

为了省力,这里Dima Shulga把数据集分为80%(训练集)和20%(测试集)两部分,并得到了如下结果:

RMSE:0.301799791952313 
MAE:0.2333630505619627 
PC:0.9012570266136678
输入自己的照片后,模型输出的得分是:2.85(十分制5.7)——大约比数据集中52%的人更美貌。

六分不能更多了的Dima Shulga


小结

在有些人眼里,虽然给颜值打分是一件无聊的事,或者说不太礼貌,但如果只把它作为不影响他人的娱乐项目,这样的尝试也无伤大雅。在满足自己好奇心的同时提高自己对各个算法、模型、数学基础的熟练度,在充实自己学习生活的同时给别人带来新的见闻和启示,论智把这个有趣的话题跑给你,希望各位读者愿意自己动手试一试。


参考文献
论文地址:
arxiv.org/pdf/1801.06345.pdf
Github地址:
github.com/HCIILAB/SCUT-FBP5500-Database-Release
数据集地址:
pan.baidu.com/s/1gguqPpx 提取码:mh8j(大小 = 172MB)
drive.google.com/open?id=1_BBiG0xOxYnCTItUXh82GTVorp6ODy-m

用户评论