天天看點

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

版權聲明:本文為部落客原創文章,碼字不易,未經部落客允許,不得轉載:https://mp.csdn.net/postedit/79765765。

本篇文章:AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation (點我下載下傳)是2015 ChaLearn挑戰賽(去這裡摸索)表面年齡(年齡分類在上文中已經進行了說明)預測的第二名。

文章主要訓練了一個由粗到精的端到端網絡,能夠在中型資料集上達到state-of-art的效果。

一、

先說一下用到的進行年齡估計的幾個資料集以及它們各自的特點:

(1)Morph-II:僅僅包含犯罪嫌疑人的照片,照片中的任務年齡為真實年齡。由16-77歲的55135張圖像組成(要錢,可以點我看下多少錢)

(2)FG-NET:僅僅有1002張圖檔,照片中的人物年齡為真實年齡。(點我)

(3)CASIA-WebFace:由10575個不同個體的500K張圖像組成。(點我)

(4)CACD:由14-62歲之間的160K張圖像組成,準确性見下一條。(點我)

(5)WebFaceAge:由1-82歲之間的600K張圖像組成。這裡的圖像大多都是從網上扒取下來的,扒取的方式比較簡單,比如輸入“10歲”、“2010年出生的人”等,由這些結果圖像組成。準确性不高,有噪聲。(沒找到連結,跪求有知情者提供!)

(6)ICCV2015 Looking at People Challenge:包含4699張圖檔,每張照片都由一個均值和方差進行标注(為什麼是這樣标注的請參考上文)

更多圖像資料請參考https://zhuanlan.zhihu.com/p/25138563,值得收藏

文章提到,使用面部進行年齡估計包含兩個關鍵步驟:

(1)年齡特征表達:這對于一般的視覺問題都存在,之前使用的方法都是利用人工設定的特征提取器來進行特征提取,但是這種方式很大程度上由特征提取器的特點所決定,往往能夠在重點照顧某一方面的情況下,在其它方面表現并不是很好。這類特征提取器主要有(BIF、LBP、HOG等)。而使用深度學習的方法可以使網絡能夠更廣泛的學習多種特征,不僅可以減少人工成本,而且提取出來的特征也比較具有通用性。

(2)年齡估計器的學習過程:年齡的估計劃分為回歸、分類、分類+回歸等問題進行學習,但以往利用人工特征提取器進行提取的方法,其特征提取與年齡估計過程是分開的,也就是先利用一些特征提取器進行特征提取之後喂給神經網絡或SVR等進行估計,這樣做不好的一點是,最終的準确性依賴特征的選取,往往後面分類/回歸器的學習無法回報給特征提取器,進而不能根據估計的準确性來調整特征提取。這點類似于目标檢測中RCNN和Fast RCNN的訓練方法,不僅在特征提取階段運算量大,而且容易産生備援,而且後續的處理不能回報到前面,進而效果一般。而通過使用深度神經網絡則可以實作端到端的過程,進而提升估計的準确度。

本文提出的AgeNet便是利用神經網絡實作了分類+回歸的端到端的訓練,主要有一下幾個特點:

(1)網絡利用分類+回歸的思想,使用的網絡是GoogLeNet(22層),對原始網絡中的輔助損失層進行了删除,并且去掉了原始網絡中所有的Dropout層,改為在每一個Relu激活函數層之前加入BN層。

(2)為了避免過拟合,使用了由一般到特殊的遷移學習

這裡介紹一下關于年齡估計中的标簽設定,因為無論是使用哪種方法,對于監督學習來說,勢必存在一個對應的标簽。而對于年齡估計來說,标簽的編碼有以下幾種方法:

(1)1維真實年齡編碼:(本文使用)這個容易了解,就是通過人實際年齡直接作為标簽,比如真實年齡是20歲或30,那麼标簽就是20或30,這種編碼方式在回歸中較為常用

(2)0/1編碼:這種編碼方式在分類中較為常用,也就是所謂的one-hot編碼。将每一個年齡都看做是一個一維的向量,每個向量中隻有該年齡對應的位置處為1,其餘為0。假設一個人的年齡為5歲,總共有10個年齡,那麼對應的編碼便為[0,0,0,0,1,0,0,0,0,0]。

(3)根據标簽年齡分布編碼:(本文使用)這種編碼方式是由(文章Facial age estimation by learning from label distributions )提出的,總體思想是通過每個标簽中的描述度來表示執行個體的标簽。這個表述度論文中使用的是高斯标簽分布。對于一個給定的圖像I,假定其對應年齡的是y,那麼就可以将這個标簽表示為:

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

公式中,M表示的原始年齡标簽中的最大年齡,

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

表示的是标簽的标準方差,y表示圖像标簽,j表示真實年齡。這樣做的理由是:通常我們的0/1編碼結合softmax損失進行分類時,是将所有的标簽都同等對待,即我們認為每個标簽之間都是互相獨立的,彼此之間沒有太大關系。但實際上在進行年齡分類的時候,如果有兩個年齡40與41,那麼我們很難去判斷這個人到底是準确的40歲還是41歲,因為這個人可能是40歲零2個月。這兩個年齡之間的界限并沒有像40與80歲之間那麼明确,反而相當模糊,在這種情況下,就不能簡單的将兩者分開對待,而是有一定的關聯的。是以,這裡采用了類似高斯映射的方式将标簽進行了轉化。

介紹一下網絡的訓練方法:

(1)年齡回歸器訓練:

這裡采用了回歸的方法,首先将原始網絡的最後一層修改為一個神經節點,并且采用sigmoid激活函數,這樣可以将結果限制在[0,1]之間。那麼也需要将年齡标簽歸一化[0,1]之間以使得他們具有相同的尺度,不然損失函數将無法計算。标簽歸一化的方法是将所有年齡都除以100。

然後使用歐氏距離來作為損失函數進行反向傳播。

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

這裡的N表示一個batch的size,兩個y就不說了。

其中有一個重點需要進行說明:論文中使用的資料集的最大年齡标簽為85歲,将其進行歸一化的時候是除以100的(一般進行歸一化的時候都是除以資料中的最大值85,不太了解這裡為什麼除以100),那麼在最終年齡估計的時候,估計年齡應該為:

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

其中的f函數表示取式中計算結果的下限,比如計算結果為72.7歲,那麼結果應該是不大于它的最大整數,即72

(2)年齡分類器訓練:

前文說了,文章采用了年齡描述度标簽,這裡采用了交叉熵來作為損失函數進行訓練。

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

式中的p(in)表示經過标簽經過描述度編碼後的年齡,範圍為[0,1]。p_hat(in)表示網絡的輸出,N表示一個batchsize,L表示年齡描述度标簽的長度。

最終年齡估計的結果為網絡結果中,最大置信度所對應的标簽即為估計結果。

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

網絡訓練的步驟:

(1)由于人臉的資料集都規模不大(注意,這裡IMDB-WIKI資料集應該沒有公布,因為兩者是同一年進行的比賽,應該不會共享資料的)首先在大型人臉識别資料集CASIA-WebFace進行了預訓練。主要是因為人臉識别與人臉年齡估計都用到了人臉特征,是以在人臉識别資料集上進行預訓練可以更好的提取人臉的特征,這種初始化方式勢必比随機初始化更好,不容易發生嚴重的過拟合。

(2)利用包含真實年齡的資料集進行微調。真實年齡估計和表面年齡估計雖然不一樣,但兩者還是存在很多相似性的。文章在CACD、Morph-II、WebFaceAge上進行了微調。上面提到的分類器和回歸器便是在這裡進行了的學習。

(3)利用比賽資料進行微調。

全部流程如下圖:

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

對幾種方式進行不同組合的預訓練所得到的精度提升如下:

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

臉部預處理:

(1)面部提取:利用VIPL 實驗室研發的臉部探測器CAS進行了面部提取。

(2)臉部特征點定位:使用Coarse-to-Fine Auto-Encoder Network(CFAN)檢測了臉部的五個特征點,分别是左右眼中心,鼻尖,嘴部左右角。

(3)面部标準化:這裡使用了内标準化(翻譯不一定正确)與外标準化兩種方式,其中外标準化的方式不僅包含了臉部的固有資訊,而且也包含了整體的上下文資訊;内标準化隻包含了面部資訊。然後将标準化之後的圖像進行了256*256的resize,下面是兩種标準化的結果。(恕奴才眼拙,看不出來啊!)

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

內建學習:

最終的年齡預測是8個網絡的平均。具體每個網絡如下圖:

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

可以看到,這裡進行了不同的模型內建,既結合了分類器與回歸器的結果,又結合了外部和内部标準化兩種方式,同時,對圖像大小進行了不同尺寸的裁剪。

實驗結果:

直接上圖

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

這裡的評價标準在上文中已進行了說明。

這在上文中進行了說明。

從圖中可以看到:

(1)使用0/1編碼方式進行預測的準确率明顯低于經過描述度編碼的方式。

(2)對于248*248大小圖像來說,無論是内部标準化還是外部标準化的方式,單獨的回歸器比分類器效果要好(一點點),對于227*227恰好相反。

(3)無論是标準化方式內建還是分類器、回歸器內建,都能夠顯著提高算法精确度

(4)當然,最好的還是将上面的八種方式都結合起來取個平均的方法。

訓練過程:

基礎學習率設為0.01,學習率遞減設定伽馬值為0.5,動量項設定為0.9,權重衰減設為0.0005

(1)在人臉識别資料集訓練時采用的batch size 為24,疊代320k次

(2)在實際年齡資料集上訓練采用batch size 為50, 疊代100k次

(3)在比賽資料集上進行訓練采用batch size 為50,疊代10k次(每個模型,總體為10k*8)

下圖為年齡估計的最終效果展示:

年齡及性别預測(2)AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

從圖中可以看出,算法對于姿勢、光照、種族、顔色等不同表現都較好,但是對于面部模糊、校準失敗和年長的人預測效果一般(不過雖然一般,但是對于年長的人來說,最起碼趨勢是預測年齡較高,而不至于差距太大)。

個人看法:

這篇文章相對來說容易實作一些,訓練時間也不是很長,在能夠接受的範圍内。

創新點感覺沒有太多,尤其在網絡方面。但感覺其在處理臉部資料,标簽資料處理方面的利用是其成功的一大半。

這篇文章有部分不懂的地方,可能表達不太正确,需要查資料,将來有機會再進行補充與更正。

希望朋友們能夠指出來進行探讨。