卷積神經網絡檢測臉部關鍵點-theano

前段時間作了一個kaggle上的一個很早的小項目,就是檢測臉部關鍵點,Python環境好弄,可是當時爲了速度用CPU加速,搞了將近一天(相關教程),其實詳細流程也是根據一個相關教程上面的。防止丟失,把代碼分享出來。git

I. 介紹

卷積神將網絡監測臉部關鍵點項目是是一個由Kaggle發起的在線比賽題目。該項目給出相關臉部96*96像素的人臉圖片,目的是監測出人臉識別中最關鍵的15個點(也就是x、y共30個輸出參數),來提取人臉識別中的關鍵點。在文章中,經過問題分析,介紹了使用卷積神經網絡的方法(簡稱CNN)進行特徵提取的過程,並對該問題解法進行了評價和改進意見。github

II. 模型設計

本次採用LeNet-5的卷積神經網絡,由於其在圖像處理方面有着核心的做用,在該設計模型中,使用了卷積神經網絡中的幾個重要層,介紹以下:markdown

  • 輸入層:樣本的輸入,在本模型中使用的是1*96*96圖像原始像素值,其中1表明灰度圖像,也就是一個通道。
  • 卷積層:神經元與輸入層中的一個局部區域相連,每一個神經元都計算本身與輸入層相連的小區域與本身權重的內積。卷積層會計算全部神經元的輸出。在本模型中有多個卷積層,用於特徵提取,其中濾波器採用theano中CNN原始濾波器。使用了3個卷積層,大小分別爲[3*3]、[2*2]、[2*2]。
  • 匯聚層:在在空間維度(寬度和高度)上進行降採樣(down sampling)操做,本模型採用兩個[2*2]的匯聚層。
  • 全鏈接層將會計算分類評分,全鏈接層與常規神經網絡同樣,其中每一個神經元都與前一層中全部神經元相鏈接。本模型使用了3個全鏈接層,分別是兩個隱層和一個輸出層,隱層大小爲1000個神經元,輸出層大小爲30個神經元,即爲最終結果。

另外,本模型採用學習動量的方式遞歸降低更新神經網絡中的參數,也就是對其學習率(步長)進行動態的調整,在開始令其學習率較大,這樣加快參數更新次數,隨着次數的增長,減少學習率,防止其在最優解附近產生震盪的現象,從而從總體上提升模型效果,減少偏差。
數據輸入
輸入數據爲1個通道的灰度圖像,其大小爲[1*96*96],可是在圖像中有部分干擾圖像,也就是否是單純的頭部圖像,其中正常的圖像輸出顯示如圖2.1。
網絡

圖片描述
圖2.1輸入圖片數據可視化

可是數據集中有部分臉部重要座標確實,所以在7000多個訓練集中,只有大概2000多個是完整的,須要做出相應處理,在本模型中暫時使用完整的數據集數據。
數據輸出
識別出的具體臉部重要位置座標(x,y)
根據訓練集中的數據進行訓練,相應的輸出與之相同,即分別爲以下變量對應x和y值:left_eye_center,right_eye_center,left_eye_inner_corner,left_eye_outer_corner,right_eye_inner_corner,right_eye_outer_corner,left_eyebrow_inner_end,left_eyebrow_outer_end,right_eyebrow_inner_end,right_eyebrow_outer_end_,nose_tip,mouth_left_corner,mouth_right_corner,mouth_center_top_lip,mouth_center_bottom_lip。這正是將要被預測的屬性。
輸出座標能夠可視化爲以下圖2.2.
這裏寫圖片描述
圖2.2 輸出參數可視化

III. 數據輸入和處理

首先進行數據輸入。因爲數據集中部分數據時是缺失的,所以對輸入數據須要特殊處理,也就是對輸入數據的進行過濾處理,也就是對csv數據進行篩選,選擇出完整的數據集合,數據集大概大小是2000多個;
其次進行相應的數據填充。因爲完整的數據集數目較少,所以若是僅僅使用少許數據,其將會在訓練後期出現嚴重的過擬合現象,具體圖像可視化如圖3.1所示。因此對其進行相應的數據擴充操做,數據擴充的意思是咱們人爲地經過一些手段(變形、添加噪聲等等)增長訓練用例的個數。批量迭代器的工做是採集一個訓練集合的樣本矩陣,分紅不一樣的批次(在本模型中採用128個用例一批)。當把訓練樣本分紅批次的時候,批處理迭代器能夠順便把輸入變形這件事作的又快又好。咱們在進行批處理迭代的時候,以50%的概率進行水平翻轉。這很是的方便,對某些問題來講這種手段可讓咱們生產近乎無限的訓練集,而不須要增長內存的使用。所以本模型中採起將圖片翻轉的方式進行擴充。學習

圖3.1 小數據集過擬合現象.net

IV. 評價指標

按照官方的評價標準,採用的是RMSE的偏差衡量標準:
設計


這裏寫圖片描述

所以須要儘量採起相應手段縮小RMSE的值。

V. 訓練效果

該模型最終跑在酷睿i5,搭載NVIDIA GeForce750M上,訓練1000 epoch大概須要花費兩個小時,每一個epoch時間大概在7-8秒之間。
根據III小結中數據擴充方法,在進行圖像擴充先後的結果顯示能夠看到效果有所提高,而且過擬合現象也有所緩解。
爲詳細描述最終效果,該模型最終詳細結果可視化如圖5.2所示。
這裏寫圖片描述
blog

圖5.1 最終結果可視化

相關代碼教程

相關參考遞歸

相關文章
相關標籤/搜索