魔鏡魔鏡告訴我,誰是世界上最美的女人?這句伴隨童年的話也有現實版哦~神經網絡可以預測人臉顏值,這方面也出現了不少研究。今年年初華南理工大學的研究者發布論文,并公開了數據集SCUT-FBP5500。本文作者Dima Shulga「復現」了該論文,并用自己的照片做了試驗。
數月前,華南理工大學發布了關于「顏值預測」的論文和數據集,數據集包括5500人,每人按顏值魅力打分,分值在1到5分之間。
論文地址:https://arxiv.org/abs/1801.06345
數據集地址:https://github.com/HCIILAB/SCUT-FBP5500-Database-Release
數據集中還有很多名人。Julia Robert的這張照片得到了3.78的平均分:
以色列名模Bar Refaeli這張照片得分3.7:
似乎分也不高嘛,但是3.7的得分意味著比數據集中大約 80%的人要好看。
數據集作者利用該數據集訓練多個模型,嘗試根據人臉照片預測這個人的魅力。
本文我將復現他們的結果,還要看一下我的吸引力怎么樣。
原始論文實現了很多不同模型,包括具備人工制作特征的經典ML模型和3個深度學習模型:AlexNet、ResNet18、ResNext50。
我想盡可能簡單地呈現(不想從頭實現和訓練整個resnet網絡),于是打算通過精調現有模型來執行該工作。keras中有一個模塊叫做applications,包含不同預訓練模型。其中一個是resnet50。不幸的是,keras.applications中沒有ResNet18、ResNext50,因此我無法完全復現該研究,不過使用resnet50復現程度應該很接近。
fromkeras.applicationsimportResNet50ResNet是微軟開發的深度卷積神經網絡,曾贏得 2015ImageNet競賽冠軍。
我們在keras中初始化resnet50模型時,使用ResNet50架構創建了一個模型,同時下載了在ImageNet數據集上訓練好的權重。
論文作者沒有提到他們訓練模型的具體細節,因此我盡力去做。我想移除最后一層(softmax 層),添加一個沒有激活函數的Dense層,來執行回歸。
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
你可以看到,我先使第一層(resnet 模型)不可訓練,這樣我只需要訓練2049個參數,而不是23,589,761個。
我計劃訓練最后的Dense層,然后使用較小的學習率訓練整個網絡。
model.compile(loss='mean_squared_error', optimizer=Adam())
model.fit(batch_size=32, x=train_X, y=train_Y, epochs=30)
之后,我改變第一層的狀態使之可訓練,編譯并擬合模型,來進行另外30個epoch。
這里,train_X是照片,即 numpy 形態數組 (350, 350, 3),train_Y是標注圖像的得分。
結果:
該論文使用2種技術訓練模型:5-fold交叉驗證、60%-40%的訓練集-測試集分割。論文作者使用皮爾遜相關系數(PC)、平均絕對誤差(MAE)和均方根差(RMSE)對結果進行衡量。5-fold 交叉驗證的結果如下:
60%-40% 的訓練集-測試集分割結果如下:
我將使用80%-20%的訓練集-測試集分割,類似執行他們的交叉驗證的1-fold。結果如下:
RMSE: 0.301799791952313
MAE: 0.2333630505619627
PC: 0.9012570266136678
相當不錯。此外,查看分數散點圖和直方圖很方便:
原始分數分布(正態):
預測分數分布(正態):
結果看起來不錯。現在我們來看下這個深度神經網絡給我打幾分吧。我一開始用了這張照片:
得分2.85,我只比該數據集中 52%的人好看……不得不說有點失望,我原本以為結果比這好,于是我決定再試試。
我拍了很多照片,最終有一張得了3.15分,這意味著我比該數據集中64%的人更好看。
好多了~老實講我還是想得更高分~ :)
最后說明一下,我使用Google1Colaboratory構建和調整模型,它提供Python notebook,可以免費使用GPU!
論文:SCUT-FBP5500: A Diverse Benchmark Dataset for Multi-Paradigm Facial Beauty Prediction
論文鏈接:https://arxiv.org/abs/1801.06345
文章來源:數據與算法之美
IEEE Spectrum
《科技縱覽》
官方微信公眾平臺
往期推薦