分享

通过神经网络预测颜值



问题导读:


1.什么是颜值预测问题?
2.有哪些模型可以实现颜值预测?
3.怎样快速实现颜值预测?





数月前,华南理工大学发布了关于「颜值预测」的论文和数据集,数据集包括 5500 人,每人按颜值魅力打分,分值在 1 到 5 分之间。



640.jpg

数据集中还有很多名人。Julia Robert 的这张照片得到了 3.78 的平均分:

640.jpg

以色列名模 Bar Refaeli 这张照片得分 3.7:

640.jpg

似乎分也不高嘛,但是 3.7 的得分意味着比数据集中大约 80% 的人要好看。

数据集作者利用该数据集训练多个模型,尝试根据人脸照片预测这个人的魅力。

本文我将复现他们的结果,还要看一下我的吸引力怎么样~

原始论文实现了很多不同模型,包括具备人工制作特征的经典 ML 模型和 3 个深度学习模型:AlexNet、ResNet18、ResNext50。

我想尽可能简单地呈现(不想从头实现和训练整个 resnet 网络),于是打算通过精调现有模型来执行该工作。keras 中有一个模块叫做 applications,包含不同预训练模型。其中一个是 resnet50。不幸的是,keras.applications 中没有 ResNet18、ResNext50,因此我无法完全复现该研究,不过使用 resnet50 复现程度应该很接近。

[mw_shl_code=python,true]from keras.applications import ResNet50[/mw_shl_code]

ResNet 是微软开发的深度卷积神经网络,曾赢得 2015 ImageNet 竞赛冠军。

我们在 keras 中初始化 resnet50 模型时,使用 ResNet50 架构创建了一个模型,同时下载了在 ImageNet 数据集上训练好的权重。

论文作者没有提到他们训练模型的具体细节,因此我尽力去做。我想移除最后一层(softmax 层),添加一个没有激活函数的 Dense 层,来执行回归。

[mw_shl_code=python,true]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[/mw_shl_code]

你可以看到,我先使第一层(resnet 模型)不可训练,这样我只需要训练 2049 个参数,而不是 23,589,761 个。

我计划训练最后的 Dense 层,然后使用较小的学习率训练整个网络。

[mw_shl_code=python,true]model.compile(loss='mean_squared_error', optimizer=Adam())
model.fit(batch_size=32, x=train_X, y=train_Y, epochs=30)[/mw_shl_code]

之后,我改变第一层的状态使之可训练,编译并拟合模型,来进行另外 30 个 epoch。

这里,train_X 是照片,即 numpy 形态数组 (350, 350, 3),train_Y 是标注图像的得分。

结果

该论文使用 2 种技术训练模型:5-fold 交叉验证、60%-40% 的训练集-测试集分割。论文作者使用皮尔逊相关系数(PC)、平均绝对误差(MAE)和均方根差(RMSE)对结果进行衡量。5-fold 交叉验证的结果如下:

640.jpg

60%-40% 的训练集-测试集分割结果如下:

640.jpg

我将使用 80%-20% 的训练集-测试集分割,类似执行他们的交叉验证的 1-fold。结果如下:

[mw_shl_code=python,true]RMSE: 0.301799791952313
MAE: 0.2333630505619627
PC: 0.9012570266136678[/mw_shl_code]

相当不错。此外,查看分数散点图和直方图很方便:

640.jpg

原始分数分布(正态):

640.png

预测分数分布(正态):

640.png

结果看起来不错。现在我们来看下这个深度神经网络给我打几分吧。我一开始用了这张照片:

640.jpg

得分 2.85,我只比该数据集中 52% 的人好看……不得不说有点失望,我原本以为结果比这好,于是我决定再试试。

我拍了很多照片,最终有一张得了 3.15 分,这意味着我比该数据集中 64% 的人更好看~

640.jpg

好多了~老实讲我还是想得更高分~ :)

最后说明一下,我使用 Google Colaboratory 构建和调整模型,它提供 Python notebook,可以免费使用 GPU!

论文:SCUT-FBP5500: A Diverse Benchmark Dataset for Multi-Paradigm Facial Beauty Prediction

640.jpg


摘要:颜值预测(facial beauty prediction,FBP)是使人脸魅力评估达到人类感知程度的重要视觉识别问题。为了解决该问题,不同的数据驱动模型,尤其是当前最优的深度学习技术被引入,基准数据集成为实现 FBP 的必要因素。之前的研究将颜值识别作为一个特定的分类、回归或排序的监督学习问题,表明 FBP 本质上是一个具备多个范式的计算问题。但是,大部分 FBP 基准数据集是在特定的计算约束下构建的,这限制了在该数据集上训练的模型的性能和灵活性。本论文中,我们认为 FBP 是一个多范式的计算问题,并提出一种新的多元化基准数据集 SCUT-FBP5500,来实现多范式颜值预测。该数据集共有 5500 个人脸正面照片,这些照片具备不同属性(男性/女性,年龄等)和不同标签(面部地标、颜值得分(1~5)、颜值得分分布),允许具备不同 FBP 范式的不同计算模型,如基于外表/身材的亚洲人/高加索人的男性/女性的颜值的分类/回归模型。我们使用不同的特征和预测器组合、不同的深度学习方法评估 SCUT-FBP5500 数据集,结果表明在该数据集上 FBP 有所改进,且具备潜在应用。


来源:机器之心
作者:机器之心

本帖被以下淘专辑推荐:

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条