基于深度學(xué)習(xí)的人臉表情分析_第1頁(yè)
基于深度學(xué)習(xí)的人臉表情分析_第2頁(yè)
基于深度學(xué)習(xí)的人臉表情分析_第3頁(yè)
基于深度學(xué)習(xí)的人臉表情分析_第4頁(yè)
基于深度學(xué)習(xí)的人臉表情分析_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

廣東東軟學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)基于深度學(xué)習(xí)的人臉表情分析內(nèi)容摘要人臉表情是人類在沒有語言交流時(shí)的一種表達(dá)感情的方式,而且是最常見與最容易表達(dá)的,對(duì)于計(jì)算機(jī)來說,所謂的人臉表情識(shí)別就是輸入一張圖片給計(jì)算機(jī),計(jì)算機(jī)通過一些特征提取,數(shù)值計(jì)算,最后得出表情的類別,面部表情識(shí)別是基于人工智能的人機(jī)交互技術(shù)的重要組成部分。表情識(shí)別在現(xiàn)實(shí)中應(yīng)用的場(chǎng)景甚多,例如零售業(yè)中通過識(shí)別顧客的表情,獲取他對(duì)商品的喜好,或者在游戲中,可以識(shí)別用戶的表情,進(jìn)行人機(jī)交互體驗(yàn)等等。本文將會(huì)利用目標(biāo)檢測(cè)算法YOLOV3和圖像識(shí)別算法VGGNET對(duì)圖片中的人進(jìn)行一個(gè)表情識(shí)別。關(guān)鍵詞:深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)特征提取表情識(shí)別目標(biāo)檢測(cè)目標(biāo)識(shí)別卷積神經(jīng)網(wǎng)絡(luò)AbstractTherecognitionoffacialexpressionsisthatartificialintelligenceisanimportantpartofhuman-computerinteractiontechnology.Facialexpressionsareoneoftherichestresourcesinourdailynon-verbalcommunicationandtheeasiestway.Expressionsareexpressedinacertainway.Foracomputer,facialexpressionrecognitionisanimageinputbyacomputer.Thecomputerhassomefeatureextraction,numericalcalculation,andcategoryanalysisexpressions.Therearemanyscenariosinwhichfacialexpressionrecognitionisappliedinreality.Forexample,intheretailindustry,customers'facialexpressionscanberecognizedtoobtaintheirpreferencesforgoods,orinthegame,users'facialexpressionscanberecognizedtoconductman-machineinteractionexperience.Inthispaper,targetdetectionalgorithmYOLOV3andimagerecognitionalgorithmVGGNETwillbeusedtocarryoutanexpressionrecognitionofpeopleinthepicture.Keywords:DeeplearningNeuralNetworksFeatureextractionExpressionrecognitionTargetDetectionTargetRecognitionConvolutionalNeuralNetwork目錄TOC\o"1-2"\h\u4591一、緒論 緒論1.1研究背景與意義深度學(xué)習(xí)自2012年以來越來越火爆,人類逐漸將深度學(xué)習(xí)應(yīng)用到各個(gè)領(lǐng)域,因?yàn)橹灰凶銐蚝玫馁Y料,計(jì)算機(jī)就有可能發(fā)揮出比人還要好的效果,本次我們將研究一下基于深度學(xué)習(xí)的人臉表情分析。人臉識(shí)別會(huì)涉及到一個(gè)很廣的領(lǐng)域,是一個(gè)交叉的學(xué)科,它的領(lǐng)域非常廣泛其能工作的領(lǐng)域也很廣,例如在國(guó)家安全、軍事安全、公安、司法、金融、海關(guān)、等等。那么人臉表情能具體任用到哪里呢?例如,對(duì)于多通道的人機(jī)交互界面來說,可以把跟蹤得到的人臉表情用來作為一種人際交互的手段。人臉識(shí)別主要作用是:實(shí)現(xiàn)自動(dòng)實(shí)時(shí)識(shí)別人臉表情通過人機(jī)接口。實(shí)現(xiàn)人臉表情實(shí)時(shí)識(shí)別和實(shí)時(shí)的追蹤。實(shí)現(xiàn)(人體、自然)語言的融合。人臉情感識(shí)別是從面部表情中檢測(cè)人類情感的過程。人腦可以自動(dòng)識(shí)別情緒,現(xiàn)在已經(jīng)開發(fā)了可以識(shí)別情緒的軟件。這項(xiàng)技術(shù)一直在變得越來越精確,最終將能夠像我們的大腦一樣讀取情緒。人工智能可以通過學(xué)習(xí)每個(gè)面部表情的含義并將該知識(shí)應(yīng)用于呈現(xiàn)給它的新信息來檢測(cè)情緒。情感人工智能或情感AI是一種能夠讀取,模仿,解釋和響應(yīng)人類面部表情和情感的技術(shù)。表1-1面部表情的含義表情額頭、眉毛眼睛臉的下半部驚奇1、眉毛抬起、變高變彎1、眼睛睜大,上眼皮抬高,下眼皮下落下顎下落,嘴張開,唇和牙齒分開,但嘴部不緊張,也不拉伸2、眉毛下的皮膚被拉伸2、眼白可能在瞳孔的上邊和/或下邊露出來3、皺紋可能橫跨額頭恐懼1、眉毛抬起并皺在一起上眼瞼抬起,下眼皮拉緊嘴張,嘴唇或輕微緊張,向后拉或者拉長(zhǎng),同時(shí)向后拉2、額頭的皺紋只在集中在中間中部,而不是橫跨整個(gè)額頭厭惡眉毛壓低,并壓低上眼瞼在下眼皮下部出現(xiàn)橫紋,臉頰推動(dòng)其向上,當(dāng)然并不緊張1、上唇抬起2、下唇與上唇緊閉,推動(dòng)上唇向上,嘴角下拉,唇輕微凸起3、鼻子皺起4、臉頰抬起憤怒1、眉毛皺在一起,壓低1、下眼皮垃緊,抬起或不抬起1、唇有兩種基本的狀態(tài):緊閉、唇角垃直或向下,張開,仿佛要喊2、在眉宇之間出現(xiàn)豎直皺紋2、上眼皮垃緊2、鼻孔可能張大高興眉毛參考:稍微下彎1、下眼瞼下邊可能有皺紋,可能鼓起但是并不緊張1、唇角向后拉并抬高2、魚尾紋從外眼角向外擴(kuò)張2、嘴可能被張大,牙齒可能露出3、一道皺紋從鼻子一直延伸到嘴角外部4、臉頰被抬起悲傷眉毛內(nèi)角皺在一起,抬高,帶動(dòng)眉毛下的皮膚眼內(nèi)角的上眼皮抬高1、嘴角下拉2、嘴角可能顫抖圖1-1.傳統(tǒng)人臉表情識(shí)別了解情境情感對(duì)社會(huì)和商業(yè)都有廣泛的影響。在公共領(lǐng)域,政府組織可以充分利用檢測(cè)罪惡感,恐懼和不確定性等情緒的能力。不難想象,TSA會(huì)自動(dòng)掃描航空公司乘客的恐怖主義跡象,并在此過程中使世界變得更加安全。很多公司一直在利用情感識(shí)別來推動(dòng)業(yè)務(wù)成果。對(duì)于《玩具總動(dòng)員5》,迪士尼計(jì)劃使用面部識(shí)別來判斷觀眾的情緒反應(yīng)。蘋果甚至在iPhoneX上發(fā)布了一項(xiàng)名為Animoji的新功能,您可以在其中獲得計(jì)算機(jī)模擬的表情符號(hào)來模仿您的面部表情。假設(shè)他們很快將在其他應(yīng)用程序中使用這些功能并不是什么遙不可及的事情。這是組織和企業(yè)可以用來了解其客戶并創(chuàng)建人們喜歡的產(chǎn)品的所有可行信息。但是,在實(shí)踐中獲得像這樣的產(chǎn)品并不是一件容易的事。有兩個(gè)主要問題阻礙了情感計(jì)算的有意義的進(jìn)展:訓(xùn)練/標(biāo)簽問題和要素工程問題。出于多種原因,情感識(shí)別在社會(huì)中得到了應(yīng)用。

從麻省理工學(xué)院分離出來的Affectiva提供人工智能該軟件可提高人們手動(dòng)完成以前完成的任務(wù)的效率,主要用于收集與觀看者同意共享此信息的特定上下文有關(guān)的面部表情和聲音信息。例如,您不必同意冗長(zhǎng)地調(diào)查觀看教育視頻或廣告的每個(gè)點(diǎn)的感覺,而可以同意讓相機(jī)注視您的臉部并聆聽您的講話,并注意在體驗(yàn)的哪些部分顯示諸如無聊,興趣,困惑或微笑的表情。(請(qǐng)注意,這并不意味著它正在閱讀您的內(nèi)心世界,它只是在閱讀您向外表達(dá)的內(nèi)容。)Affectiva的其他用途包括幫助自閉癥兒童,幫助盲人閱讀面部表情,幫助機(jī)器人與人進(jìn)行更智能的互動(dòng)以及在開車時(shí)監(jiān)控注意力跡象,以提高駕駛員的安全性。對(duì)于本文的人臉表情識(shí)別是基于深度學(xué)習(xí),大概流程可以表示為,輸入人臉圖像之后,第一判斷圖像中有沒有人臉,假如存在的話呢,下一步就要所有人的臉的位置在哪里,然后再把這些人臉?biāo)瓦M(jìn)分類器進(jìn)行表情分類。1.2本文主要工作首先當(dāng)然是數(shù)據(jù)集的選擇,用于目標(biāo)檢測(cè)的數(shù)據(jù)集,我選擇了FDDB:FaceDetectionDataSetandBenchmark這樣的一個(gè)數(shù)據(jù)集,用于表情識(shí)別的數(shù)據(jù)集,我選擇了在kaggle上的ChallengesinRepresentationLearning:FacialExpressionRecognitionChallenge數(shù)據(jù)集。首先FER2013數(shù)據(jù)集,既是用于表情識(shí)別的數(shù)據(jù)集是存在一些問題,嘗試使用百度api進(jìn)行重新標(biāo)注,但是由于重新標(biāo)注后合格的圖片太少了,于是沒有進(jìn)行這一步操作,對(duì)于模型的話,選擇了VGG16Net,訓(xùn)練的時(shí)候采用數(shù)據(jù)增強(qiáng)的方式進(jìn)行訓(xùn)練。對(duì)于FDDB數(shù)據(jù)集,需要通過標(biāo)注工具自行標(biāo)注人臉,模型采用比較流行的yolov3模型。通過訓(xùn)練圖像識(shí)別模型和目標(biāo)檢測(cè)模型之后,需要組合兩個(gè)模型,就是先得出圖像中人的位置,再通過裁剪人的位置輸入到圖像識(shí)別模型進(jìn)行一個(gè)分類操作。深度學(xué)習(xí)介紹2.1深度學(xué)習(xí)簡(jiǎn)介神經(jīng)網(wǎng)絡(luò)是一種機(jī)器學(xué)習(xí),可以根據(jù)人腦對(duì)自身進(jìn)行建模,從而創(chuàng)建一個(gè)人工神經(jīng)網(wǎng)絡(luò),該神經(jīng)網(wǎng)絡(luò)可以通過算法允許計(jì)算機(jī)通過合并新數(shù)據(jù)進(jìn)行學(xué)習(xí)。盡管如今有大量的人工智能算法,但神經(jīng)網(wǎng)絡(luò)能夠執(zhí)行所謂的深度學(xué)習(xí)。大腦的基本單位是神經(jīng)元,而人工神經(jīng)網(wǎng)絡(luò)的基本組成部分是感知器,可以完成簡(jiǎn)單的信號(hào)處理,然后將這些感知器連接到大型網(wǎng)狀網(wǎng)絡(luò)中。帶有神經(jīng)網(wǎng)絡(luò)的計(jì)算機(jī)被教導(dǎo)通過分析訓(xùn)練示例來完成任務(wù),這些訓(xùn)練示例先前已預(yù)先標(biāo)記,學(xué)習(xí)對(duì)新圖像進(jìn)行分類。Hubel和Wiesel還提出了這兩種類型的單元的級(jí)聯(lián)模型,以用于模式識(shí)別任務(wù)。CNN架構(gòu)的起源是福島邦彥(KunihikoFukushima)在1980年提出的。它的靈感來自于Hubel和Wiesel的上述工作。新認(rèn)知加速器在CNN中引入了兩種基本類型的層:卷積層和下采樣層。卷積層包含其接收?qǐng)龈采w前一層補(bǔ)丁的單元。這種單位的權(quán)重向量(自適應(yīng)參數(shù)集)通常稱為過濾器。單位可以共享過濾器。下采樣層包含其接收?qǐng)龈采w先前卷積層補(bǔ)丁的單元。這樣的單元通常計(jì)算其補(bǔ)丁中這些單元的激活平均值。這種下采樣有助于在視覺場(chǎng)景中正確地對(duì)對(duì)象進(jìn)行分類,即使對(duì)象已移動(dòng)也是如此。J.Weng等人在新認(rèn)知電子的一個(gè)變體中稱為cresceptron,而不是使用福島的空間平均。引入了一種稱為最大池化的方法,其中降采樣單元計(jì)算其補(bǔ)丁中各單元的激活次數(shù)最大值。在現(xiàn)代CNN中經(jīng)常使用最大池化。在過去的幾十年中,已經(jīng)提出了幾種有監(jiān)督和無監(jiān)督的學(xué)習(xí)算法來訓(xùn)練新認(rèn)知加速器的權(quán)重。[6]但是,今天,CNN架構(gòu)通常通過反向傳播進(jìn)行訓(xùn)練。新認(rèn)知機(jī)是第一個(gè)CNN,它要求位于多個(gè)網(wǎng)絡(luò)位置的設(shè)備具有相同的權(quán)重。1988年,將新認(rèn)知加速器用于分析時(shí)變信號(hào)。雖然CNN提出時(shí)間比較早,但是在很長(zhǎng)的一段時(shí)間里面沒有取得重大的突破,不需要人工提取特征。在2012年之后每年的計(jì)算機(jī)視覺大賽,都會(huì)有更好的模型推出,隨著GPU計(jì)算能力加強(qiáng),卷積神經(jīng)網(wǎng)絡(luò)也慢慢火了起來,到現(xiàn)在,其應(yīng)用到生活各處,未來估計(jì)能替代傳統(tǒng)的圖像識(shí)別技術(shù)。2.2神經(jīng)網(wǎng)絡(luò)簡(jiǎn)介我們談?wù)勆窠?jīng)網(wǎng)絡(luò)的基本模型。神經(jīng)網(wǎng)絡(luò)的基本模型可以分為四種類型。第一個(gè)是直接神經(jīng)網(wǎng)絡(luò),第二個(gè)是反饋神經(jīng)網(wǎng)絡(luò),第三個(gè)是隨機(jī)神經(jīng)網(wǎng)絡(luò)。四是自組織競(jìng)爭(zhēng)神經(jīng)網(wǎng)絡(luò)。首先,輸入前饋神經(jīng)網(wǎng)絡(luò)。先進(jìn)的神經(jīng)網(wǎng)絡(luò)是一個(gè)人工神經(jīng)網(wǎng)絡(luò),其中節(jié)點(diǎn)之間的連接不會(huì)循環(huán)。因此,它與它的后代不同:循環(huán)神經(jīng)網(wǎng)絡(luò)。高級(jí)神經(jīng)網(wǎng)絡(luò)是設(shè)計(jì)的第一個(gè)也是最簡(jiǎn)單的人工神經(jīng)網(wǎng)絡(luò)。在此網(wǎng)絡(luò)中,信息僅沿一個(gè)方向移動(dòng),即從輸入節(jié)點(diǎn)移動(dòng)到隱藏節(jié)點(diǎn)(如果有)再到輸出節(jié)點(diǎn)。網(wǎng)絡(luò)上沒有周期。前饋神經(jīng)網(wǎng)絡(luò)模型如下:圖2-1.前向神經(jīng)網(wǎng)絡(luò)然后下面介紹反饋型神經(jīng)網(wǎng)絡(luò),它的節(jié)點(diǎn)全部是計(jì)算單元,如下圖所示,可以向外面輸出,也會(huì)接受輸入。圖2-2.反饋神經(jīng)網(wǎng)絡(luò)Hopfield網(wǎng)絡(luò)是典型代表在反饋型網(wǎng)絡(luò)中。它由一個(gè)包含一個(gè)或多個(gè)完全連接的循環(huán)神經(jīng)元的單層組成。Hopfield網(wǎng)絡(luò)通常用于自動(dòng)關(guān)聯(lián)和優(yōu)化任務(wù)。前向型和反饋型的神經(jīng)網(wǎng)絡(luò)都是確定性的結(jié)構(gòu),換句話說,只要給定神經(jīng)元的輸入,這個(gè)輸出是確定的。圖2-3.隨機(jī)型神經(jīng)網(wǎng)絡(luò)然后就是隨機(jī)型神經(jīng)網(wǎng)絡(luò),其是由ErolGelenbe發(fā)明的,并與排隊(duì)網(wǎng)絡(luò)的G網(wǎng)絡(luò)模型以及基因調(diào)控網(wǎng)絡(luò)模型相關(guān)聯(lián)。每個(gè)細(xì)胞狀態(tài)用一個(gè)整數(shù)表示,當(dāng)細(xì)胞收到興奮性尖峰時(shí)其值會(huì)增加,而當(dāng)收到抑制性尖峰時(shí)其值會(huì)下降。峰值可能源自網(wǎng)絡(luò)外部本身,也可以來自網(wǎng)絡(luò)中的其他小區(qū)。內(nèi)部興奮狀態(tài)為正值的單元格可以根據(jù)特定的依賴單元格的頻率向網(wǎng)絡(luò)中的其他單元格發(fā)送任何一種尖峰信號(hào)。該模型在穩(wěn)態(tài)下具有數(shù)學(xué)解決方案,該數(shù)學(xué)解決方案根據(jù)每個(gè)單元被激發(fā)并能夠發(fā)出峰值的個(gè)體概率來提供網(wǎng)絡(luò)的聯(lián)合概率分布。RNN是遞歸模型,即允許具有復(fù)雜反饋回路的神經(jīng)網(wǎng)絡(luò)。計(jì)算此解決方案的基礎(chǔ)是求解一組非線性代數(shù)方程,其參數(shù)與單個(gè)小區(qū)的峰值速率及其與其他小區(qū)的連接性以及網(wǎng)絡(luò)外部尖峰的到達(dá)速率有關(guān)。如下圖所示,玻爾茲曼機(jī)是一個(gè)典型的隨機(jī)神經(jīng)網(wǎng)絡(luò),其具有隨機(jī)輸出值單元的隨機(jī)神經(jīng)網(wǎng)絡(luò),它按照概率曲線的能量分布進(jìn)行狀態(tài)的轉(zhuǎn)移。圖2-4.玻爾茲曼機(jī)神經(jīng)網(wǎng)絡(luò)的最后一種類型是自組織競(jìng)爭(zhēng)神經(jīng)網(wǎng)絡(luò)。在人腦中,刺激信號(hào)的某些方面對(duì)不同細(xì)胞的敏感性必須不同。自組織神經(jīng)網(wǎng)絡(luò)會(huì)自動(dòng)查找樣本中的內(nèi)在規(guī)律和基本屬性,如下圖所示,這一種網(wǎng)絡(luò)可以識(shí)別環(huán)境的特征,并且會(huì)自動(dòng)聚類。成功應(yīng)用到特征抽取和大規(guī)模數(shù)據(jù)處理當(dāng)中。圖2-5.自組織競(jìng)爭(zhēng)型神經(jīng)網(wǎng)絡(luò)2.3卷積神經(jīng)網(wǎng)絡(luò)簡(jiǎn)介卷積神經(jīng)網(wǎng)絡(luò)主要有一下概念:局部感受野,共享權(quán)重,池化層。對(duì)于局部感受野,假設(shè)輸入的是28*28的像素值:圖2-6.局部感受野對(duì)于第一個(gè)隱含層,每一個(gè)隱含層神經(jīng)元與輸入層中5*5的神經(jīng)元連接:圖2-7.感受視野這個(gè)5*5的區(qū)域就叫做感受視野,表示一個(gè)隱含層神經(jīng)元在輸入層的感受區(qū)域。這5*5=25個(gè)所連接對(duì)應(yīng)著25個(gè)權(quán)重參數(shù),還有一個(gè)全局的bias。當(dāng)感受野沿著整個(gè)輸入圖片向右(向下)滑動(dòng)的時(shí)候,每一個(gè)感受野在第一個(gè)隱含層都對(duì)應(yīng)著一個(gè)隱藏神經(jīng)元。圖2-8.第一個(gè)感受野圖2-9.第二個(gè)感受野卷積層第二個(gè)概念就是共享權(quán)重,上面提到,每一個(gè)隱含層神經(jīng)元所對(duì)應(yīng)的5*5=25個(gè)權(quán)重參數(shù)w和一個(gè)bias,實(shí)際上我們規(guī)定,每一個(gè)隱含層神經(jīng)元的25個(gè)權(quán)值w和b都共享,也就是說隱藏層神經(jīng)元共享權(quán)值。共享權(quán)重有什么好處呢,參數(shù)個(gè)數(shù)的大大減少和平移的不變性都是得益于共享權(quán)重。卷積層的最后一個(gè)層就是池化層,池化層一般都是接在卷積層后面,其作用是用于是一個(gè)下采樣,例如,下圖就是使用max-pooling把四個(gè)神經(jīng)元壓縮為一個(gè)神經(jīng)元:取其最大的像素值,其它丟棄。(當(dāng)然也有其它的pooling例如

L2pooling是把2x2的區(qū)域值平方,求和,開根號(hào))。上圖24x24的特征圖經(jīng)過2x2的max-pooling之后變成了12x12的特征圖。圖2-10.池化層2.4目標(biāo)檢測(cè)簡(jiǎn)介目標(biāo)檢測(cè)和跟蹤是從復(fù)雜的背景中檢測(cè)目標(biāo)并進(jìn)行跟蹤預(yù)測(cè)等,以提供信息以進(jìn)行進(jìn)一步的分析和處理。所以目標(biāo)檢測(cè)與跟蹤技術(shù)是單攝像機(jī)多目標(biāo)跟蹤技術(shù)的基礎(chǔ)。該模塊的性能將對(duì)單攝像機(jī)多目標(biāo)跟蹤系統(tǒng)的性能產(chǎn)生重大影響。目標(biāo)檢測(cè)是指從復(fù)雜的圖像(視頻)背景中定位出目標(biāo),并分離背景,對(duì)目標(biāo)進(jìn)行分類,找到感興趣的目標(biāo),從而更好地完成后續(xù)的跟蹤、信息處理與響應(yīng)等任務(wù)。目標(biāo)檢測(cè)在很多領(lǐng)域都有應(yīng)用,比如對(duì)于臉部、行車、路人等物體的檢測(cè),以及一些交叉領(lǐng)域的應(yīng)用,比如自動(dòng)駕駛領(lǐng)域交通標(biāo)志的識(shí)別、工程領(lǐng)域里材質(zhì)表面的缺陷檢測(cè),農(nóng)作物病害檢測(cè)和醫(yī)學(xué)圖像檢測(cè)等等,所以對(duì)目標(biāo)檢測(cè)的研究很有實(shí)際價(jià)值。圖2-11.單目標(biāo)檢測(cè)與多目標(biāo)檢測(cè)除了圖像分類,目標(biāo)檢測(cè)要解決的核心問題如下。首先,目標(biāo)可以出現(xiàn)在圖像中的任何位置。其次,鏡頭有各種尺寸。第三,目標(biāo)可以采取多種形式。如果使用矩形定義物鏡,則矩陣具有不同的縱橫比。由于鏡頭的縱橫比不同,因此使用經(jīng)典的滑動(dòng)窗口和圖像縮放方案來解決一般鏡頭檢測(cè)問題的成本可能會(huì)相對(duì)較高。目前來說,基于深度學(xué)習(xí)的目標(biāo)檢測(cè)算法主要分為以下兩類。第一類叫做TwoStage目標(biāo)檢測(cè)算法,這一類算法一般都是先進(jìn)行區(qū)域生成(regionpropsal)(一個(gè)有可能包含待檢測(cè)物體的預(yù)選框),通過卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行樣本分類,常見的TwoStage目標(biāo)檢測(cè)算法有:R-CNN、SPP-Net、FastR-CNN、FasterR-CNN和R-FCN等。第二類是OneStage目標(biāo)檢測(cè)算法,這一種算法是可以直接在網(wǎng)絡(luò)中提取特征來預(yù)測(cè)物體分類的位置,常見的OneStage目標(biāo)檢測(cè)算法有:OverFeat、YOLO、SSD、RetinaNet等等。2.5圖像分類簡(jiǎn)介對(duì)于人類來說,圖像分來的問題一眼就能看出了,不過對(duì)于計(jì)算機(jī)而言,她很難分析圖像的內(nèi)容,因?yàn)橛?jì)算機(jī)看到的圖像是一個(gè)很好的數(shù)字矩陣,并且對(duì)圖像的思想,含義和知識(shí)一無所知。圖像分類任務(wù)是給出圖像并正確給出圖像所屬的類別。對(duì)于超強(qiáng)大的人類視覺系統(tǒng),很容易識(shí)別圖像的類型,但是對(duì)于計(jì)算機(jī),則不可能獲得像人眼一樣的圖像的語義信息。為了讓計(jì)算機(jī)能夠理解圖像的內(nèi)容,我們必須應(yīng)用圖像分類,這是使用計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)算法從圖像中抽取意義的任務(wù),這一個(gè)操作可以理解為一張圖像分配一個(gè)標(biāo)簽,比如貓、狗還是大象,或者也可以高級(jí)到解析圖像的內(nèi)容并且返回一個(gè)人類可讀的句子。三、實(shí)驗(yàn)環(huán)境搭建3.1Keras框架簡(jiǎn)介Keras是基于Theano的一個(gè)深度學(xué)習(xí)框架,它的設(shè)計(jì)參考了Torch,Keras使用Python語言編寫,是一個(gè)高度模塊化的神經(jīng)網(wǎng)絡(luò)庫(kù),它還可以支持CPU和GPU。Keras是一個(gè)高層神經(jīng)網(wǎng)絡(luò)API為什么使用keras框架呢,因?yàn)閗eras高度封裝了Tensorflow,深度學(xué)習(xí)初學(xué)者使用tensorflow會(huì)出現(xiàn)各種各樣的問題,所以從keras入手是一個(gè)非常不錯(cuò)的選擇。3.2搭建Keras框架3.2.1系統(tǒng)環(huán)境本文所在的環(huán)境是Windows10系統(tǒng),python3.6版本,python的安裝我推薦是Anaconda,它是一個(gè)適用于科學(xué)計(jì)算的版本,集成了很多需要用到的庫(kù),編譯環(huán)境的話我推薦是Pycharm,Pycharm的社區(qū)版就已經(jīng)可以滿足需求。3.2.2CUDA和CUDNNCudaToolkit是一個(gè)基礎(chǔ)的工具包,是由NVIDIA公司面向GPU編程提供的,如果使用的是CPU加速的話,就不需要安裝CUDA和CUDNN,如果使用的是GPU的話,就需要用到CUDA和CUDNN了,而且你的顯卡還要是NVIDIA,根據(jù)你的顯卡驅(qū)動(dòng)來選擇CUDA的版本,在下載之后,按照步驟安裝,環(huán)境不需要配置,安裝程序會(huì)自動(dòng)配置好。接下來的是CUDNN,CUDNN的話需要根據(jù)CUDA的版本一一對(duì)應(yīng),cudnn下載的是一個(gè)壓縮包,下載解壓出來是名為cuda的文件夾,里面有bin、include、lib,將三個(gè)文件夾復(fù)制到安裝CUDA的地方覆蓋對(duì)應(yīng)文件夾。3.2.3Keras框架搭建在CMD命令行或者Powershell中輸入:#GPU版本pipinstalltensorflow-gpu#CPU版本pipinstalltensorflowGPU和CPU版本任選其一。#Keraspipinstallkeras上述步驟完成后,在自己的編譯器里面執(zhí)行以下代碼importkeras,如果沒有報(bào)錯(cuò)的話就說明安裝成功。3.3基于Keras的開源YOLOV3框架Yolov3是一種目標(biāo)檢測(cè)算法,本文的人臉目標(biāo)檢測(cè)使用的是yolov3的算法,接下來介紹一下主要使用的py文件。圖3-1.YOLOV3框架font文件夾對(duì)應(yīng)著是字體的格式,model_data文件夾對(duì)應(yīng)著的是classes和anchors的相關(guān)文件,yolo3文件夾里面包含的是一些yolov3的結(jié)構(gòu)源代碼,之后我會(huì)介紹一些主要用到的python文件,convert.py是用來轉(zhuǎn)化在yolo官網(wǎng)上下載的權(quán)重,我猜想是轉(zhuǎn)換成這個(gè)keras框架可用的權(quán)重,kmeans.py文件是一個(gè)kmeans聚類算法的文件,用來得出你需要訓(xùn)練的數(shù)據(jù)集的anchors,train.py文件無疑是訓(xùn)練的python代碼,yolo.py里面是一些構(gòu)建yolov3的代碼,yolo_video.py里面是用來使用yolov3去相關(guān)實(shí)踐,yolov3.cfg是yolov3框架的配置文件。3.4基于keras的VGG16模型VGG16這個(gè)框架相信大家都比較熟,VGG16的結(jié)構(gòu)非常簡(jiǎn)單首先VGG模型根據(jù)卷積核的大小和卷積層數(shù)目的不同,可以分為A,A-LRN,B,C,D,E六個(gè)配置,其中D和E的配置比較常用,被稱為VGG16和VGG19,下圖給出VGG的六種配置圖:圖3-2.VGGNet結(jié)構(gòu)圖由于本文使用的是VGG16模型,所以對(duì)VGG16模型進(jìn)行討論。觀看上圖的配置圖可以發(fā)現(xiàn),VGG16包含了13個(gè)卷積層,3個(gè)全連接層,5個(gè)池化層,因?yàn)槌鼗瘜硬淮嬖趨?shù),所以只有卷積層和全連接層存在參數(shù),13+3=16,因此給稱之為VGG16模型,VGG16模型特點(diǎn)是簡(jiǎn)單,因?yàn)橹挥衅胀ǖ木矸e層,全連接層,池化層所構(gòu)成的網(wǎng)絡(luò),只是層數(shù)相對(duì)有點(diǎn)多而已,當(dāng)然,對(duì)于現(xiàn)在的網(wǎng)絡(luò)來說16層是非常淺的網(wǎng)絡(luò)了,但是在2014年的時(shí)候,16層的網(wǎng)絡(luò)已經(jīng)算是非常深了。圖中的block稱為結(jié)構(gòu)塊,可以看到block1和block2的結(jié)構(gòu)是差不多的,兩層卷積層加一個(gè)最大池化層,只是卷積層的filters個(gè)數(shù)不一樣,block3,block4,block5就是三個(gè)卷積層和一個(gè)最大池化層,也只是卷積層的filters參數(shù)不一樣,VGG16還有一個(gè)特點(diǎn)就是參數(shù)量比較大,VGG16具有如此之大的參數(shù)數(shù)量,也可以預(yù)測(cè)得出它的擬合能力,但缺點(diǎn)也是非常明顯的,也就是訓(xùn)練時(shí)間過長(zhǎng),調(diào)參難度比較大,接下來給出keras里面的VGG16模型的相關(guān)參數(shù),然后VGG16的介紹就到此為止了。四、詳細(xì)實(shí)現(xiàn)4.1數(shù)據(jù)集介紹本文選取的數(shù)據(jù)集是fer2013表情識(shí)別數(shù)據(jù)集和FDDB人臉目標(biāo)檢測(cè)數(shù)據(jù)集,fer2013數(shù)據(jù)集非常簡(jiǎn)單,就是一個(gè)包含7種表情的數(shù)據(jù)集,有生氣、厭惡、恐懼、開心、傷心、驚訝、中性,該數(shù)據(jù)集是一個(gè)csv文件,里面有圖片圖像的像素和對(duì)應(yīng)的標(biāo)簽,每張圖片的尺寸是48*48,對(duì)應(yīng)的是灰度圖片。FDDB數(shù)據(jù)集一共包含2845張圖片,其中包含彩色圖片和灰度的圖片,其中人臉的總數(shù)達(dá)到5500個(gè)以上,而且這些人臉的圖片所呈現(xiàn)的狀態(tài)多樣,包含遮擋、罕見姿勢(shì)、低分辨率的情況,由于該數(shù)據(jù)集采用的是橢圓標(biāo)記法:圖4-1.橢圓標(biāo)注因此需要轉(zhuǎn)換成矩形標(biāo)記法的格式,轉(zhuǎn)換也是比較簡(jiǎn)單的,只需要寫一個(gè)普通的python腳本既可以轉(zhuǎn)換,首先橢圓標(biāo)記法給出的是橢圓的中心點(diǎn)坐標(biāo)和橢圓的長(zhǎng)軸半徑和短軸半徑,因此很容易轉(zhuǎn)換成矩形標(biāo)記法,F(xiàn)DDB數(shù)據(jù)集中還給出了一個(gè)偏移角度,經(jīng)過觀察,偏移角度一般都很小,所以就直接忽略這個(gè)參數(shù)。4.2數(shù)據(jù)的預(yù)處理對(duì)于fer2013的數(shù)據(jù)集而言,我們需要對(duì)其進(jìn)行像素轉(zhuǎn)換成圖片的操作,并且按標(biāo)簽的索引值放進(jìn)每一個(gè)文件夾中,具體代碼如下:defcsv_to_jpg():train=pd.read_csv('train.csv')os.chdir('F://DataSet/expression/img')foriinrange(len(train)):data=train.loc[i]img=np.array(data['pixels'].split()).astype(np.uint8).reshape((48,48,1))cv2.imwrite('{}.jpg'.format(i+1),img)圖4-2.csv轉(zhuǎn)jpg代碼執(zhí)行完之后去到對(duì)應(yīng)目錄就可以看到以下:因?yàn)楹竺嫖覀兪鞘褂胟eras的ImageDataGenerator的圖片生成器,所以需要?jiǎng)澐钟?xùn)練集和驗(yàn)證集defsplit_train_to_valid():os.chdir('F:\Py_Code\Expression\\train')foriinrange(10):base_path=os.path.join(os.getcwd(),str(i))end_path=base_path.replace('train','test')len_arr=os.listdir(base_path)need_copy=np.random.choice(np.arange(len(len_arr)),int(len(len_arr)*0.2),replace=False)forjinneed_copy:a=os.path.join(base_path,len_arr[j])b=os.path.join(end_path,len_arr[j])shutil.copy(a,b)forjinneed_copy:os.remove(os.path.join(base_path,len_arr[j]))每一個(gè)種類的表情劃分0.8的訓(xùn)練集0.2的測(cè)試集,所以需要用一個(gè)random來進(jìn)行隨機(jī)選取每一類的百分之20的圖片,然后利用shutil的庫(kù)來進(jìn)行對(duì)應(yīng)的圖片復(fù)制到vaild文件夾,然后再將train復(fù)制到valid的圖片刪除,完成了劃分訓(xùn)練集和測(cè)試集,弄成這個(gè)模式是因?yàn)镮mageDataGenerator里面有一個(gè)非常好的功能是flow_from_directory,可以不需要將圖片全部讀進(jìn)去內(nèi)存,非常的好用,弄成這個(gè)格式就是方便使用這個(gè)函數(shù)。對(duì)于FDDB的數(shù)據(jù)集,只需要把橢圓標(biāo)注轉(zhuǎn)換成矩形標(biāo)注就可以了。4.3目標(biāo)檢測(cè)yolov3yolov3發(fā)現(xiàn)需要5樣?xùn)|西即可進(jìn)行訓(xùn)練,第一個(gè)是訓(xùn)練的數(shù)據(jù)路徑和坐標(biāo)框,寫在一個(gè)txt文件里面,第二個(gè)是對(duì)yolov3.cfg配置文件進(jìn)行修改,第三個(gè)是classes.txt文件,里面是你這個(gè)訓(xùn)練集的標(biāo)簽,第四個(gè)是anchors.txt文件,里面是你這個(gè)數(shù)據(jù)集通過kmeans聚類得出的9個(gè)anchors框,最后一個(gè)是需要在yolo官網(wǎng)上下載yolov3的預(yù)訓(xùn)練權(quán)重,之后用里面一個(gè)convert.py文件進(jìn)行轉(zhuǎn)換成這個(gè)框架可以用的權(quán)重。完成這5個(gè)東西之后就可以進(jìn)行訓(xùn)練yolov3了。通過訓(xùn)練網(wǎng)絡(luò),效果非常不錯(cuò)。下面給出一些模型效果圖和訓(xùn)練的loss和val_loss變化圖。圖4-5.yolov3檢測(cè)效果圖4-6.yolov3訓(xùn)練loss變化4.4圖像分類VGG16對(duì)于VGG16的訓(xùn)練是比較簡(jiǎn)單的,下面貼出訓(xùn)練代碼:inputs=Input(shape=(224,224,3))vggnet16=vgg16.VGG16(input_tensor=inputs,classes=7,include_top=False,weights='vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5')net=GlobalAveragePooling2D()(vggnet16.layers[-1].output)net=Dense(7,activation='softmax')(net)model=Model(inputs,net)pile(optimizer=SGD(),loss=categorical_crossentropy,metrics=['accuracy'])model.summary()train_generator,valid_generator=get_data_generate()model.fit_generator(train_generator,steps_per_epoch=1000,verbose=2,epochs=50,validation_data=valid_generator,validation_steps=100,callbacks=[ModelCheckpoint('model/VGG16_{epoch:03d}_{val_loss:.4f}.h5',monitor='val_loss',verbose=1,mode='auto',save_best_only=True),ReduceLROnPlateau(factor=0.8,patience=3,verbose=1,mode='auto',monitor='val_loss'),CSVLogger('model/train.log')])第一行的Input是一個(gè)輸入層,結(jié)合Model類使用,第二行是定義VGG16模型,類別是有7類,所以classes參數(shù)設(shè)定為7,因?yàn)槲臋n上寫明,如果classes不為1000的話,include_top這個(gè)參數(shù)必定要設(shè)置為False,否則會(huì)報(bào)錯(cuò),然后添加一個(gè)GlobalAveragePooling2D層,這個(gè)是一個(gè)全局平均池化層,可以用于卷積層和全連接層的連接處,因?yàn)橐话愕木矸e層輸出是多維的,這個(gè)全局平均池化層可先將每一張?zhí)卣鲌D的全局平均值求出來,然后再連接起來,最后變成一個(gè)一維向量,第四行代碼是一個(gè)全連接層的操作,激活函數(shù)是softmax,因?yàn)槭嵌喾诸?,然后下一行是利用一個(gè)Model類把input和output結(jié)合起來,變成一個(gè)model,下一行是定義模型的損失函數(shù),損失函數(shù)使用交叉熵,優(yōu)化器經(jīng)過測(cè)試,使用SGD效果是最好的,再把metrics定義好,添加精度的計(jì)算(accuracy),這里采用的是利用keras的ImageDataGenerator,train_datagen

=

ImageDataGenerator(

rotation_range=30,

#

旋轉(zhuǎn)角度

width_shift_range=0.1,

#

寬度的偏移

height_shift_range=0.1,

#

高度的偏移

rescale=1

/

255.0,

#

歸一化

horizontal_flip=True,

#

水平翻轉(zhuǎn)

)

train_generator

=

train_datagen.flow_from_directory(

'F://DataSet/expression/train',

target_size=(224,

224),

#

圖像大小

batch_size=32,

#

batch大小

class_mode='categorical',

#

多分類模式

shuffle=True,

#

打亂數(shù)據(jù)

)

valid_datagen

=

ImageDataGenerator(

rescale=1

/

255.0,

)

valid_generator

=

valid_datagen.flow_from_directory(

'F://DataSet/expression/valid',

target_size=(224,

224),

batch_size=32,

class_mode='categorical',

#

color_mode='grayscale',

shuffle=True,

)訓(xùn)練50次,添加了3個(gè)callbacks函數(shù),一個(gè)是ModelCheckPoint,這個(gè)是用來根據(jù)val_loss保存最好的模型,ReduceLROnPlateau是用來如果val_loss多少個(gè)patience次沒減少,就把學(xué)習(xí)率*factor,意思就是當(dāng)多少次val_loss還沒有下降,就把模型的學(xué)習(xí)率乘以factor參數(shù),CSVLOGGER是用來記錄訓(xùn)練過程中的loss和acc變化。因?yàn)閂GG16模型訓(xùn)練時(shí)間非常長(zhǎng),所以我只訓(xùn)練了20次,下面貼出一些結(jié)果:圖4-9.VGGNet訓(xùn)練模型是存在過擬合的,不過對(duì)于這個(gè)數(shù)據(jù)集,kaggle上的第一也只是0.71,所以我這個(gè)val_acc能達(dá)到0.66我覺得也不錯(cuò)了,因?yàn)閿?shù)據(jù)集中有些很亂的圖片,估計(jì)是數(shù)據(jù)集的問題,但是實(shí)際效果也還行:圖4-10.測(cè)試VGG模型用圖對(duì)于這張圖片的輸出是happiness。4.5結(jié)合模型yolov3和vgg16訓(xùn)練完成后,最后只需要把兩個(gè)代碼結(jié)合起來。yolov3=YOLO()vgg16=load_model('model/VGG16.h5')since=time.time()PIL_img=Image.open(img_path)cv2_img=cv2.imread(img_path)face_rectangle,_img,font=yolov3.detect_image(PIL_img.copy())draw=ImageDraw.Draw(PIL_img)forfaceinface_rectangle:top,left,bottom,right=face[:4]face_img=cv2_img[top:bottom,left:right]face_img=cv2.resize(face_img,(224,224))face_img=np.array(face_img).reshape((-1,224,224,3))/255.0face_img_label=fer2013[np.argmax(vgg16.predict(face_img)[0],axis=0)]print(face_img_label)draw.rectangle([left,top,right,bottom])draw.text(face[4],face_img_label,fill=(0,0,0),font=font)print(time.time()-since)PIL_img.show()首先需要把yolo模塊導(dǎo)入進(jìn)來,然后再加載vgg16模型,具體做法是把yolo預(yù)測(cè)出來的人臉框從圖片中截取出來,然后進(jìn)行一些操作再給vgg16模型,vgg16用來預(yù)測(cè)表情,yolov3負(fù)責(zé)尋找人臉,最后再通過一些ImageDraw在圖片上添加標(biāo)注,下面給出效果圖:圖4-12.組合模型效果圖上面三張圖分別是開心,傷心,驚訝,效果還是可以的。五、總結(jié)5.1工作總結(jié)本文的主要工作有以下內(nèi)容:對(duì)于圖像分類來說,數(shù)據(jù)集fer2013是一個(gè)csv文件,所以第一步需要將它轉(zhuǎn)為圖片文件,并且按標(biāo)簽分好類,之后需要?jiǎng)澐钟?xùn)練集和驗(yàn)證集,訓(xùn)練模型的話,其實(shí)我也訓(xùn)練過VGG16,VGG19還有自己搭建的模型,最后采納了VGG16,其實(shí)VGG16和VGG19模型效果差不多,但是VGG16模型會(huì)比VGG19模型小一點(diǎn),所以最后采納了VGG16的模型,訓(xùn)練的時(shí)候利用了ImageDataGenerator來增強(qiáng)數(shù)據(jù),使模型更具魯棒性。對(duì)于目標(biāo)檢測(cè)的話,數(shù)據(jù)集FDDB使用的是橢圓標(biāo)注,所以第一步需要將橢圓標(biāo)注轉(zhuǎn)換成矩形標(biāo)注,然后就把yolov3需要的東西都弄好,例如anchors.txt,classes.txt,train.txt,修改yolov3.cfg文件等等。然后就開始進(jìn)行訓(xùn)練。訓(xùn)練的時(shí)候一般是先采用fine-tune操作,就是只訓(xùn)練最后的輸出層,如果能得到一個(gè)較好的結(jié)果的話,就不用訓(xùn)練整個(gè)網(wǎng)絡(luò),但是發(fā)現(xiàn)如果只訓(xùn)練最后的輸出層效果非常差,之后我就訓(xùn)練了整個(gè)網(wǎng)絡(luò),訓(xùn)練整個(gè)網(wǎng)絡(luò)的效果就比較不錯(cuò)。最后的話模型結(jié)合,這個(gè)的話相對(duì)比較簡(jiǎn)單,就是把yolov3預(yù)測(cè)出來的坐標(biāo)框從圖像中截取出來,然后放進(jìn)去VGG16里面進(jìn)行預(yù)測(cè)表情結(jié)果。5.2不足其實(shí)本次實(shí)驗(yàn)的不足還是有挺多的,對(duì)于圖像分類的話,由于表情識(shí)別的數(shù)據(jù)集實(shí)在是很難找,這個(gè)fer2013的數(shù)據(jù)集估計(jì)是噪音很多,因此驗(yàn)證集的精度一直提不上去,我認(rèn)真看了下數(shù)據(jù)集,

溫馨提示

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

評(píng)論

0/150

提交評(píng)論