基於CNN的人臉識別(上)
具體代碼實現可參看
Keras深度學習應用1——基於卷積神經網絡(CNN)的人臉識別(下)
代碼下載
Github源碼下載地址:
https://github.com/Kyrie-leon/CNN-FaceRec-keras
git
1、 CNN概述
1.1 CNN發展歷程
卷積神經網絡由生物學天然視覺認知機制啓發而來。1962年,諾貝爾獎得主D.H.Hubel和T.N.Wiesel,這兩位學者經過對貓腦部皮層中特定的神經元進行研究時,發現了其獨特的網絡結構。根據這個啓發有學者提出了新識別機(recognition)的概念,這也是深度學習中第一個在真正意義上實現的卷積神經網絡。自此之後,科學家們開始對CNN進行了深刻的研究和改進。
卷積神經網絡是屬於前饋神經網絡下多層神經網絡的一種深度機器學習方法,以下圖所示,能夠看出神經網絡的大體分佈。
圖1-1 神經網絡分佈圖
與傳統的圖像處理算法相比,CNN的優勢爲它可以有效避免在前期準備中,須要對圖像進行大量的、繁瑣的人工提取特徵工做。這也說明,CNN可以直接從圖像原始像素出發,只需經過一些預處理過程,就能夠識別出圖像上的特徵規律。但在當時由於研究環境不理想,好比,訓練數據集數量有限,而且計算機的圖形處理能力跟不上,使得深度學習依賴的兩大基礎因素:「燃料」和「引擎」,都不能達到理想的運行標準。這也致使了咱們熟知的LeNet-5神經網絡結構,其在複雜問題的處理上表現的並不理想。隨着以後神經網絡的發展進入了低潮期,CNN的研究工做也一直沒有突破性的進展。
github
從2006年起,在大數據和高性能計算平臺的推進下,科學家們開始從新改造CNN,並設法克服難以訓練深層CNN的困難。其中最著名的CNN結構被命名爲:AlexNet,它一樣也是一個比較經典的結構。在圖像識別任務上,AlexNet取得了重大突破,並以創紀錄的成績奪得了當年的ImageNet冠軍。它總體的框架與LeNet-5相似,但通過改進後層數要更深一些。算法
在AlexNet模型取得顯著的成績後,科學家們又相繼提出了其餘功能完善、效果良好的改進模型。至此,卷積神經網絡的發展脈絡以下圖所示。
網絡
卷積神經網絡的演變歷程(實線表示模型改進,虛線表示模型革新)框架
從結構看,CNN發展的一個顯著特色就是層數變得愈來愈深,結構也變得愈來愈複雜,經過增長深度,網絡可以抽象出更深層、更抽象的特徵。機器學習
1.2 CNN基本結構
卷積神經網絡,顧名思義,其得名自卷積(convolution)操做,而卷積的目的則是將某些特徵從圖像中提取出來,正如視覺系統辨識具備方向性的物體邊緣同樣:首先檢測橫線、豎線、斜線等具備方向性的基本的物體邊緣,而後將若干個邊緣組合城物體的部分,最後再根據檢測到的物體的部分分析物體具體是什麼。函數
典型的卷積神經網絡是一種多層網絡結構,每一層中都包含了必定數量的二維平面,在這些二維平面上有許多獨立的神經元結構。CNN網絡中一般還含有1到3個特徵提取階段,由卷積和池化組成,以後是一個分類器,該部位一般由1到2個全鏈接層所組成。
一個簡單的卷積神經網絡模型如圖1-3所示。從圖中能夠看出,該網絡模型含有兩個特徵提取階段,一個分類器(全鏈接層)。在CNN的通常結構中,主要由輸入層、隱藏層和輸出層三部分構成,在隱藏層中一樣包含三部分:卷積層(用於特徵提取)、池化層(用於特徵優化選取)、全鏈接層(至關於傳統多層感知機中的隱藏層)。
性能
2、 CNN算法原理
2.1 CNN基本網絡結構
一個典型的卷積神經網絡主要由輸入層、卷積層、池化層、全鏈接層、激勵層,5種結構構成。一張圖像從輸入層輸入,依次通過卷積層、池化層等多層的特徵提取,最終抽象成信息量最高的特徵從全鏈接層輸入到Softmax層進行分類。學習
2.1.1輸入層
輸入層,顧名思義就是整個CNN的數據輸入,一般把一個通過預處理的圖像像素矩陣輸入到這一層中,對於不一樣類型的圖片輸入時需定義圖片類型,例如黑白圖片就是一幅單通道圖像、RGB圖片就是三通道圖像。
當一幅圖像輸入到卷積神經網絡中後,會通過若干個卷積層和池化層的運算,直至全鏈接層降維,所以圖片的數量和分辨率都會對模型的性能形成必定的影響。
大數據
2.1.2卷積層
卷積層是整個卷積神經網絡的核心部分,其做用爲提取圖像特徵和數據降維。卷積層包含有多個卷積核,該卷積核的尺寸一般由人工指定爲3×3或5×5。
假設卷積核的大小爲3×3,其中卷積核爲:
如圖詳細解釋了卷積運算的執行過程。首先選取圖中的3×3尺寸的conv卷積核,接下來從矩陣A的左上角開始劃分出一個和卷積核尺寸一樣大小的矩陣,將這個矩陣與conv對應位置上的元素逐個相乘而後求和,獲得的值即爲新矩陣的第一行第一列的值,而後按照從左到右從上到下的窗口滑動順序,重複以上步驟(即圖中step2-step9),最終獲得一個新的矩陣(step9中右側矩陣)。這個矩陣保存了圖像卷積操做後的全部特徵。
對於圖片的邊界線點,CNN的卷積核有兩種處理方式。一種是對輸入的矩陣不採起任何操做,直接按照上所示的順序進行卷積操做,但通過該處理方式後輸出矩陣的大小發生改變,輸入矩陣大於輸出矩陣。另外一種處理方式是對原矩陣邊界進行全0填充(zero-padding)後再進行卷積計算,這種處理方式使得矩陣在輸出後尺寸仍然不發生改變,如圖所示。
2.1.3池化層
池化(pooling)也稱採樣(sub sampling)或下采樣(down sampling)。池化層能夠在保留原圖片特徵的前提下,很是有效的縮小圖片尺寸,減小全鏈接層中的參數。所以,該步驟又稱爲降維。添加池化層不只加速了模型的計算,並且能夠防止模型出現的過擬合現象。
池化也是經過一個相似於卷積核的窗口按必定順序移動來完成的。與卷積層不一樣的是池化不須要進行矩陣節點的加權運算,經常使用的池化操做有最大值運算和平均值運算。其相應的池化層也分別被稱爲最大池化層(max pooling)和平均池化層(average pooling)。其他的池化運算實踐中使用較少,本文不作過多贅述。
池化窗口也須要人工指定尺寸,是否使用全零填充等設置。本文選用最大池化層,池化窗口尺寸爲2×2,不使用全零填充,則池化過程如圖2-3所示。首先將該特徵矩陣劃分爲4個2×2尺寸的矩陣,而後分別取出每一個2×2矩陣中的最大像素值Max,最後將每4個矩陣中的最大像素值組成一個新的矩陣,大小爲池化窗口的尺寸,即爲2×2。如圖2-3所示右側矩陣通過最大池化運算後的操做結果。一樣的,分別對每一個2×2矩陣取平均值獲得的新矩陣即爲平均池化操做結果。
2.1.4全鏈接層
全鏈接層主要用於綜合卷積層和池化層的特徵。因爲卷積層和池化層都可以提取人臉的特徵,所以通過多層的處理後,圖像中的信息已經被提取成信息量更高的特徵。這些特徵經過全鏈接層後成爲一幅圖像信息的最終表達,並做爲輸入特徵輸入到分類器中完成分類任務。全鏈接層是整個網絡最難訓練的部分,若是訓練樣本過少,則可能形成過擬合現象。所以,採用隨機失活(dropout)技術,抑制模型出現的過擬合現象。所謂隨機失活是在學習過程當中經過將隱藏層(通常爲全鏈接層)的部分節點權重隨機歸零,從而下降節點間的相互依賴性。
2.1.5 激勵層
多層神經網絡比單層感知機強大的緣由之一,是由於激活函數爲它引入了非線性的學習和處理能力。單層感知機因其結構較簡單,因此學習能力十分有限,在單一模型的限制下只能被用來解決線性可分問題,不能進行深刻的研究。
在神經網絡的研究中,常見的激活函數主要有階躍函數、sigmoid函數、ReLU函數等。其中,階躍函數能夠直接將輸入的數據映射爲1或者0(1表示處於激活,0表示抑制),可是由於它不連續、不光滑、不可導,因此在實際應用中一般不會將其做爲激活函數。sigmoid函數近年來也不多被採用,由於它會在神經網絡進行反向傳播訓練時產生不可解決的梯度消失問題,從而致使訓練深層網絡的效果不理想。因此這裏主要對ReLU函數進行介紹。
在多層神經網絡中,要研究的對象更加複雜,須要一個穩定、快速,且具備更好的預測性能的函數做爲激活函數。爲解決這個需求,線性整流函數(ReLU)於2012年Hinton等人發表的論文中被提出。經過研究發現ReLU的收斂速度相比於其餘激活函數要快不少,且能更有效的避免梯度爆炸和梯度消失(層數太大)的問題。目前ReLU函數已做爲經常使用激活函數被應用於多層神經網絡。一般狀況下將其定義爲式:
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
也能夠寫成
ReLU函數定義了當前神經元在通過線性變換以後的非線性輸出結果,其輸出能夠表示爲 。從它函數數學定義上能夠看出:當輸入大於0的時候,輸出就是輸入,而當輸入小於0時,輸出就保持爲0了,如圖2-4所示。