深度神經網路幫您解析SNH48成員公式照背後的故事

Overview

距離上一次我不務正業的文章 【面對塞納河編程】SNH48 Group第一屆人口普查 已經過去了將近半年了。雖然最近很忙,但是還是忍不住想要用知識來搞一些事情。最近一直在做深度學習有關的項目,一直有想法想做一點深度學習 X SNH48 的事情。這次花了一個下午加晚上的時間,我們搞事情的目標對準了SNH48成員的公式照。

眾所周知,深度神經網路在圖像,自然語言處理上都有很出色的表現。其中在圖像方面,通過卷積神經網路,可以有效地提取圖像的特徵,這些特徵可以幫助我們搭建分類模型,或者尋找類似的圖片。因此,我們搞事情的思路就是將SNH48成員的照片通過一個已經訓練好的深度神經網路,獲得成員們的面部特徵,看看哪些成員在神經網路看來是長的相似的,又有哪些CP擁有驚人的CP相。

照例,我會先說一些技術方面的細節,對相關領域不是太了解以及想直接看結果的聚聚可以跳到最後的結果分析部分。劃重點: 結果在文章最後!

數據獲取

成員的公式照全部來自官網。收錄了大重組之後Team SII, NII, HII, X 以及部分Team 預備生成員, 共87張公式照。有一些預備生因為時間原因沒有整理收入,如果之後有時間我會再加上。

OpenFace

原本想自己搭建一個模型對成員的照片進行訓練,但是時間有限,數據的收集也不是很簡單的工作。正好前幾天發現了CMU的一個圖像機器學習項目:OpenFace。OpenFace是一個Python和Torch實現的深度神經網路面部識別項目,其中包含了人臉發現,特徵提取,特徵神經網路訓練,人臉識別這四個功能。

OpenFace的基本框架如下圖所示

Python主要負責實現圖像的預處理。預處理包括了人臉檢查,轉換以及剪切,具體的過程如下圖所示。OpenFace主要還是運用的是傳統的機器視覺的方法,如dlib的人臉發現。

神經網路通過Torch,網路結構和Google的FaceNet結構相同。因為最後我們的目的不是訓練分類模型,因此我們關注的重點主要還是在前兩個功能,即人臉發現和特徵提取。

OpenFace官方推薦使用docker進行安裝(首先確保你已經安裝了docker)

docker pull bamos/openface

安裝結束以後創建一個容器

docker run -p 9000:9000 -p 8000:8000 -t -i bamos/openface /bin/bash

接著進入OpenFace的根目錄

cd /root/openface

首先我們先創建一個存放訓練數據的文件夾

mkdir training-data

然後將收集的成員公式照放到這個目錄中,因為我不太熟悉docker的操作,這裡我用的是

docker cp PATH/training-data/ yourcontainer:/root/openface/training-data/

其中PATH是訓練數據在電腦上的路徑,yourcontainer對應的是容器名稱。好啦,數據準備好,接下來我們就可以開始愉快地訓練啦。首先第一步是人臉檢測和位置校正

./util/align-dlib.py ./training-data/ align outerEyesAndNose ./aligned-faces/ --size 96

處理完的人臉會存放在/aligned-faces/ 這個文件夾中。我們可以挑選一個成員來看看處理前後是什麼樣子

處理的目的主要是摳出人臉,並且將五官矯正到大致一致的位置。最後就可以來提取人臉的特徵。

./batch-represent/main.lua -outDir ./generated-embeddings/ -data ./aligned-faces/

所有特徵提取完畢後會存放在./generated-embeddings/ 下,reps.csv存放特徵,labels.csv存放著對應的特徵。從之前介紹的OpenFace的神經網路結構可以知道,最後我們獲得的是一個128維的特徵。有了這些特徵就可以來看看成員公式照之間有著怎樣的聯繫了。

結果分析

神經網路輸出的特徵的128維,即特徵的向量空間是128維。在這裡我們通過計算任意兩個點之間的歐幾里得距離來獲得兩張人臉的相似度,也就是說它們之間的歐幾里得距離越小,兩張照片越是相似。

從可視化來說,高維的數據觀察起來並不是很直觀。為了能夠在二維的圖像上展現結果,我們需要先將特徵降維。常用的降維方法有PCA,t-SNE等等。因為在我們的特徵空間中,我們比較關注的是不同點之間的距離,因此在這個問題我用了MDS(多維縮放)來降維。MDS能夠在降維的過程中將數據的差異性保留下來,即降維讓高維空間中的距離關係與低位空間中的距離關係保持不變。

因為一共有87位成員,在一張圖上展示會顯得比較擁擠,因此我分了不同隊伍來展示公式照之間的相似性。首先我們來看組閣之後的S隊

其中公式照最接近的居然是邵雪聰&孫芮,袁雨楨&劉增艷。來看看三哥和coco的公式照

Emm. 一言難盡。我還是不去評論深度智障網路的表現了。我們再來看看N隊的吧

陸婷!!你看見了嗎!!叉叉沒有說錯!!叉叉的話是有理論支持的!!你就是和張雨鑫長得像!!不要躲避這個赤裸裸的現實了!

下面是人員大調整的H隊

源源和姜杉以及lyt緊緊地貼在了一條直線上。想寫一本書《人工智障:從入門到放棄》。

最後是X隊

X隊沒什麼可說的。李晶和孫亞萍貼的這麼近可能是因為身材吧。不對,我們好像只輸入了公式照。emmm,也許這就是人工智慧厲害的地方吧!

不過因為我們是將高維數據降維到二維必然會損失一些信息,二維的圖像只能作為一個可視化的參考。我同時計算87位成員兩兩之間在高維空間的歐幾里得距離,特此排出了公式照最像成員Top5

這裡的Similarity對應的是歐氏距離,因此Similarity越小代表兩張公式照越相近。劉炅然和江真儀居然是最像的,這倒也是大大出乎我的意料

看了兩個人的公式照,正義在高P之下,某種程度上來說,兩個人長的還真的是有點像。特別是笑容的這個角度,都有種蒙娜麗莎上身的感覺。

有最像排名,當然我們還有最不像的公式照排名

雨傘和孔姐,也確實不是一個風格的。不過魚哥是咋了,和艾斯過不去了?小小婷和問言的差距,可能主要還是膠原蛋白之間的差距。

接著我們將所有公式照的特徵向量做了一個平均,獲得了一張SNH48成員公式照的平均臉。通過計算和平均臉之間的歐式距離,我們可以獲得長相最平均的成員排名

momo榮登榜首!而且是壓倒性的優勢!果然成員們更多還是像momo這樣溫柔軟萌的呢!

同時,我們還有長相和平均差異最大成員排名

最後最後,還有最刺激的。我帶著非常主觀的個人感情色彩,挑選了12對河內大熱(我認為的)CP,算一算哪對CP最有CP相。

CP排行榜 揭曉如下!

看見了嗎?看見了嗎?馬鹿!什麼叫壓倒性優勢奪冠!馬鹿gay,準備起飛。算了,這也算是日常操作了,坐下吧坐下吧。從這個角度來說,有些CP能火不是沒有道理的。CP御三家哪一家不是在河內名噪一時。說到CP,我忍不住想夾帶一點私貨:朋友,九笨了解一下?

寫在最後

寫這篇文章純屬在花式趕Deadline之中的摸魚娛樂,有很多地方從理論上來說還是不非常嚴謹,如果有錯誤的地方歡迎大家指正。和之前一樣,輸出的特徵向量,成員之間相似度的表格,收集的公式照,以及我做數據處理和可視化的代碼都放在了我的GitHub,如果有興趣對這些數據再進行挖掘的,歡迎去fork一個玩玩,如果覺得有意思的,能給個Star就更好啦~ 地址在這裡 GitHub:TheSuguser/SNH48facesimilarity

如果你有什麼想要了解的,比如某兩位成員之間的相似度,或者你覺得什麼可以再挖掘的,歡迎在評論里告訴我!我會再更新在文章里的。就是這樣!希望你看的愉快~

Reference

FaceNet: A Unified Embedding for Face Recognition and Clustering

OpenFace: A general-purpose face recognition library with mobile applications


推薦閱讀:

TAG:SNH48 | 深度學習DeepLearning | 數據分析 |