基于深度學習的人臉表情識別系統(tǒng)_第1頁
基于深度學習的人臉表情識別系統(tǒng)_第2頁
基于深度學習的人臉表情識別系統(tǒng)_第3頁
基于深度學習的人臉表情識別系統(tǒng)_第4頁
基于深度學習的人臉表情識別系統(tǒng)_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

基于深度學習的人臉表情識別系統(tǒng)摘要隨著社會的進步和經(jīng)濟的發(fā)展,人工智能已經(jīng)開始應(yīng)用于各種各樣的場景,最典型的應(yīng)用就是機器人的應(yīng)用。人機交互的設(shè)計已經(jīng)越來越成熟,而機器人要想了解人的正確想法就不應(yīng)僅體現(xiàn)在語言上,還應(yīng)該在其他方面分析出人的正確情感,表情識別分析就是一個主要攻克點。本文從自然神經(jīng)網(wǎng)絡(luò)的介紹一直到運用卷積神經(jīng)網(wǎng)絡(luò)搭建模型進行具體的分析,包括自然神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)的知識歸納,包括一些數(shù)學推導過程,對模型搭建過程和結(jié)果分析,會將所用的知識點進行詳細歸納讓人更好地理解和實現(xiàn)實際的模型搭建。本文的模型搭建最終使用2012年ILSVRC的冠軍AlexNet實現(xiàn),且會對模型進行分析。結(jié)尾也會適當提出運用VGG網(wǎng)絡(luò)、ResNet、GoogLeNet等具有較多層神經(jīng)網(wǎng)絡(luò)的方法對模型的改進。關(guān)鍵詞:表情識別、卷積神經(jīng)網(wǎng)絡(luò)、知識歸納、數(shù)學推導、AlexNetFacialexpressionrecognitionsystembasedondeeplearningAbstractWiththeprogressofsocietyandthedevelopmentofeconomy,artificialintelligencehasbeenappliedinavarietyofscenarios,themosttypicalapplicationistheapplicationofrobots.Thedesignofhuman-computerinteractionhasbecomemoreandmoremature.Inordertounderstandthecorrectthoughtsofpeople,robotsshouldnotonlybereflectedinlanguage,butalsoanalyzethecorrectemotionsofpeopleinotheraspects.Facialexpressionrecognitionanalysisisamajorbreakthroughpoint.Thisarticlefromthenatureoftheneuralnetworkisintroducedtouseconvolutionneuralnetworktobuildmodelforconcreteanalysis,includingnaturalneuralnetworkandtheconvolutionoftheneuralnetworkknowledge,includingsomemathematicalderivation,analysisonthestructures,processesandresultsofthemodel,willbeusedintheknowledgepointsindetailsummarizedmakepeoplebetterunderstandandrealizetheactualmodelissetup.ThemodelbuildinginthispaperisfinallyimplementedbyAlexNet,thechampionofILSVRCin2012,andthemodelwillbeanalyzed.Attheendofthepaper,itwillalsoputforwardtheimprovementofthemodelbyusingVGGnetwork,ResNet,GoogLeNetandothermethodswithmorelayersofneuralnetworks.Keywords:Facialexpressionrecognition;convolutionalneuralnetwork;Knowledgeofinduction;Mathematicaldeduction;AlexNet;目錄1緒論 1.1人臉表情識別的目的和現(xiàn)實意義 11.2人臉表情識別技術(shù)國內(nèi)外現(xiàn)狀 11.3環(huán)境的搭建 21.3.1Python 21.3.2Anaconda3 31.3.3jupyternotebook 32深度學習的基本原理2.1引言 32.2自然神經(jīng)網(wǎng)絡(luò)的基本原理 32.3卷積神經(jīng)網(wǎng)絡(luò)的基本原理 52.3.1引言 52.3.2CPU與GPU 52.3.3激活函數(shù)與學習率 52.3.4學習率 62.3.5感受野和卷積核 62.3.6卷積層和池化層 72.3.7填充 82.3.8全連接層 82.3.9特征歸一化 92.3.10損失函數(shù)與優(yōu)化器 92.3.11dropout(正則化) 102.3.12BatchNormalization 102.3.13混淆矩陣和ROC曲線 112.3.14epochs與batch_size 112.3.15trainingloss與validationloss的關(guān)系 113基于卷積神經(jīng)網(wǎng)絡(luò)的人臉表情識別 3.1引言 113.2數(shù)據(jù)的預處理 123.3圖片的轉(zhuǎn)換 133.4搭建模型 153.5直接用.csv文件中的數(shù)據(jù)進行模型搭建與訓練 153.6最終模型展示 173.7結(jié)果分析 193.8改進過程分析 204關(guān)于VGG網(wǎng)絡(luò)、ResNet、GoogLeNet的圖像處理 4.1引言 214.2VGG網(wǎng)絡(luò) 214.3ResNet 214.4GoogLeNet 215總結(jié) 參考文獻 23致謝 24附錄 25PAGE61緒論人工智能是近幾年的熱點,python的簡易學習和GPU的發(fā)展,極大的促進了機器學習和深度學習的發(fā)展,為了解決各種問題演化出了各種神經(jīng)網(wǎng)絡(luò)如:自然神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)等。隨著人們不斷地去學習和優(yōu)化,各種各樣的模型被人們搭建出來,也出現(xiàn)了各種算法。本文將從基礎(chǔ)的自然神經(jīng)網(wǎng)絡(luò)開始,一直到用卷積神經(jīng)網(wǎng)絡(luò)進行圖像處理,會詳細的分析和總結(jié)所有知識點,供大家學習參考。1.1人臉表情識別的目的和現(xiàn)實意義隨著科技的不斷進步,人們對機器人以及其他人工智能的研究已經(jīng)越來越成熟,人機的交互一直是機器人研究的一個熱門,怎么樣才能使機器人更好的理解和讀懂人們的意思并進行正確的行為是一個重要的課題。那怎么樣才能讓機器人準確的分析出人此時此刻的心理狀態(tài)呢?一提到這個問題,人們的主要思路肯定是對機器人本身的詞庫進行拓展,并且設(shè)成堆的關(guān)鍵詞,讓機器人準確的抓取人們語言中所要表達的情感。但是曾經(jīng)有個著名的心理學家提出,人類在生活交流就是一種信息的傳遞,而用語言進行信息傳遞的方式只占總體的7%,肢體語言及其他方式占總體的百分之38%,通過人臉表情進行信息傳達的方式高達55%。在生活中,可以從一個人的表情分析出一個人此時此刻的心理狀態(tài),哲學家將人的表情分為七大類,分別是開心、悲傷、恐懼、憤怒、厭惡、驚訝、中性七種。這說明如果能用一個模型進行人臉表情的識別和分析就能對人們此時此刻的心情狀態(tài)進行準確的分析,這對機器人分析出人的情感的幫助遠遠大于對關(guān)鍵詞的分析,對于機器人的發(fā)展以及實際應(yīng)用是一個巨大的飛躍。1.2人臉表情識別技術(shù)國內(nèi)外現(xiàn)狀早在19世紀,達爾文就發(fā)表過一篇文章《論人類和動物的表情》,表面了表情的一致性,說明表情是不按性別與種族來判斷的。FacialExpressionRecognition(簡稱FER)在國外已經(jīng)較為成熟,因為在幾年前就舉辦了關(guān)于表情識別的比賽,比如2013年的FER2013,Emotiw等。因為各種神經(jīng)網(wǎng)絡(luò)都是國外的大牛提出,所以國內(nèi)在表情識別領(lǐng)域一直處于追趕的一方。但借助互聯(lián)網(wǎng)平臺可以方便與國外的深度學習進行交流和探討,國內(nèi)的深度學習算法也發(fā)展得很快,總體上也不算太過于落后。人臉表情識別技術(shù)主要分為兩部分,一部分是在圖片中將表情特征進行提取,然后進行模型的搭建與訓練,另一部分就是人臉的檢測。人臉的檢測分為動態(tài)檢測和靜態(tài)檢測,靜態(tài)檢測要對圖片進行處理對人臉進行掃描和識別,運用各種算法進行特征提??;動態(tài)監(jiān)測要通過特定的攝像頭進行動態(tài)人臉的識別掃描和處理后傳送給模型,其中涉及到3D模型的算法,傳給模型的過程中也需要進行類似靜態(tài)檢測的過程對人臉進行掃描和識別。人臉識別是深度學習和機器視覺的一個交互學科和熱點,本文不作著重解釋。對于表情特征提取現(xiàn)國內(nèi)外具有很多熱門的算法,主要有幾何特征提取、運動特征的提取、統(tǒng)計特征提取和頻率域特征提取。幾何提取就是對人臉表情的各個特征進行提取和分析,如眼睛、嘴巴等,這是最原始的做法也最好理解和實現(xiàn),本文也是運用CNN網(wǎng)絡(luò)對人臉表情進行提取后識別表情。對于其他特征提取這里也介紹幾個現(xiàn)階段國內(nèi)外熱門的人臉表情識別方法:Gabor變換:通過不同的卷積核頻率對圖像進行多頻率的分析,可以有效的提取不同空間位置中不同細節(jié)程度的特征,經(jīng)常與支持向量機一起使用。在空間域中有較好的分辨能力且有明顯的方向選擇性。但如果是低維度的特征會出現(xiàn)識別和匹配困難的問題,樣本少時準確率也會大大降低;支持向量機:是一種人類識別的分類器,常與Gabor濾波器一起使用,但是當樣本過大時計算量會很大,學習的過程會很復雜;光流法:將運動圖像用函數(shù)表示,根據(jù)圖像強度守恒原理建立光流約束方程,通過求解方程計算運動參數(shù)??梢苑从橙四槺砬樽兓膶嶋H規(guī)律,并且受外界的影響較小,尤其是光照的變化對識別率不會產(chǎn)生太大的變化。但是因為計算量大和識別模型、算法較復雜,在小樣本模型中適用性??;隱馬爾模型:由觀察的面部表情序列模型計算面部表情序列的概率,選用最佳準則來決定狀態(tài)的轉(zhuǎn)移,得到相應(yīng)的模型參數(shù)。采用隱馬爾模型的識別準確率較高,但是對前期的面部表情序列模型要求較高,對表情識別算法的準確率也有較大的影響。1.3環(huán)境的搭建要想項目順利進行,環(huán)境的搭建是必不可少的一步。首先需要明確想要的工作環(huán)境,我是在window系統(tǒng)下進行項目的進行。(對以后想從事深度學習工作的學者建議使用Linux系統(tǒng),以為企業(yè)的項目一般都會用Linux系統(tǒng)進行,提前熟悉有助于以后就業(yè)).1.3.1Python第一步是安裝python3.6.3(3.6版本的python對代碼和各種源碼包的兼容性更強)Python的主要的功能就是將編程語言一行一行地進行轉(zhuǎn)譯,每轉(zhuǎn)譯一行程序就會得到相應(yīng)的敘述,然后才會進行下一行程序的轉(zhuǎn)譯,就像和機器人互動一樣,每給他一條或多條指令后會得到相應(yīng)的回復后再編譯下一個指令。安裝完python要配置環(huán)境變量,在我的電腦-屬性-高級設(shè)置-環(huán)境變量里進行添加。1.3.2Anaconda3第二步是安裝Anaconda3,Anaconda3是Python的發(fā)行版本,集成了python和常見的軟件庫,比如numpy、pandas等,因為集成了很多軟件庫所以文件比較大。這里要注意一點每一個軟件庫都是分版本的,比如你在網(wǎng)上找的一個項目想驗證一下,但是可能因為numpy的版本不匹配導致代碼編譯失敗,這時可用Anaconda自帶的虛擬環(huán)境進行軟件庫指定安裝,用conda指定版本安裝。1.3.3jupyternotebook第三步是安裝jupyternotebook,jupyterNotebook也可以稱為Pythonnotebook。是一個交互式筆記本,可以在運行代碼時像word操作一樣可以做大量解釋說明。它就是一個網(wǎng)頁程序,可以理解為運用瀏覽器編寫Python文件,一般可用于機器學習、數(shù)據(jù)清理和轉(zhuǎn)換和統(tǒng)計建模等。jupyterNotebook可以直接用Anaconda自帶的虛擬環(huán)境用pipjupyternotebook指令就可以直接安裝使用。2深度學習的基本原理2.1引言在深度學習真正發(fā)展前,具有淺層網(wǎng)絡(luò)和深層網(wǎng)絡(luò)的劃分,將機器學習分為兩個階段:第一階段的機器學習運用了Backpropagation,也就是BP算法。當時也是機器學習比較熱門的時期,提出了很多不同的神經(jīng)網(wǎng)絡(luò)模型,比如支持向量機(SVM)、最大熵法(LR);第二個階段就是在2006年,機器學習的專家Hinton提出使用多層神經(jīng)網(wǎng)絡(luò)進行模型搭建,使深度學習更快的發(fā)展。2.2自然神經(jīng)網(wǎng)絡(luò)的基本原理把自然神經(jīng)網(wǎng)絡(luò)用科學領(lǐng)域的理論進行表述分析,就是一種模仿生物神經(jīng)網(wǎng)絡(luò),比如動物的中樞神經(jīng)系統(tǒng),特別是大腦的結(jié)構(gòu)和功能的模型,用于對函數(shù)進行近似地計算。圖2.1自然神經(jīng)網(wǎng)絡(luò)示意圖神經(jīng)網(wǎng)絡(luò)模型的核心體系結(jié)構(gòu)是由大量簡單的神經(jīng)元處理節(jié)點組成的,這些節(jié)點是在不同的層次上相互連接和組織的。一個層中的單個節(jié)點連接到上一層和下一層中的其他幾個節(jié)點。接收并處理來自一個層的輸入,以生成傳遞到下一層的輸出。自然神經(jīng)網(wǎng)絡(luò)的第一層為輸入層,最后一層為輸出層,輸入層和輸出層之間的每一層都為隱藏層。分析完神經(jīng)網(wǎng)絡(luò)后可以得出兩個基本的組成成分,分別是神經(jīng)元和突觸,而在自然神經(jīng)網(wǎng)絡(luò)中他們代表著兩個重要的參數(shù):節(jié)點和權(quán)值。節(jié)點也稱為感知器,具有一個或多個權(quán)重輸入的計算單元,以節(jié)點組織成層后構(gòu)成網(wǎng)絡(luò)。權(quán)重則是指在這個節(jié)點數(shù)據(jù)的重要性。舉個簡單的例子:在一張白紙上畫一個蘋果并對這張紙運用神經(jīng)網(wǎng)絡(luò)進行分析,邊緣的空白部分在神經(jīng)網(wǎng)絡(luò)中的權(quán)重就很低,而蘋果的權(quán)重就會很高,在后面會提到權(quán)值共享等概念。為了卷積神經(jīng)網(wǎng)絡(luò)搭建過程的分析,必須先總結(jié)一下BP算法和梯度下降法。BP算法主要分成兩部分:一部分就是激勵傳播,另一部分就是權(quán)值更新。激勵傳播是指每次進行數(shù)據(jù)迭代時,將數(shù)據(jù)傳送到網(wǎng)絡(luò)后經(jīng)過響應(yīng)得到相應(yīng)響應(yīng)的輸出,再將輸入和輸出求差值,從而獲得隱藏層和輸出層的響應(yīng)誤差。權(quán)值更新是指在輸出時將輸入激勵和響應(yīng)誤差相乘,從而獲得權(quán)重的梯度,將梯度乘于k后加到原來的權(quán)重上。然后不斷地進行激勵傳播和權(quán)值更新,直到達到想要的目標值附近。而梯度下降法就是一種權(quán)值更新的方法,梯度的分析要從導數(shù)、偏導數(shù)和方向?qū)?shù)進行分析,具體的推導過程就不敘述了,總結(jié)一下就是梯度是函數(shù)在某一點最大的方向?qū)?shù),此時沿這個方向有最大的變化率,在優(yōu)化目標函數(shù)的時,選擇最大方向?qū)?shù)的方向進行權(quán)值更新就可以更快的達到想要的結(jié)果。2.3卷積神經(jīng)網(wǎng)絡(luò)的基本原理2.3.1引言提到圖像處理就必定會提及卷積神經(jīng)網(wǎng)絡(luò),因為圖像都是有一個一個的像素點組成,大的圖片會有成千上個像素點,而卷積神經(jīng)網(wǎng)絡(luò)能運用卷積核對圖像進行批量處理并且權(quán)值共享。2.3.2CPU與GPU提到圖像處理就必定會提及卷積神經(jīng)網(wǎng)絡(luò),因為圖像都是有一個一個的像素點組成,大的圖片會有成千上個像素點,而卷積神經(jīng)網(wǎng)絡(luò)能運用卷積核對圖像進行批量處理并且權(quán)值共享。2.3.3激活函數(shù)與學習率神經(jīng)元的輸入值等于權(quán)值相乘再加上一個偏置,使用激活函數(shù)并不是用來激活神經(jīng)元,而是為了使神經(jīng)網(wǎng)絡(luò)具備分層的非線性能力,使網(wǎng)絡(luò)能解決更多的的問題。激活函數(shù)用于對輸入進行非線性變換,將其映射到輸出,主要的激活函數(shù)有:Sigmoid:Sigmoid是一個將實值輸入壓縮到【0,1】的區(qū)間,因為函數(shù)圖像與指數(shù)函數(shù)相近,在物理意義上比其他激活函數(shù)更接近生物神經(jīng)元,所以使用范圍比較廣,主要用于二分類的輸出層。但是Sigmoid具有飽和性,進入飽和區(qū)后會導致梯度變得非常小,會產(chǎn)生梯度消失的現(xiàn)象。它的公式如下:f函數(shù)圖像:圖2.2Sigmoid與Tanh的變化曲線Tanh:Tanh(Hyperbolictangentfunction)中文名叫雙曲正切函數(shù),是將一個輸入壓縮到【-1,1】的區(qū)間,函數(shù)圖像比較平滑且具有單調(diào)性。但是tanh與Sigmoid一樣具有飽和性,進入飽和區(qū)后會造成梯度消失。它的公式如下:f3.Relu:(rectifiedlinearunit)是近代深度學習和機器學習中最常用的激活函數(shù)。但是它的有缺點也很明顯,它的缺點是:當輸入值為負數(shù)時,其導數(shù)的結(jié)果始終為0,此時神經(jīng)元不能更新參數(shù),相對于生物結(jié)構(gòu)就是神經(jīng)元已經(jīng)死去,這種現(xiàn)象被稱為“DeadNeuron”;但它的優(yōu)點是:在梯度下降的過程中收斂速度更快,在模型搭建過程中參數(shù)的計算更快。為了解決relu的缺點,引入了各種新型的relu函數(shù),比如帶泄露單元的relu(LeakyRelu)、隨機relu函數(shù)(RRelu)。2.3.4學習率總結(jié)完激活函數(shù)后就要總結(jié)一下學習率:在神經(jīng)網(wǎng)絡(luò)中需要不斷地對權(quán)值進行優(yōu)化,當采用梯度下降法時會有一個初始解,然后在初始值確定一個方向?qū)?shù)進行移動,移動的步長由自己定義,使初始解在不斷優(yōu)化的過程中更靠近預測的目標值。而在移動的過程中步長太大會導致可能跨過最優(yōu)解,步長太小會使迭代次數(shù)增加,需要更多成本,因此步長的調(diào)制就很重要,而學習率就是運用于對步長的調(diào)整。例如學習率為0.01時,每次調(diào)整的步長為0.01梯度。2.3.5感受野和卷積核卷積神經(jīng)網(wǎng)絡(luò)是受哺乳動物視覺的啟發(fā),將視覺皮層包含著一系列組合在一起的細腿稱為感受野,他們是小而敏感的視覺區(qū)域。這些細胞在輸入空間上充當局部的過濾器,適合用來處理具有局部相關(guān)性的圖像。通俗的定義感受野就是每一層卷積網(wǎng)絡(luò)輸出的特征圖上的像素點在輸入中映射的區(qū)域。圖2.3卷積過程示意圖在圖中可以清楚的明白感受野的概念,圖中3×3的矩陣就是卷積核。一張N×N的圖像要對他進行處理分析就要進行線性的濾波,可以用一個矩陣對圖像進行處理,輸出的每個像素點為感受野像素和濾波器矩陣相應(yīng)元素的乘積和。移動的距離為步長,一般都為1,而卷積核的大小一般都為3×3或5×5,奇數(shù)的卷積核才具有半徑的概念。而卷積核中所有元素之和應(yīng)該等于1,這是為了使圖片經(jīng)過卷積后亮度保持不變,當元素和大于1時卷積后圖像會變得比原圖更亮,反之小于1時圖片會變暗。對于卷積后每個像素值的大小超過255則直接截斷到0或255。這里說明一下普通的黑白色圖中每個像素點只有一個通道,0-255代表灰度值,而彩圖像的每個像素點具有三個通道用來確定像素點RGB值,同樣一張255×255的圖片,卷積處理黑白圖只需要處理255×255的像素點,而處理彩色圖片需要處理255×255×3的像素點。2.3.6卷積層和池化層卷積神經(jīng)網(wǎng)絡(luò)分為輸入層、輸出層和隱藏層,而隱藏層又分為卷積層和池化層。卷積層就是由若干個卷積核構(gòu)成,每個卷積核的元素都是通過BP算法不斷優(yōu)化得到。卷積是為了提取輸圖像的特征,卷積層數(shù)較少的神經(jīng)網(wǎng)絡(luò)只能從圖像中提取簡易的特征參數(shù),只有多層的卷積網(wǎng)絡(luò)才能從低級特征中提取出更復雜的特征參數(shù)。卷積的過程也是一個數(shù)學計算的過程,在數(shù)學中有嚴謹?shù)耐茖Ш陀嬎恪<僭O(shè)有矩陣A3×3和B2×2,A=123475689,B=1234,那么B卷積A的結(jié)果就是讓B在矩陣A上滑動。換言之,就是B與A的所有2×2連續(xù)子矩陣做對于元素積之和的運算。得到結(jié)果C=3747經(jīng)過多次卷積后的輸出特征圖有可能會因為特征向量出現(xiàn)過擬合現(xiàn)象。在深度學習存在過擬合的概念,總結(jié)一下就是指在最終訓練出的模型會對訓練數(shù)據(jù)完美的匹配,這種模型在實際使用中可能準確率很低,只能對訓練數(shù)據(jù)表現(xiàn)出高的準確率。為了解決過擬合問題可以運用池化層對參數(shù)進行優(yōu)化。池化層一般在卷積層的后面添加,用于壓縮參數(shù)。主要作用表現(xiàn)在兩個方面:一個是保持原圖的主要特征,例如有一個8×8的圖片,里面有個數(shù)字,可能偏左或者偏右,用2×2的filters將他池化后會變成4×4的圖片,原圖的主要特征還會映射在同樣的位置。而另一個作用是特征降維,如果一幅圖像很大,則需要將冗余的信息去掉并且把主要特征提取出來,這就是特征降維,也是池化最主要的作用。池化的過程也可以用矩陣大致表示出來,假設(shè)矩陣C為6×4的矩陣,池化窗口為2×2,則按照池化窗口大小將矩陣C分割成6塊不相交的2×2小矩陣,對每個塊中的所有元素做求和平均操作,稱為平均池化,取最大值則稱為最大池化。假如C=1212343452.3.7填充圖片經(jīng)過不斷的卷積會變得越來越小,需要提取主要的特征就需要多層的卷積,為了不影響與后面全連接層的數(shù)據(jù)交換,引入填充的概念??梢栽诿看尉矸e后對特征圖進行0填充或1填充。顧名思義就是在卷積后的特征圖周圍全部填上0或者1,使卷積后的特征圖與原圖的大小保持不變。2.3.8全連接層全連接層是將之前卷積池化得到的全部特征參數(shù)通過權(quán)值矩陣重新組裝,因為用到了全部的特征參數(shù)所以叫做全連接層。卷積將圖像的特征提取出來后,全連接層會將特征進行統(tǒng)一分析歸類。舉個例子,假如圖片中有一只貓,卷積層可以將圖片中的貓的各個特征提取出來,相對于其他動物來說比如貓的眼睛比狗的眼睛小,貓的皮毛相對于其他動物的不同,對比了很多個特征以后發(fā)現(xiàn)它有貓的眼睛,貓的皮毛和尾巴,然后經(jīng)過全連接層進行分類得到幾個不同的動物,經(jīng)過比較得出貓的權(quán)值最大從而判斷圖片中的動物為貓。全連接層還有個作用,假設(shè)兩張不同的圖片中都有一只貓,只是貓在圖片中的位置不一樣,但是經(jīng)過卷積池化后,經(jīng)過計算后得到的特征圖是一樣的,但可能因為特征位置的不同導致分類結(jié)果不一樣,運用全連接層就能解決這個問題。但是因為空間結(jié)構(gòu)的忽略,導致全連接層不適用于在空間位置上找特點物品的模型,所以要解決非線性的問題需用兩次以上的全連接。但是全連接層的數(shù)據(jù)量很大,約占整個神經(jīng)網(wǎng)絡(luò)的70%以上,所以一般都只用2或者3層。2.3.9特征歸一化在深度學習中,不同的特征向量具有不同的量綱,會影響到數(shù)據(jù)的分析結(jié)果,為了消除量綱的影響,需要對數(shù)據(jù)進行標準化處理。原數(shù)據(jù)經(jīng)過標準化后,特征指標會處于同一數(shù)量級,可以綜合對比評價。歸一化的目的就是將預處理的數(shù)據(jù)限定在一定的區(qū)間內(nèi),從而消除奇異樣本數(shù)據(jù)導致的不良影響。常用的歸一化的方法有兩種:Min-MaxNormalization(最大最小標準化)和Z-score標準化方法。最大最小標準化是將結(jié)果映射到0和1之間,適用于數(shù)據(jù)比較集中的情況,當涉及距離度量和協(xié)方差時不適用,用后一種方法處理數(shù)據(jù)后會使數(shù)據(jù)符合標準正態(tài)分布。這種方法可以處理距離度量和協(xié)方差的數(shù)據(jù),但是要求原始數(shù)據(jù)分布近似為高斯分布。2.3.10損失函數(shù)與優(yōu)化器損失函數(shù)和優(yōu)化器是模型里必須有的兩個函數(shù),每種函數(shù)在keras庫里都已經(jīng)定義好了,只需要把頭文件加進去然后調(diào)用函數(shù)名,寫上參數(shù)就可以使用??偨Y(jié)一下?lián)p失函數(shù)和優(yōu)化器:損失函數(shù)又稱為目標函數(shù),用于計算預測值與標簽值之間的差。而優(yōu)化器是為了調(diào)整學習率和動量。圖2.4損失函數(shù)分析圖舉個模擬線性方程的例子,w1是第一次迭代的權(quán)值,而粗線是真實的方程,目的是要經(jīng)過不斷的迭代使w接近真實值。圖中的豎線分別是三次迭代后預測的Y與真實Y的差值,在二維數(shù)據(jù)中可以直接相減得出差值,但是在多維數(shù)據(jù)就會使用到平方差、均方差等不同的公式計算,這就是損失函數(shù)的作用。損失函數(shù)也可以用來建立一些準則來衡量決策函數(shù)的好壞,然后用所有的訓練樣本評價決策函數(shù)的風險。假設(shè)風險函數(shù)R(θ)是在已知的訓練樣本(經(jīng)驗數(shù)據(jù))上計算得到,表達式為,需要找到一個值(θ),使風險函數(shù)最小。常見的損失函數(shù)有0-1損失函數(shù),平方損失函數(shù)Ly,y=y-fx,θ^2優(yōu)化器的學習率在上文有提到這里不細說,動量在本文調(diào)參中不涉及,在實際應(yīng)用中也比較少,不做細講。2.3.11dropout(正則化)Dropout的作用是在CNN最后的全連接層進行數(shù)據(jù)的隨即丟棄,值得注意的是暫時性的丟棄,在第二次的全連接層可能會被再次暫時丟棄也有可能被按照label進行分類,dropout的使用也是為了防止CNN網(wǎng)絡(luò)的過擬合。我看過一篇論文專門分析dropout,講解的很深有很精確的公式驗證和說明,其中有個例子可以很生動的說明dropout的過程:在自然界中,進行有性繁殖的動物的后代會從父母雙方各繼承一半的基因,有性繁殖會將基于不斷地拆分重組,從而破壞了大段基于的聯(lián)合適應(yīng)性。但是為什么在物競天擇的世界里自然大部分中大型動物都是有性繁殖呢?因為有性繁殖不僅僅可以將優(yōu)秀的基于傳遞給下一代,還可以降低基因之間的聯(lián)合適應(yīng)性,從而使復雜的一大段基因聯(lián)合適應(yīng)性轉(zhuǎn)化成成一段段小基因的聯(lián)合適應(yīng)性。就像軍隊作戰(zhàn)時,50個人互相配合進行任務(wù)和五個人一組分成十組進行分組行動進行任務(wù)的效果會有很多區(qū)別,后者的成功的機會會更大。所以dropout也能達到同樣的效果,它使神經(jīng)元和隨機挑選出的其他神經(jīng)元工作,減弱了神經(jīng)元之間節(jié)點的適應(yīng)性,增強了泛化能力。圖2.5正則化過程示意圖2.3.12BatchNormalizationBatchNormalization簡稱BN算法,是對輸入進行歸一化后給到激活函數(shù)的,解決了輸入發(fā)生偏移的影響。運用算法后可以加快訓練速度,增大學習率。采用BN算法后可以不使用池化層,因為參數(shù)歸一化后分布變得明顯,經(jīng)過一個激活函數(shù)以后,神經(jīng)元會自動削弱或者去除一些神經(jīng)元,就不用再對其進行dropout處理。2.3.13混淆矩陣和ROC曲線混淆矩陣是作為分類的準確度標準,是學習效果進行評估的指標?;煜仃嚭蠺N(truenegative)、FP(falsenegative)、FP(falsenegative)、TP(truepositive),比如一個懷孕的女生去做檢查,給出結(jié)論是懷孕了則是TN(truenegative),如果檢測結(jié)果是沒懷孕則是FP(falsenegative),一個男生去檢測結(jié)果是懷孕了則是FP(falsenegative),沒懷孕則是TP(truepositive)。由這四個參數(shù)引申出兩個參數(shù)-精確率和召回率,精確率(TPR)也稱之為查準率,指實際為正樣本(TP)的預測結(jié)果占總預測為正樣本(TP+FP)的比重;召回率(FPR)也稱為查全率,指實際為正樣本預測(TP)占正確預測結(jié)果(TP+FN)的比重?;煜仃嚳梢酝ㄟ^使用scikit-learn模塊實現(xiàn)。ROC曲線就是由精確率和召回率的點組成,橫軸為精確率,縱軸為查準率。ROC曲線下的面積越大代表模型的準確性越高,泛化能力越強。ROC曲線圖在1×1的區(qū)間內(nèi),中的四個頂點分別代表各種極端:(0,1)表示此時所有正樣本都被正確的預測,沒有負樣本被預測為正樣本;(1,0)表此時所有的正樣本都被錯誤的認為是負樣本;(0,0)表示此時分類器將所有的樣本都判定為負樣本;(1,1)表示此時分類器將所有的樣本都判定為正樣本。2.3.14epochs與batch_sizebatch_size為批處理長度,在梯度下降法中的的參數(shù)更新有兩種方法,第一種是計算全部參數(shù)的損失函數(shù),進行梯度更新,這種方法叫批梯度下降法。另一種是每遍歷一個數(shù)據(jù)就計算損失函數(shù)進行梯度更新,且不需要遍歷全部數(shù)據(jù),稱為隨機梯度下降法。前一種方法計算量大,后一種方法收斂性能沒那么好,所以采用了折中的方法進行小批量梯度下降,然后分多個批次,減少了隨機性和計算量。舉個例子:10000個樣本,batch_size為100,則需要迭代10次,此時算訓練完一次整個樣本,用epoch表示。例如樣本為10000,batch_size為100,epoch為5就意味著10000個樣本每一次訓練完成需要迭代10次,整個模型的搭建要訓練5次。2.3.15trainingloss與validationloss的關(guān)系在模型驗證分析時,常用的分析方法之一就是對比trainingloss和validationloss函數(shù)圖像,從而方便對模型的進一步改進。當trainingloss下降,validationloss下降,說明神經(jīng)網(wǎng)絡(luò)還在學習;當trainingloss下降,validationloss不變,說明神經(jīng)網(wǎng)絡(luò)過擬合;當trainingloss不變,validationloss下降,說明數(shù)據(jù)集有問題;當trainingloss不變,validationloss不變,說明停止學習,需要減小學習率;當trainingloss上升,validationloss上升,說明超參數(shù)設(shè)置不當,數(shù)據(jù)集有問題。3基于卷積神經(jīng)網(wǎng)絡(luò)的人臉表情識別3.1引言總結(jié)完自然神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)中基礎(chǔ)的概念和知識點后,將在這一小節(jié)進行用卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)的AlexNet進行模型搭建和分析。3.2數(shù)據(jù)的預處理在進行模型搭建前,數(shù)據(jù)的處理是最繁瑣也是最重要的,因為只要你懂得神經(jīng)網(wǎng)絡(luò)的各種原理,在模型搭建好后可以由計算機自己計算分析,不需要人為的干涉它。但是計算機處理的數(shù)據(jù)需要人為得給它,而且不能有臟數(shù)據(jù)等,所以對數(shù)據(jù)的預處理很重要。本設(shè)計用的數(shù)據(jù)是kaggle的fer2013數(shù)據(jù)集,數(shù)據(jù)集不是一張張圖片而是將數(shù)據(jù)保存到csv文件中,所以可以運用panda的函數(shù)進行數(shù)據(jù)讀取也可以直接轉(zhuǎn)換成圖片識別。數(shù)據(jù)集中分為訓練集、測試集和驗證集。文件中的label由0-7組成,分別代表著:0(憤怒)、1(厭惡)、2(恐懼)、3(開心)、4(傷心)、5(驚訝)、6(中性)等七種表情。其中訓練集具有28708張圖片,測試集具有3589張圖片,驗證集具有3589張圖片,圖片大小都為48×48×1。本文會在附錄會給出下載地址。3.3圖片的轉(zhuǎn)換首先將文件轉(zhuǎn)化為.csv格式,這樣才能用python對數(shù)據(jù)進行批量處理。需要根據(jù)label分成三個.csv文件,分別代表訓練集、測試集和驗證機,用database_path加文件路徑獲取文件內(nèi)的數(shù)據(jù)。這里需要提一下因為用的是有監(jiān)督學習。機器學習分為有監(jiān)督學習和無監(jiān)督學習,有監(jiān)督學習和無監(jiān)督學習的區(qū)別在于訓練數(shù)據(jù)中有沒有帶有標簽(label),大部分的卷積神經(jīng)網(wǎng)絡(luò)都是采用有監(jiān)督的學習,事先為每組數(shù)據(jù)每張圖片打上標簽,分好類型然后讓機器學習;無監(jiān)督學習的數(shù)據(jù)不含有l(wèi)abel,適用于增強學習等其他神經(jīng)網(wǎng)絡(luò)。因為帶有標簽,需要把label給到中間變量然后刪去再將數(shù)據(jù)進行轉(zhuǎn)化變成圖片。圖3.1去除label的過程展示然后將去掉標簽后的數(shù)據(jù)打開,然后根據(jù)每一個像素點的灰度值轉(zhuǎn)化為48×48的圖片。圖3.2轉(zhuǎn)化成圖片的過程展示效果展示:(a)(b)圖3.3轉(zhuǎn)化后效果展示3.4搭建模型首先定義圖像的長和寬,目的是告訴網(wǎng)絡(luò)輸入圖像矩陣的大?。?8×48×1),確認圖像的通道分量,便于搭建網(wǎng)絡(luò)結(jié)構(gòu)。圖3.4模型搭建示意圖1然后開始定義網(wǎng)絡(luò)結(jié)構(gòu),首先先建立一個model,然后開始添加卷積層、激活函數(shù)、池化層。圖3.5模型搭建示意圖2搭建的原始模型中第一層卷積層用的是32個5×5的卷積核進行原始圖像的特征提取,沒有寫步長默認為1,采用0填充,使用relu做激活函數(shù),然后再之后構(gòu)建一個kernelsize為3*3的池化層,步長為2。第三層用32個4×4的卷積核進行第二次卷積,采用0填充,使用relu做激活函數(shù)。第四層構(gòu)建一個kernelsize為3*3的池化層,步長為2;第五層為64個5×5的卷積核進行第三次卷積,第六層構(gòu)建一個kernelsize為3*3的池化層,步長為2。然后添加全連接層,需要先將featuremap轉(zhuǎn)成n*1的一維網(wǎng)絡(luò)。第一層全連接層長度為2048,激活函數(shù)為relu,然后正則化百分之40的特征參數(shù)。再構(gòu)建第二層的全連接層,長度為2048,激活函數(shù)為relu,正則化百分之40的特征參數(shù)。然后添加一層BatchNormalization,最后將全連接層的特征參數(shù)按label分為7類,激活函數(shù)采用sigmoid。 然后就是選擇優(yōu)化器和損失函數(shù),優(yōu)化器選擇的是SGD(隨機梯度下降)也叫增量梯度下降,是對隨機樣本進行更新,at+1=at-λσR(θt;xt,ytσθ(圖3.6模型搭建示意圖3最后用model.fit開始model的訓練。3.5直接用.csv文件中的數(shù)據(jù)進行模型搭建與訓練一開始是使用.csv數(shù)據(jù)文件中的數(shù)據(jù)轉(zhuǎn)化為圖片,再對圖片繼續(xù)特征讀取與模型訓練,這是一個比較傳統(tǒng)但是比較耗費CPU的過程,可以直接用數(shù)據(jù)進行模型搭建的過程。直接使用.csv文件的話需要先檢查訓練數(shù)據(jù)是否有空值,這會對訓練過程產(chǎn)生巨大的影響,因為少了一個像素點的值,后面的像素點就會往前移一個,整個圖片就會糊了,這里要注意0不等于空值,可以用rain.isnull().any().describe()命令實現(xiàn)。然后需要將訓練集和測試集進行標準化,再利用reshape函數(shù)將訓練數(shù)據(jù)變成height=28px,width=28px,通道為1的圖片數(shù)據(jù),但是這組數(shù)據(jù)只是相對于中間變量不會像上一種方法輸出圖片。然后使用one-hot編碼將0-6數(shù)字標簽編碼成七維向量。One-hot是將類別變量編碼轉(zhuǎn)換為機器學習算法易于利用的一種形式的過程,因為彼此獨立,所以用于分類問題,對于數(shù)據(jù)之間存在某種連續(xù)性關(guān)系的數(shù)據(jù)則不能使用one-hot。將訓練集合按照9:1分成訓練集合和驗證集進行10折交叉驗證,交叉驗證的好處是可以在一定程度上減小過擬合且還可以從有限的數(shù)據(jù)中獲取盡可能多的有效信息。然后就是模型的搭建和訓練,過程大致和上面一樣,代碼附錄有。3.6最終模型展示圖3.7最終模型展示圖3.8最終模型各層網(wǎng)絡(luò)參數(shù)展示圖3.9優(yōu)化器與損失函數(shù)定義示意3.7結(jié)果分析經(jīng)過50次訓練后,準確率來到了57.65%,從第一次訓練后的24.94%提升了32.71%,從效果上看模型還算成果,但是根據(jù)模型的實際情況分析。首先可以先看看trainingloss和validationloss的曲線圖,用plt庫就可以實現(xiàn)繪畫。根據(jù)2.3.14的結(jié)論可以看出,最終搭建的模型還是處于過擬合的狀態(tài)。這個最終模型是經(jīng)過多次改良后得到的,原本搭建的CNN模型因為dropout隨機丟棄的數(shù)據(jù)不多,沒有應(yīng)用BatchNormalization,過擬合的程度更加嚴重,即使在算法上已經(jīng)采用了隨機梯度下降法,在每一層卷積層后添加了池化層,在優(yōu)化器和損失函數(shù)上更換了四五個組合,但是最終擬合程度較好的還是SGD(優(yōu)化器)和categorical_crossentropy(損失函數(shù))。圖3.10Trainingloss與validationloss函數(shù)圖像再來看看混淆矩陣:從矩陣中可以看出fer2013數(shù)據(jù)集中l(wèi)abel1(厭惡)的數(shù)據(jù)較少,對角線的數(shù)據(jù)占總體數(shù)據(jù)越大越好,模型準確率在60%左右,所以混淆矩陣整體分布還算均勻,label3(開心)的訓練效果較好。圖3.11混淆矩陣示意圖最后再看看ROC曲線:因為label1(厭惡)的準確率最高,所以class1曲線下的面積最大,從圖中可以看出模型準確率還算不錯,有可能是數(shù)據(jù)集的問題,導致模型準度達到了瓶頸。圖3.11ROC曲線示意圖示意圖再用驗證集val中的label1驗證一次模型準確率,計算出的準確率為99.89%,對于此模型中因為厭惡的數(shù)據(jù)集較多,擬合程度較好,雖然出現(xiàn)輕微過擬合現(xiàn)象,但用來驗證fer2013數(shù)據(jù)集中圖片的準確率還是比較高的。圖3.12模型驗證示意圖3.8改進過程分析在最初模型建好后,就發(fā)現(xiàn)了模型過擬合的問題,事實證明在神經(jīng)網(wǎng)絡(luò)的搭建過程中,尤其是卷積神經(jīng)網(wǎng)絡(luò)對圖像處理的應(yīng)用,解決過擬合問題是最主要的問題。我問過導師在這種情況下應(yīng)該怎么解決:第一種就是將CNN模型中的參數(shù)減少,但是因為本身采用的是AlexNet的架構(gòu),卷積層、池化層和全連接層的層數(shù)相對于其他CNN模型中已經(jīng)算少了,就只能改動其他參數(shù)的方法進行改良。在優(yōu)化器的選擇挑選了SGD、RMSprop、Adam,損失函數(shù)選擇了categorical_crossentropy和binary_crossentropy,通過不斷組合SGD和binary_crossentropy果然還是比較符合人臉識別,因為categorical_crossentropy適合二分類問題,如果選擇這個損失函數(shù)的精準率更高反而是個更大的問題。最終還更改了dropout的數(shù)據(jù)、學習率、用了BN算法,最后準確率達到接近58%。老師還提了個方法就是增大數(shù)據(jù)集,但是這個方法涉及的問題很多,首先就是數(shù)據(jù)的重新整理,在深度學習中數(shù)據(jù)整理永遠是占最多時間的,其次更大的數(shù)據(jù)集意味著對計算機的算力要求更高。如果要徹底解決這個問題用后一種方法會更可行,但在第二種方法短時間內(nèi)實現(xiàn)不了的情況下盡可能的把各個參數(shù)優(yōu)化好,完成此次畢業(yè)設(shè)計。4關(guān)于VGG網(wǎng)絡(luò)、ResNet、GoogLeNet的圖像處理4.1引言ILSVRC(ImageNetLargeScaleVisualRecognitionChallenge)是近幾年來深度學習圖像處理方面最具權(quán)威的比賽,每年在圖像處理方面都會有很大的進步,近幾年最著名的就是VGG網(wǎng)絡(luò)、ResNet、GoogLeNet。4.2VGG網(wǎng)絡(luò)VGG網(wǎng)絡(luò)就是重復重復使用3x3卷積和2x2池化增加網(wǎng)絡(luò)深度,在2014年的ILSVRC比賽中,VGG在Top-5中取得了92.3%的正確率(top5表示只要概率向量中最大的前五名里有分類正確的則為正確)。輸入的圖片為224*224*3,具有13個卷積層和3個全連接層,所以也叫VGG16網(wǎng)絡(luò)。VGG還有另一種版本叫VGG19,多增加了3層卷積層。4.3ResNetResNet提出了Inception模塊,可在保持計算成本的同時增加網(wǎng)絡(luò)的深度和寬度。ResNet的核心思想是殘差模塊和深度殘差網(wǎng)絡(luò),解決深層網(wǎng)絡(luò)難以訓練的問題。4.4GoogLeNetGoogLeNet和VGG網(wǎng)絡(luò)都是ILSVRC2014提出,GoogLeNet獲得了第一名。VGG繼承了LeNet以及AlexNet的一些框架結(jié)構(gòu),增加了卷積池化層數(shù)。雖然深度只有22層,但在相對情況比較AlexNet和VGG的參數(shù)會少很多,因此在內(nèi)存或計算資源有限時,GoogleNet是比較好的選擇而且性能更加優(yōu)越。GoogLeNet和ResNet都采用了模塊化的結(jié)構(gòu)(Inception結(jié)構(gòu)),方便增添和修改。不難看出,VGG網(wǎng)絡(luò)、ResNet、GoogLeNet都是采用了跟多層的網(wǎng)絡(luò)結(jié)構(gòu),通過增大參數(shù)量來提高準確率。如果在樣本數(shù)據(jù)充足的條件下用這三種網(wǎng)路進行人臉表情識別的搭建效果會更好。當然對樣本的選擇也有要求,輸入的大小至少224*224*3,48*48*1的數(shù)據(jù)集用AlexNet會比較合適,參數(shù)優(yōu)化也會更簡單。5總結(jié)人臉表情識別在未來的人機交互中必定是一個熱門的技術(shù)點,雖然己經(jīng)有很多不同結(jié)構(gòu)的模型,并且取得了不錯的識別效果,但是使模型變得更精準、算法更優(yōu)化、實現(xiàn)方式更簡易一直是人們在努力實現(xiàn)的目標。作為一名初學者。通過三個月的學習,在機器學習與深度學習也只能算是勉強入門。在楊老師和幾位線上授課的老師的教導下,我也順利用所學知識搭建出一個人臉表情識別模型,雖然準確率只在60%,且有一定的過擬合現(xiàn)象,但是這也代表著三個月的學習成果,在一次次的調(diào)參和優(yōu)化中,我明白了深度學習基礎(chǔ)知識的重要性。調(diào)參不是盲目的調(diào)超參數(shù),而要懂得對數(shù)據(jù)進行分析,要對算法有一定的了解才能更好的選擇。在訓練數(shù)據(jù)不夠多的前提不能選擇大的神經(jīng)網(wǎng)絡(luò),盡可能選擇能消除過擬合的函數(shù)和算法。每搭建一層網(wǎng)絡(luò),給一個函數(shù)時都應(yīng)該問自己一句為什么這么做,是不是有更好的選擇??偠灾舜萎厴I(yè)設(shè)計也算順利完成,希望在未來能有更好的算法,更完善的數(shù)據(jù)能搭建出更好的模型,也希望本文能幫助更多初學者理解和完成人臉表情識別。參考文獻[1]施徐敢.基于深度學習的人臉表情識別[D],浙江:浙江理工大學,2015-03-08,12。[2]呂亞丹.基于深度學習的人臉表情識別[D],天津:天津大學,2014-15-01,18.[3]EkmanP,F(xiàn)riesenWV,HagerJC.Facialactioncodingsystem(FACS)[J].AtechniqueforthemeasurementoffacialactionConsulting,PaloAlto,1978,32-35[4]CootesTF,TaylorCJ,CooperDH,etal.Activeshapemodels-theirtrainingandapplication[J].ComputerVisionandImageUnderstanding,1995,61(l):38-59.[5]趙艷.基于深度學習的表情識別研究[D],重慶:重慶郵電大學,2016-04-03,22-24.[6]CootesTF,EdwardsGJ,TaylorCJ.ComparingActiveShapeModelswithActiveAppearanceModels[C].BMVC,Nottingham,1999,173-182.[7]李江.基于深度學習的人臉表情識別研究與實現(xiàn)[D],四川:西南科技大學,2017-05-01,33-34.[8]CheonY,KimD.Naturalfacialexpressionrecognitionusingdifferential-AAMandmanifoldlearning[J].PatternRecognition,2009,42(7):1340-1350.[9]ZhangZ,LyonsM,SchusterM,etal.Compansonbetweengeometry-basedandGabor-wavelets-basedFacialexpressionrecognitionusingmulti-layerperceptron[C].ThirdIEEEInternationalConferenceonAutomaticFaceandGestureRecognition,1998ProceedingsNara1998,454-459.[10]李江.基于深度學習的人臉表情識別研究與實現(xiàn)[D],四川:西南科技大學,2017-05-01,33-34.謝辭走的最快的總是時間,來不及感嘆,大學生活已近尾聲,四年多的努力與付出,隨著本次論文的完成,將要劃下完美的句號。本論文設(shè)計在楊聚慶老師的悉心指導和嚴格要求下業(yè)已完成,從課題選擇到具體的寫作過程,論文初稿與定稿無不凝聚著楊聚慶老師的心血和汗水,在我的畢業(yè)設(shè)計期間,楊聚慶老師為我論文的指導有著啟蒙的意義,我的二稿和一稿無論在內(nèi)容還是格式方面都有翻天覆地的變化。我做畢業(yè)設(shè)計的每個階段,從選題到查閱資料,論文提綱的確定,中期論文的修改,后期論文格式調(diào)整等各個環(huán)節(jié)中都給予了我悉心的指導。這幾個月以來,楊聚慶老師不僅在學業(yè)上給我以精心指導,同時還在思想上給予我以無微不至的關(guān)懷,在此謹向楊老師致以誠摯的謝意和崇高的敬意。同時,本篇畢業(yè)論文的寫作也得到了何飛、韓燁、王健等老師的熱情幫助。感謝在整個畢業(yè)設(shè)計期間和我密切合作的老師,和曾經(jīng)在各個方面給予過我?guī)椭幕锇閭?。在此,我再一次真誠地向幫助過我的老師和同學表示感謝!附錄附錄1fer2013數(shù)據(jù)集:/s/1oOjfM1IIh6s8NXoLdqMYiA(提取碼vxoy)附錄2圖片轉(zhuǎn)化源碼importcsvimportosimportnumpyasnpfromPILimportImagedatabase_path=r'D:\input\fer2013'datasets_path=r'.\datasets'csv_file=os.path.join(database_path,'fer2013.csv')train_csv=os.path.join(datasets_path,'train.csv')val_csv=os.path.join(datasets_path,'val.csv')test_csv=os.path.join(datasets_path,'test.csv')withopen(csv_file)asf:csvr=csv.reader(f)header=next(csvr)rows=[rowforrowincsvr]trn=[row[:-1]forrowinrowsifrow[-1]=='Training']csv.writer(open(train_csv,'w+'),lineterminator='\n').writerows([header[:-1]]+trn)print(len(trn))val=[row[:-1]forrowinrowsifrow[-1]=='PublicTest']csv.writer(open(val_csv,'w+'),lineterminator='\n').writerows([header[:-1]]+val)print(len(val))tst=[row[:-1]forrowinrowsifrow[-1]=='PrivateTest']csv.writer(open(test_csv,'w+'),lineterminator='\n').writerows([header[:-1]]+tst)print(len(tst))datasets_path=r'.\datasets'train_csv=os.path.join(datasets_path,'train.csv')val_csv=os.path.join(datasets_path,'val.csv')test_csv=os.path.join(datasets_path,'test.csv')train_set=os.path.join(datasets_path,'train')val_set=os.path.join(datasets_path,'val')test_set=os.path.join(datasets_path,'test')forsave_path,csv_filein[(train_set,train_csv),(val_set,val_csv),(test_set,test_csv)]:ifnotos.path.exists(save_path):os.makedirs(save_path)num=1withopen(csv_file)asf:csvr=csv.reader(f)header=next(csvr)fori,(label,pixel)inenumerate(csvr):pixel=np.asarray([float(p)forpinpixel.split()]).reshape(48,48)subfolder=os.path.join(save_path,label)ifnotos.path.exists(subfolder):os.makedirs(subfolder)im=Image.fromarray(pixel).convert('L')image_name=os.path.join(subfolder,'{:05d}.jpg'.format(i))print(image_name)im.save(image_name)附錄3模型搭建與數(shù)據(jù)分析源碼fromkeras.preprocessing.imageimportImageDataGeneratorfromkeras.modelsimportSequentialfromkeras.layersimportConv2D,MaxPooling2D,MaxPool2Dfromkeras.layersimportActivation,Dropout,Flatten,Densefromkeras.utilsimportto_categoricalfromkeras.preprocessing.imageimportimg_to_arrayfromkerasimportbackendasKfromkeras.optimizersimportSGDimportnumpyasnpimportkerasfromkeras.layersimportInputfromkeras.preprocessingimportimagefromkeras.applications.imagenet_utilsimportpreprocess_input,decode_predictionsimporttimeimportpandasaspdimportmatplotlib.pyplotaspltimportmatplotlib.imageasmpimgimportseabornassns%matplotlibinlinefromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportconfusion_matriximportitertoolsfromkeras.optimizersimportRMSpropfromkeras.preprocessing.imageimportImageDataGeneratorfromkeras.callbacksimportReduceLROnPlateaufromkeras.layers.normalizationimportBatchNormalizationfromkeras.callbacksimportReduceLROnPlateaufromsklearn.model_selectionimporttrain_test_splitfromitertoolsimportcyclefromsklearn.metricsimportroc_curve,aucsns.set(style='white',context='notebook',palette='deep')importcsvimportostrain=pd.read_csv("train.csv")validation=pd.read_csv("val.csv")test=pd.read_csv("test.csv")Y_train=train["label"]Y_test=test['label']X_train=train.drop(labels=["label"],axis=1)X_test=test.drop(labels=["label"],axis=1)Y_train.value_counts()Y_test.value_counts()X_train=X_train/255.0X_test=X_test/255.0X_train=X_train.values.reshape(-1,48,48,1)X_test=X_test.values.reshape(-1,48,48,1)Y_train=to_categorical(Y_train,num_classes=7)Y_test=to_categorical(Y_test,num_classes=7)random_seed=2X_train,X_val,Y_train,Y_val=train_test_split(X_train,Y_train,test_size=0.1,random_state=random_seed)g=plt.imshow(X_train[0][:,:,0],cmap='gray')batch_size=128num_classes=7epochs=50input_shape=(48,48,1)model=Sequential()model.add(Conv2D(32,kernel_size=(1,1),activation='relu',kernel_initializer='he_normal',input_shape=input_shape))model.add(Conv2D(32,kernel_size=(5,5),activation='relu',padding='same',kernel_initializer='he_normal'))model.add(MaxPool2D((3,3),strides=2))model.add(Conv2D(32,kernel_size=(4,4),activation='relu',padding='same',kernel_initializer='he_normal'))model.add(MaxPool2D((3,3),strides=2))model.add(Conv2D(64,(5,5),activation='relu',padding='same',kernel_initializer='he_normal'))model.add(MaxPool2D((3,3),strides=2))model.add(Flatten())model.add(Dense(2048,activation='relu'))model.add(Dropout(0.5))model.add(Dense(1024,activation='relu'))model.add(Dropout(0.5))model.add(BatchNormalization())model.add(Dense(num_classes,activation='softmax'))model.summary()fromkerasimportoptimizersoptimizer=SGD(lr=0.005,momentum=0.9,decay=0.000006,nesterov=True)pile(optimizer=optimizer,loss='categorical_crossentropy',metrics=["accuracy"])learning_rate_reduction=ReduceLROnPlateau(monitor='val_acc',patience=3,verbose=1,factor=0.5,min_lr=0.00001)history=model.fit(X_train,Y_train,batch_size=batch_size,epochs=epochs,validation_data=(X_val,Y_val),callbacks=[learning_rate_reduction])fig,ax=plt.subplots(2,1)ax[0].plot(history.history['loss'],color='b',label="Trainingloss")ax[0].plot(history.history['val_loss'],color='r',label="validationloss",axes=ax[0])legend=ax[0].legend(loc='best',shadow=True)ax[1].plot(history.history['accuracy'],color='b',label="Trainingaccuracy")ax[1].plot(history.history['val_accuracy'],color='r',label="Validationaccuracy")legend=ax[1].legend(loc='best',shadow=True)defplot_confusion_matrix(cm,classes,normalize=False,title='Confusionmatrix',cmap=plt.cm.Blues):"""Thisfunctionprintsandplotstheconfusionmatrix.Normalizationcanbeappliedbysetting`normalize=True`."""plt.imshow(cm,interpolation='nearest',cmap=cmap)plt.title(title)plt.colorbar()tick_marks=np.arange(len(classes))plt.xticks(tick_marks,classes,rotation=45)plt.yticks(tick_marks,classes)ifnormalize:cm=cm.astype('float')/cm.sum(axis=1)[:,np.newaxis]thresh=cm.max()/2.fori,jinduct(range(cm.shape[0]),range(cm.shape[1])):plt.text(j,i,cm[i,j],horizontalalignment="center",color="white"ifcm[i,j]>threshelse"black")plt.tight_layout()plt.ylabel('Truelabel')plt.xlabel('Predictedlabel')Y_pred=model.predict(X_val)Y_pred_classes=np.argmax(Y_pred,axis=1)Y_true=np.argmax(Y_val,axis=1)confusion_mtx=confusion_matrix(Y_true,Y_pred_classes)plot_confusion_matrix(confusion_mtx,classes=range(7))errors=(Y_pred_classes-Y_true!=0)Y_pred_classes_errors=Y_pred_classes[errors]Y_pred_errors=Y_pred[errors]Y_true_errors=Y_true[errors]X_val_errors=X_val[errors]defdisplay_errors(errors_index,img_errors,pred_errors,obs_errors):"""Thisfunctionshows6imageswiththeirpredictedandreallabels"""n=0nrows=3ncols=3fig,ax=plt.subplots(nrows,ncols,sharex=True,sharey=True)forrowinrange(nrows):forcolinrange(ncols):error=errors_index[n]ax[row,col].imshow((img_errors[error]).reshape((48,48))) ax[row,col].set_title("Predictedlabel:{}\nTruelabel:{}”.format(pred_errors[error],obs_errors[error]))n+=1Y_pred_errors_prob=np.max(Y_pred_errors,axis=1)true_prob_errors=np.diagonal(np.take(Y_pred_errors,Y_true_errors,axis=1))delta_pred_true_errors=Y_pred_errors_prob-true_prob_errorssorted_dela_errors=np.argsort(delta_pred_true_errors)most_important_errors=sorted_dela_errors[-9:]display_errors(most_important_errors,X_val_errors,Y_pred_classes_errors,Y_true_errors)fromsklearn.metricsimportroc_curve,aucfpr=dict()tpr=dict()roc_auc=dict()y_score=model.predict(X_test)foriinrange(num_classes):fpr[i],tpr[i],_=roc_curve(Y_test[:,i],y_score[:,i])roc_auc[i]=auc(fpr[i],tpr[i])foriinrange(num_classes):plt.plot(fpr[i],tpr[i],lw=2,label='ROCcurveofclass{0}(area={1:0.2f})'''.format(i,roc_auc[i]))plt.plot([0,1],[0,1],'k--',lw=2)plt.xlim([0.0,1.0])plt.ylim([0.0,1.05])plt.xlabel('FalsePositiveRate')plt.ylabel('TruePositiveRate')plt.title('SomeextensionofReceiveroperatingcharacteristictomulti-class')plt.legend(loc="lowerright")plt.show()

HYPERLINK電腦快捷知識大全編輯本段一、常見用法F1顯示當前程序或者windows的幫助內(nèi)容。F2當你選中一個文件的話,這意味著“重命名”F3當你在桌面上的時候是打開“查找:所有文件”對話框F10或ALT激活當前程序的菜單欄windows鍵或CTRL+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論