1. 程式人生 > >顏值估計(1)Label distribution based facial attractiveness computation by deep residual learning

顏值估計(1)Label distribution based facial attractiveness computation by deep residual learning

大笑版權宣告:本篇文章為博主原創文章,碼字不易,未經博主允許,不得轉載:https://mp.csdn.net/postedit/79810023

Label distribution based facial attractiveness computation by deep residual learning (點選下載

這篇文章屬於顏值估計文章,利用的網路是深度殘差網路。不同於之前的迴歸方法,該演算法使用的標籤是對標籤分佈進行學習,有一定的新意,因此總結在這裡學習!

文章首先說明了,在顏值估計方面主要有兩個難題擺在面前:

1、顏值估計圖片樣本的不足。網上和顯示中能找到太多的圖片,但是對應一個人長得到底怎麼樣,沒有確切的打分結果作為標籤。之前東南大學弄了一個數據集SCUT-FBP可以說是很大程度上彌補了這個問題的不足。該資料集的連線

SCUT-FBP

2、沒有精確的人臉表達。你很難說清楚,哪個人漂亮,哪個人醜陋,個人主觀性太大。

為了解決以上兩個問題,文章使用了對應的方案

1、使用將傳統的監督學習中的單一標籤問題轉換為學習標籤分佈的問題,這樣的話就不是那麼受樣本數量多少的影響。

通常情況下,想要獲得人們對於一個人的顏值評價的做法是:召集各種型別(從事不同工作,不同年齡,男女性等)評價人員(花錢僱的)來對手上有的資料集進行樣貌評價,比如將顏值評分分為十個等級,然後一張一張給評價人員看,然後讓他們打分,最終將他們評分的結果取平均,就是最終得分。可以想象,這個過程相當難做。對於以前使用人工特徵提取器方法來進行衡量還好,資料量不需要那麼大。但是對於現在熱火朝天的深度學習而言,這種資料的獲取方式所對應的工作量實在是太大了。而且每個人都有不同觀念,對於美醜的鑑定又不是非常可觀,導致最終結果也不一定準確。不過大數定律告訴我們,只要樣本足夠,那麼精度就一定可以通過平均得到。希望將來能有一些機構專門針對這一領域進行專門的工作,能夠產生一些類似ImageNet或者VOC之類的資料集(其實工作量都挺大)。

通過下圖可以看到,對於同一張人臉,總共有5個人數,不同人對於其評估的結果是不同的。橫座標表示該臉得分等級,縱座標表示一共有多大比例的評價人員對該數做出了貢獻。從結果可以看出,雖然每個人的評分結果是不同的,但是對於該臉,總體評價是有一個分佈的。如果將該人臉的評價從某一個固定的分數(比如圖中的4.143這個平均分)轉到某一個得分分佈,這樣的話就會更貼近實際情況了。比如我要我的演算法不是用4.143作為標籤,而是將對於該臉整體評價的分佈作為標籤,那麼我的演算法需要學的就是對於1分有0%的人做出評價,對於2分,有4%,對於3分,有15%··········。這樣的話,演算法可以不依賴太大的樣本。

該文章就是這個思路。


2、相比手工選取特徵進行人臉表達,利用深度殘差網路來加深網路層次,從而提取更普遍的人臉特徵。

深度學習之前,有太多的人工設計特徵提取器,不能說它們不好,最起碼在沒有大資料驅動的情況下,依靠絕對智力來解決問題的做法是最正確的。這些特徵提取器種類繁多,有針對幾何結構的、針對膚色的、針對紋理的等。這裡又分為針對區域性設計的和針對總體設計的。這些特徵提取器雖然現在逐漸被深度學習的方法替代,著實減輕了太多科研工作者的壓力,但是其在某些較為重要的領域還是有著不可替代的作用的。現如今,用一個簡單的3、5層網路所提取的特徵進行處理,都有可能比手工特徵提取器提取的特徵更有用。並且網路越深,對於特徵表達越有效,這已經在諸多網路中得到了驗證,尤其是深度殘差網路,簡直是一種逆天的存在,居然能搞1000多層還能訓練,實在是厲害。

本文便是採用了深度殘差網路,直接將RGB影象丟給網路,自己去學特徵。優勢就是網路深,特徵表達更高階,也更有效。

在以上1 和2 兩種方案合力的作用下,該演算法在SCUT-FBP資料集上達到了state-of-the-art精度

1、網路結構:

首先利用一些面部提取器(比如dlib)提取出人臉,然後提取出的人臉影象最短邊擴充0來與最長邊相同,得到一個正方形人臉,然後暴力resize到224*224大小。

下圖對網路與訓練進行了簡單的描述:


對於輸出,我們可以看到,最後一層用到了5維的全連線,是因為對人臉進行打分的分數段一共有5個(1,2,3,4,5分)。

文章分別用了50層和101層的網路,所以對應的{n1, n2, n3, n4}分別為{2, 3, 5, 2}和{2, 3, 22, 2}。

網路就介紹完了,其實網路這塊到沒有什麼改動,最後的全連線改成了所需要的結果。

2、 損失函式

前面說了,該演算法採用的不是單一標籤進行分類或迴歸,而是採用結果標籤的分佈來進行訓練,所以看一下怎麼訓。

我們在年齡估計這塊介紹過將年齡進行編碼時可以使用高斯描述度來表達,這裡作者也是受整個啟發,進行的改進。

對於一幅輸入影象,那麼最後全連線特徵表達輸出的5維特徵表達經過softmax層之後,對應產生5個概率,這5個概率就分別表示該圖片屬於每個分數的可能性。

對於這張影象,假設其對應的標籤分數分別為: y={y1 , y2, y3, y4, y5}(這裡一共5個顏值評分,所以有5個)。而且每個分數都有一個評價人員所佔的比例。比如上面說的,有15%的評價人員給出了3分的評價,那麼這個15%就是該分數的一個分佈值。

而經過softmax層之後,各概率的分佈為 di={d1, d2, d3, d4, d5},其中d1+d2+d3+d4+d5=1。那麼網路需要學習的就是這個di 的每個值都應該與評價人員給出某個分數所佔的比例相同。

就是通過這樣一個轉化,將原來進行分類所對應的某個標籤(第一類,第二類·······)轉換成進行分數比例(%0,%4等)的學習。

那麼如何如何定義損失函式呢?

作者在這裡給出了兩種方式:

1、 歐式距離:

這個比較直白,對於每個概率都有一個對應的標籤分佈值與其對應,那麼將估計結果與標籤分佈值之間求均方差即可:


這裡的di就表示我們實際對應的標籤分佈值,f(x;theta)就表示網路學習到的概率分佈。

2、 KL散度


那麼預測的時候,給定一張影象,通過網路學到一個分佈,這個分佈結果就是我們所要求的估計結果。當然,如果你說非要某一個確切的數,比如3.52分這樣的表示,那麼就可以將所得的結果進行加權平均來得到最終分數。

那麼,怎麼衡量結果是否好呢?

由於其他演算法在進行預測的時候都採用的是單一標籤(比如3.52分),那麼在這裡可以將網路最終預測結果進行加權平均,從而也得到一個具體的分數,利用該分數與其他演算法進行對比,可以評價模型的好壞。

這裡引入一個概念叫做皮爾遜相關(Pearson correlation)來進行衡量。公式如下:


分子為兩個變數的協方差,分母為兩個變數的方差乘積。

這個概念的定義其實大家都見過,只不過沒注意它是這個名稱而已,具體可以見這裡這裡。對於兩個變數,相關係數越大表示兩個變數的線性相關性越高,也就意味著可以通過一個變數經過線性變化表示另外一個變數的可能性就越大。對應本文來說,也就意味著估計結果越貼近真實標籤分佈,有很大的可能性可以用估計結果表示標籤分佈。

那麼,網路學習到的結果在SCUT-FBP上進行評估的時候,其相關性如下圖:


可以看到,本文用的ResNet50與資料集標籤分佈相關程度最高,也意味著該結果與真是分佈越貼進。

網路與損失函式說完了,上一張訓練圖:


作者對比了三種網路,如上圖所示。細線表示訓練誤差,粗線表示測試誤差。非常直觀,ResNet50表現最為出色,所得的結果也較好。這裡作者使用了兩種損失函式進行比較,發現歐氏距離稍微好點,所以網路採用的損失函式為均方誤差。

作者最後又對資料集進行了增強,從而達到了更好的精度。具體見下表:


其中的 LDL 表示label distribution learning

本篇文章感覺作者的想法很有新意,所以記錄在此以進行學習,希望自己也能夠實現一下,熟悉一下這方面的東西。

還是希望大家能夠批評指正!