用OpenCV和Dlib進(jìn)行人臉顏值預(yù)測

本項目部分基于這個博客Computer Vision for Predicting Facial Attractiveness韵吨。按照上面這個博客復(fù)現(xiàn)起來比較麻煩(當(dāng)然是對我而言)逾礁,而且我想要做的是對于任意一張人臉進(jìn)行檢測之后都可以進(jìn)行顏值估計,但是他給出的代碼還需要進(jìn)行改動不少才行∪崽希現(xiàn)在就把自己的復(fù)現(xiàn)過程記錄下來。

本文中只展示了部分關(guān)鍵代碼萍虽。完整代碼和測試用的數(shù)據(jù)可以在GitHub上獲取睛廊。

不同點(diǎn)

  • 在提取人臉關(guān)鍵點(diǎn)的時候,原文中提到用的是CLM framework杉编,本文用的是之前配置好的Dlib喉前。
  • 實(shí)現(xiàn)了對自選圖片中人臉的顏值估計

用到的Python庫

  • numpy
  • opencv
  • dlib
  • sklearn

主要步驟

  • 訓(xùn)練模型
  • 人臉關(guān)鍵點(diǎn)提取
  • 特征生成
  • 顏值預(yù)測

1. 訓(xùn)練模型

訓(xùn)練一個模型最重要的就是輸入數(shù)據(jù)和模型的選取。這里訓(xùn)練模型用到的輸入數(shù)據(jù)是給出的features_All.txt和rating.txt王财。這是華南理工大學(xué)人機(jī)智能交互實(shí)驗室給出的數(shù)據(jù)集中提取出來的特征和標(biāo)簽卵迂。一共用了500幅人臉圖像。

root = 'E:/Github/predict-facial-attractiveness/'

features = np.loadtxt(root + 'data/features_ALL.txt', delimiter=',')
#features = preprocessing.scale(features)
features_train = features[0:-50]
features_test = features[-50:]

pca = decomposition.PCA(n_components=20)
pca.fit(features_train)
features_train = pca.transform(features_train)
features_test = pca.transform(features_test)

ratings = np.loadtxt(root + 'data/ratings.txt', delimiter=',')
#ratings = preprocessing.scale(ratings)
ratings_train = ratings[0:-50]
ratings_test = ratings[-50:]
  • 值得注意的是绒净,這里用PCA算法對特征進(jìn)行了壓縮和降維见咒。降維之后特征變成了20維,也就是說特征一共有500行挂疆,每行是一個人的特征向量改览,每個特征向量有20個元素。

根據(jù)Computer Vision for Predicting Facial Attractiveness一文中給出的結(jié)果缤言,我們選取表現(xiàn)最好的模型之一——隨機(jī)森林作為此次復(fù)現(xiàn)用的算法模型宝当。

regr = RandomForestRegressor(n_estimators=50, max_depth=None, min_samples_split=1, random_state=0)

regr = regr.fit(features_train, ratings_train)
#一定要把conpress設(shè)為true或者其他的值,沒有設(shè)置會輸出很多的*.pkl
joblib.dump(regr, root + 'model/my_face_rating.pkl',compress=1) 

print "Generate Model Successfully!"
  • 用隨機(jī)森林訓(xùn)練模型胆萧。因為想要預(yù)測自選圖片的人臉顏值庆揩,所以要把模型保存下來以備后用俐东。

2. 人臉關(guān)鍵點(diǎn)提取

在之前的博客OpenCV實(shí)踐之路——用dlib庫進(jìn)行人臉檢測與人臉標(biāo)記中已經(jīng)提到過如何進(jìn)行人臉關(guān)鍵點(diǎn)提取,這里的工作基于之前的內(nèi)容订晌,不同之處在于要把提取到的關(guān)鍵點(diǎn)按照模型可以用的方式進(jìn)行保存虏辫。部分代碼如下:

f = open(root + 'data/landmarks.txt','w')
for i in range(len(rects)):  
      
    使用predictor進(jìn)行人臉關(guān)鍵點(diǎn)識別  
    landmarks = numpy.matrix([[p.x,p.y] for p in predictor(im,rects[i]).parts()])  
    im = im.copy()  
  
    #使用enumerate 函數(shù)遍歷序列中的元素以及它們的下標(biāo)  
    for idx,point in enumerate(landmarks):  
        pos = (point[0,0],point[0,1])  
        
        f.write(str(point[0,0]))
        f.write(',')
        f.write(str(point[0,1]))
        f.write(',')
        #cv2.putText(im,str(idx),pos,                  
        #6.繪制特征點(diǎn)  
        cv2.circle(im,pos,3,color=(0,255,0))  
    f.write('\n')   
print "landmarks,get!"  

3. 特征生成

特征生成直接用了原始代碼,只對路徑進(jìn)行了一些改動锈拨。這一部分我暫時也不太明朗砌庄,所以不敢多說。有興趣的還是直接看代碼吧奕枢。篇幅原因娄昆,這里只是部分代碼,特征生成的完整代碼在這里缝彬。

def generateFeatures(pointIndices1, pointIndices2, pointIndices3, pointIndices4, allLandmarkCoordinates):
    size = allLandmarkCoordinates.shape
    allFeatures = numpy.zeros((size[0], len(pointIndices1)))
    for x in range(0, size[0]):
        landmarkCoordinates = allLandmarkCoordinates[x, :]
        ratios = [];
        for i in range(0, len(pointIndices1)):
            x1 = landmarkCoordinates[2*(pointIndices1[i]-1)]
            y1 = landmarkCoordinates[2*pointIndices1[i] - 1]
            x2 = landmarkCoordinates[2*(pointIndices2[i]-1)]
            y2 = landmarkCoordinates[2*pointIndices2[i] - 1]

            x3 = landmarkCoordinates[2*(pointIndices3[i]-1)]
            y3 = landmarkCoordinates[2*pointIndices3[i] - 1]
            x4 = landmarkCoordinates[2*(pointIndices4[i]-1)]
            y4 = landmarkCoordinates[2*pointIndices4[i] - 1]

            points = [x1, y1, x2, y2, x3, y3, x4, y4]
            ratios.append(facialRatio(points))
        allFeatures[x, :] = numpy.asarray(ratios)
    return allFeatures

4. 顏值預(yù)測

到了這一步稿黄,我們就可以用第一步得到的模型和上一步得到的特征進(jìn)行顏值的估計了。

#use your own path
root = 'E:/Github/predict-facial-attractiveness/'
clf = joblib.load(root+'model/my_face_rating.pkl')
features = np.loadtxt(root + 'data/features_ALL.txt', delimiter=',')
my_features = np.loadtxt(root + 'data/my_features.txt', delimiter=',')
pca = decomposition.PCA(n_components=20)
pca.fit(features)

predictions = np.zeros([6,1]);

for i in range(0, 6):
    features_test = features[i, :]
    features_test = pca.transform(features_test)
    #regr = linear_model.LinearRegression()
    #regr.fit(features_train, ratings_train)
    predictions[i] = clf.predict(features_test)
#predictions = clf.predict(features)
print predictions
  • 這里有一點(diǎn)需要注意:一定要用原來的特征進(jìn)行PCA的fit跌造,因為自己的圖片提取的只有六個特征杆怕,而PCA要壓縮成20維,根本沒法壓縮壳贪,所以先用原本的特征進(jìn)行PCA的fit陵珍,這樣即使只有一個特征,也可以降維到20列违施。否則會出錯互纯。

仍然用這張圖片測試

結(jié)果如下圖所示,可能是因為訓(xùn)練的時候用的都是亞洲女性的圖片磕蒲,所以測試歐美女性的時候有一些偏差留潦,本結(jié)果只是測試結(jié)果,不說明任何問題辣往。

這里寫圖片描述

  • 滿分5分
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兔院,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子站削,更是在濱河造成了極大的恐慌坊萝,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件许起,死亡現(xiàn)場離奇詭異十偶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)园细,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門惦积,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猛频,你說我怎么就攤上這事狮崩≈朊悖” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵厉亏,是天一觀的道長董习。 經(jīng)常有香客問我烈和,道長爱只,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任招刹,我火速辦了婚禮恬试,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疯暑。我一直安慰自己训柴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布妇拯。 她就那樣靜靜地躺著幻馁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪越锈。 梳的紋絲不亂的頭發(fā)上仗嗦,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機(jī)與錄音甘凭,去河邊找鬼稀拐。 笑死,一個胖子當(dāng)著我的面吹牛丹弱,可吹牛的內(nèi)容都是我干的德撬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼躲胳,長吁一口氣:“原來是場噩夢啊……” “哼蜓洪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坯苹,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤蝠咆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后北滥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刚操,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年再芋,在試婚紗的時候發(fā)現(xiàn)自己被綠了菊霜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡济赎,死狀恐怖鉴逞,靈堂內(nèi)的尸體忽然破棺而出记某,到底是詐尸還是另有隱情,我是刑警寧澤构捡,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布液南,位于F島的核電站,受9級特大地震影響勾徽,放射性物質(zhì)發(fā)生泄漏滑凉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一喘帚、第九天 我趴在偏房一處隱蔽的房頂上張望畅姊。 院中可真熱鬧,春花似錦吹由、人聲如沸若未。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粗合。三九已至,卻和暖如春乌昔,著一層夾襖步出監(jiān)牢的瞬間隙疚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工玫荣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甚淡,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓捅厂,卻偏偏與公主長得像贯卦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子焙贷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容