基于Android的人臉識別軟件設(shè)計_第1頁
基于Android的人臉識別軟件設(shè)計_第2頁
基于Android的人臉識別軟件設(shè)計_第3頁
基于Android的人臉識別軟件設(shè)計_第4頁
基于Android的人臉識別軟件設(shè)計_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

┊┊┊┊┊┊┊┊┊┊┊┊┊裝┊┊┊┊┊訂┊┊┊┊┊線┊┊┊┊┊┊┊┊┊┊┊┊┊畢業(yè)設(shè)計(論文)報告紙《基于Android的人臉識別軟件設(shè)計》摘要隨著深度學(xué)習(xí)技術(shù)的進(jìn)步和android手機(jī)的不斷普及,人們對美顏的需求也越來越高,因此基于深度學(xué)習(xí)的美顏相機(jī)逐漸成為了當(dāng)前社會的熱門應(yīng)用,占據(jù)了大量美顏應(yīng)用市場。該畢業(yè)設(shè)計主要采用多任務(wù)卷積神經(jīng)網(wǎng)絡(luò)(MTCNN)實現(xiàn)人臉檢測及雙邊濾波算法實現(xiàn)人臉的磨皮美白。多任務(wù)卷積神經(jīng)網(wǎng)絡(luò)是通過三個CNN模型實現(xiàn),第一層卷積神經(jīng)網(wǎng)路由于層數(shù)淺,可以快速產(chǎn)生疑似人臉的候選窗口,第二層卷積神經(jīng)網(wǎng)絡(luò)根據(jù)置信度排除絕大部分的非人臉的候選窗口,第三層卷積神經(jīng)網(wǎng)絡(luò)尋找五個人臉上特征標(biāo)記點。雙邊濾波算法是一種非線性濾波,它是通過使用兩個高斯濾波來實現(xiàn)的,一個負(fù)責(zé)計算空間接近度的權(quán)重,另一個負(fù)責(zé)計算像素值相似度的權(quán)重,從而可以實現(xiàn)濾波同時,邊緣也不模糊。該美顏相機(jī)應(yīng)用適用于Android4.1版本以上的手機(jī)。關(guān)鍵字多任務(wù)卷積神經(jīng)網(wǎng)絡(luò),雙邊濾波算法,BB回歸,標(biāo)記定位,高斯濾波,卷積ABSTRACTWiththegrowingpopularityofmobilephonesandandroidprogressdeeplearningtechnology,thedemandforbeautyhavebecomemoresophisticated,sothecameradepthstudybasedonbeautygraduallybecomeapopularapplicationofcurrentsociety,occupyalargemarketapplicationsbeauty.Thegraduationprojectmainlyusesmulti-taskingconvolutionneuralnetwork(MTCNN)forfacedetectionandbilateralfilteringalgorithmdermabrasionwhiteningface.MultitaskingconvolutionalneuralnetworkmodelisimplementedbythreeCNN,afirstlayerofaconvolutionalneuralnetworksincetheshallowlayers,canquicklygeneratepseudocandidatefacewindow,thesecondlayerofnegativevastconvolutionalneuralnetworkbasedontheconfidencenon-facecandidatewindowportion,thethirdlayerconvolutionalneuralnetworktofindfivefacefeaturemarkpoints.Bilateralfilteringalgorithmisanon-linearfiltering,whichisimplementedusingtwoGaussianfiltering,oneforweightcalculationofthespatialproximity,anothercomputingpixelvaluesimilarityresponsibleweight,dosoatthesametimefiltering,itdoesnotblurtheedges.ThebeautycameraappformorethanAndroid4.1versionofthephone.KEYWORDSMultitaskingconvolutionneuralnetwork,Bilateralfilteringalgorithm,boundingboxregression,Landmarklocalization,Gaussianfilter,convolution目錄TOC\o"1-3"\h\u25757第一章緒論 524281.1選題背景及意義 5260111.2國內(nèi)外相關(guān)研究現(xiàn)狀 6141391.2.1人臉識別技術(shù) 6322121.2.2美顏 8284911.3本文主要工作 1092351.4本文主要結(jié)構(gòu) 1080391.5系統(tǒng)的開發(fā)環(huán)境和運行環(huán)境 10211第二章算法介紹 11166472.1MTCNN 11304492.1.1MTCNN概述 11178702.1.2原理 11191612.1.3涉及到的技術(shù) 15236822.2雙邊濾波算法 1692392.2.1雙邊濾波概述 16314522.2.2雙邊濾波原理 17175232.2.3雙邊濾波的公式 17150172.2.4雙邊濾波的權(quán)值分布 1926890第三章算法實現(xiàn) 20197263.1MTCNN模型實現(xiàn)與訓(xùn)練 20115143.1.1下載訓(xùn)練集并進(jìn)行處理 2074193.1.2訓(xùn)練模型 22170503.2構(gòu)建APP實現(xiàn)攝像頭預(yù)覽 23169013.3載入模型 25162213.4實現(xiàn)菜單 28120963.5實現(xiàn)渲染 29224703.6實現(xiàn)美顏 3096893.6.1美白 3051523.6.2磨皮 30290473,6.3紅潤 3030343.6.4實現(xiàn)Android拖動條(SeekBar) 31257753.7實現(xiàn)濾鏡 31257653.7.1模糊濾鏡 31322723.7.2黑白濾鏡 31317063.7.3四分濾鏡 318846結(jié)論 325035致謝 3291主要參考文獻(xiàn) 3227427附錄 33第一章緒論1.1選題背景及意義在當(dāng)今社會,對美麗的熱愛是普遍的。無論男女老少,尤其是女性用戶,這都是不可避免的。根據(jù)數(shù)據(jù),美顏相機(jī)是世界上第一個為自拍開發(fā)的移動美顏APP。推出后僅88天,用戶總數(shù)已達(dá)到2000萬,而用戶數(shù)量仍在迅速增長,一年后超過了1億。在其用戶中,絕大多數(shù)是女性,比例為2.8:7.2。隨后,大量的美顏應(yīng)用如B612咔嘰,美圖秀秀等相機(jī)應(yīng)用軟件開始出現(xiàn)。隨著這些美顏軟件的誕生,為人們提供了更多展示自己的機(jī)會,也掀起了一股美容自拍浪潮。據(jù)統(tǒng)計,自拍照的圖像每三秒鐘在世界各地上傳一次,自拍照用戶花費更多的時間美化自己的照片,而不是化妝。在這一浪潮中,各種美容photoshop應(yīng)用程序已成為自拍照片的生產(chǎn)線。在將“合格的”自拍照照片上傳到QQ空間和微信之前,通常會對其進(jìn)行一些美容處理和修改:皮膚打磨,美白,紅潤,瘦臉等。這樣,由獲取,修復(fù)和上載組成的固定格式已成為一種流行的生活方式,人們因此進(jìn)入了“自拍照”時代。在此過程中,人們開始對一般自拍美顏不再滿意,逐漸演變?yōu)閷Ω鞣N新奇的活動,因為美顏軟件也開始開展一些新穎的活動來吸引更多用戶的注意力,例如百度魔圖PK大明星,讓用戶看到與名星的相似程度;在萬圣節(jié)時期進(jìn)行的萬圣節(jié)化妝貼圖;進(jìn)行偶像營銷的美顏相機(jī)。然而這些并沒有改變美顏類應(yīng)用的頹勢,由于功能相似,性能差不多,導(dǎo)致用戶對其都是三分鐘熱度。這段時間聽說這個好用就用這個,等過段時間發(fā)現(xiàn)那個應(yīng)用人多就用那個,無論那個APP都不存在粘性,新奇的活動只能短暫吸引用戶眼球,等熱度過了,用戶又會悄然流失。如何進(jìn)行用戶沉淀,如何吸引住用戶,阻止用戶溜走,提高用戶忠誠度,最最關(guān)鍵的還是新技術(shù)的引入和性能效果的提升。這時,人臉識別技術(shù)進(jìn)入了飛速發(fā)展,出現(xiàn)了許多技術(shù)方法,尤其是自1990年以來,人臉識別技術(shù)已經(jīng)得到長遠(yuǎn)的發(fā)展,每年都有非常多的學(xué)術(shù)論文出現(xiàn)在官方網(wǎng)站發(fā)表。人臉識別算法主要包括:基于神經(jīng)網(wǎng)絡(luò)的識別算法,基于幾何特征的識別算法,基于模板匹配的識別算法,基于面部特征點的識別算法等。其中,基于深度學(xué)習(xí)的人臉識別以其較高的識別率和快速的識別效率超越了傳統(tǒng)的人臉識別,逐漸成為整個領(lǐng)域的核心技術(shù)。大量的人才、學(xué)術(shù)界、工業(yè)界和個人愛好者都投入到該技術(shù)的研究中,成為其研究力量的生力軍,發(fā)展趨勢進(jìn)入高速發(fā)展中?;谏疃葘W(xué)習(xí)的人臉識別不僅在公開發(fā)布的公共測試集上不斷刷新紀(jì)錄,同時也已經(jīng)成功應(yīng)用到金融安全、智能安全防護(hù)和銀行系統(tǒng)等領(lǐng)域。如今,幾乎所有知名的IT公司和理工大學(xué)都設(shè)有研究小組從事與面部識別相關(guān)的主題。如果將人臉識別技術(shù)應(yīng)用在美顏類的應(yīng)用上,其性能將得到大幅度的提升,不僅可以增加與用戶之間的互動,還可以是美顏更加精細(xì)化,使美顏不再是對整體進(jìn)行,而是只針對你的人臉部分,甚至是眼睛,鼻子都可以進(jìn)行微調(diào)。1.2國內(nèi)外相關(guān)研究現(xiàn)狀1.2.1人臉識別技術(shù)國外:1966年,PRI的Bledsoe開始致力于機(jī)器的自動面部識別。1990年,日本開發(fā)了人像識別機(jī),可以在一分鐘內(nèi)從21萬人中識別出所需的人。1993年,美國陸軍研究實驗室(ArmyResearchLaboratory)和高級研究計劃局(AdvancedResearchProjectsAgency)成立了Feret(FaceRecognitionTechnology)項目團(tuán)隊,該團(tuán)隊創(chuàng)建了Feret人臉數(shù)據(jù)庫,該數(shù)據(jù)庫可用于檢測人臉識別算法的效率。2012年,聯(lián)邦調(diào)查局(FBI)投資了10億美元開發(fā)面部識別技術(shù)數(shù)據(jù)庫。美國是第一個開始使用人臉識別技術(shù)的國家,也是世界上第一個應(yīng)用此技術(shù)的國家。美國的人臉識別技術(shù)始終屬于世界頂級水平。1993年,美國國防部啟動了FERET項目,為以后研究生物智能識別技術(shù)奠定了良好的基礎(chǔ),并將人臉識別技術(shù)從最初的階段推廣到了原型系統(tǒng)階段?,F(xiàn)在,美國電影中的現(xiàn)象:沒有鑰匙孔,只有相機(jī)的門,您可以通過識別臉部進(jìn)入房間。通過面部識別可以解鎖政府部門中的關(guān)鍵設(shè)備。在美國,已經(jīng)在使用預(yù)先安裝的攝像頭在跟蹤人時識別面部。2014年,F(xiàn)BI推出了最新一代的電子身份識別系統(tǒng),該系統(tǒng)可以使用攝像頭跟蹤嫌疑犯,并帶領(lǐng)他們進(jìn)行人為追捕,耗資超過10億美元。美國陸軍實驗室使用使用VC++開發(fā)的軟件來實現(xiàn)該技術(shù)。人臉準(zhǔn)確性識別率為49%。在美國公開發(fā)布的測試培訓(xùn)中,F(xiàn)AR為53%。美國國防部高級研究計劃(DARPA)使用半自動和全自動算法。該算法需要預(yù)先識別圖像中人臉的手動和自動眼中心坐標(biāo)。在機(jī)場的現(xiàn)場測試中,識別準(zhǔn)確率很低,系統(tǒng)中存在很多錯誤和錯誤。日本雖然稍微晚些接觸到人臉識別的國家,但是日本的面部識別技術(shù)發(fā)展迅速。早在2014年,日本大阪的一個研究中心就測試了基于視頻流的面部識別技術(shù)。該項目的目的是通過攝像頭實時監(jiān)控面部表情和人流,以確定在發(fā)生災(zāi)難時緊急出口是否可以安全使用。近年來,日本一直在加快對智能視頻分析的研究。2015年,日本日立公司開發(fā)了視頻監(jiān)控人臉識別技術(shù),該技術(shù)可以每秒掃描3600萬張圖像,其技術(shù)形式為高級識別人臉,并實時存儲人臉圖像以對相似的人臉圖像進(jìn)行分類。2015年7月3日,日本所有主要機(jī)場都使用了可以通過計算機(jī)智能識別人臉的系統(tǒng)。卡內(nèi)基梅隆大學(xué),麻省理工學(xué)院和英國雷丁大學(xué)等一些外國大學(xué),此外,還有上市公司的研究方向(有遠(yuǎn)見的專家,Viaage的FaceFINDER身份驗證系統(tǒng),LauTech的Hunter系統(tǒng)),德國的BioID系統(tǒng))也主要集中在公共安全,刑事偵查和安全方面,而實際上對考試驗證系統(tǒng)的方向還沒有進(jìn)行深入的研究。國內(nèi):在中國,從人工識別發(fā)展到計算機(jī)智能識別的最早的生物識別技術(shù)是從指紋識別技術(shù)開始的。然而,在實際的測試和應(yīng)用中,對人臉識別技術(shù)的需求逐漸顯現(xiàn)。與國外相比,中國人臉識別技術(shù)的發(fā)展時間相對較晚,但發(fā)展速度很快。早在1990年代,中國就開始研究人臉識別的方向,并建立了各種研究機(jī)構(gòu)和相應(yīng)的機(jī)構(gòu)。清華大學(xué)最優(yōu)秀,最具代表性的學(xué)校和科研機(jī)構(gòu),自動化系,電子與計算機(jī)科學(xué)系,中國科學(xué)院制動學(xué)會模式識別國家重點實驗室和哈爾濱工業(yè)大學(xué)計算機(jī)系等的表現(xiàn)在面部識別和其他模式識別領(lǐng)域,研究團(tuán)隊,研究機(jī)構(gòu)和學(xué)校嘗試了許多重要的測試和實踐,并取得了顯著成果。隨后,越來越多的專家,博士生和學(xué)者參加了人臉識別研究項目,并發(fā)表了許多有價值的高水平文章。自2001年以來,中國公安刑偵部門一直在使用面部識別技術(shù)預(yù)防和打擊重大刑事犯罪,并得到了政府資金的大力支持。然后,在2002年,北京克里基科技發(fā)展有限公司成立。成功實施了人臉識別系統(tǒng),首次可以達(dá)到50%的正確識別率。2005年1月18日,由清華大學(xué)電子學(xué)系人臉識別研究組組長蘇光大教授主持的人臉識別系統(tǒng)通過了公安部專家組的評審。專家一致認(rèn)為,人臉識別技術(shù)處于國際先進(jìn)水平和中國領(lǐng)先水平。2006年,方正科技集團(tuán)有限公司推出了新的筆記本電腦,這是中國第一臺具有“面部識別”功能的筆記本電腦。在2008年北京奧運會期間,中國首次在安全系統(tǒng)中采用了面部識別技術(shù),為奧運會的順利開幕提供了有效的安全措施。這也標(biāo)志著家用人臉識別技術(shù)進(jìn)入了大規(guī)模的應(yīng)用和實踐階段??偟膩碚f,早在19世紀(jì)末,法國人就如何利用面部特征來識別人的問題發(fā)表了報紙和雜志報道。直到20世紀(jì)末,人臉識別技術(shù)才取得了根本性突破。面部識別技術(shù)的發(fā)展主要經(jīng)歷以下三個階段:第一階段主要研究簡單背景下的面部識別以及面部識別過程中所需的面部特征。Bledsoe的研究被認(rèn)為是面部識別研究的開始。在1960年代中后期,人們使用臉部器官的局部特征來描述臉部,但是這種方法僅對正面臉部變形較小的臉部產(chǎn)生了一些影響。1970年代,一些研究人員使用計算機(jī)建立了高質(zhì)量的面部灰度圖像模型。在這個階段,面部圖像的識別過程幾乎與操作者密不可分,并且所構(gòu)造的系統(tǒng)不能自動完成識別任務(wù)。但這對于設(shè)計識別面部的算法和系統(tǒng)的工程師來說是重要的指南。第二階段主要集中在人機(jī)交互的人臉識別上。Lesk和Harmon使用幾何特征參數(shù)和多維特征向量來描述人臉圖像信息,并基于此思想開發(fā)了圖像識別系統(tǒng)。Kobayashi和Kaya將統(tǒng)計識別理論整合到面部識別中,并使用歐幾里得距離來描述面部特征,例如嘴唇與鼻子之間的距離。Stonham提出了一種用于面部識別和表情分析的單層自適應(yīng)神經(jīng)網(wǎng)絡(luò),每個人一個。這個階段并沒有擺脫人工干預(yù),但是仍然需要操作人員具備一些先驗知識。第三階段是自動機(jī)器識別階段。在1990年代,隨著計算機(jī)結(jié)構(gòu)的不斷改進(jìn),計算速度和效率也在不斷提高,圖像獲取和處理能力也得到了提高,人臉識別方法取得了重大突破。它不僅可以自動識別正面,光線充足且沒有陰影的面部,而且還可以識別具有不同姿勢變化,不同表情,不同年齡階段和不同光照條件的面部。在這一階段,研究人員提出了許多自動人臉識別方法,在一定程度上促進(jìn)了人臉識別技術(shù)的發(fā)展。1.2.2美顏在手機(jī)剛開始起步時,人們對手機(jī)的需求并不是很大,只要能夠完成基本的通訊功能就足夠了。之后,隨著科技的發(fā)展,手機(jī)進(jìn)入到了功能機(jī)時代,手機(jī)廠商開始在手機(jī)內(nèi)部添加一些新的功能應(yīng)用,例如聽音樂,拍照片等等,所以演變成兩大主流手機(jī):音樂手機(jī)和影音手機(jī),后來這些都成為每部手機(jī)必備的應(yīng)用軟件了。到了智能機(jī)時代,人們對手機(jī)需求開始上升,手機(jī)廠商經(jīng)過調(diào)查發(fā)現(xiàn),女性市場占據(jù)主要部分,且女性消費者最為關(guān)注的手機(jī)功能就是自拍美顏效果,換言之,只要哪個廠商能夠在自拍的美顏技術(shù)上形成技術(shù)壓制,自然就能占據(jù)女性消費者市場。因此手機(jī)廠商開始想方設(shè)法在提升美顏技術(shù)。剛開始,手機(jī)自帶的相機(jī)中的美顏功能并沒有比得過軟件的美化,因為前期的手機(jī)廠商在相機(jī)美顏功能上只是隨意的將皮磨平,之后再對亮度進(jìn)行調(diào)高。所以,在當(dāng)時,美圖軟件還是占據(jù)主流地位的。后來OPPO對美顏進(jìn)行深入大量的研究,創(chuàng)造了自己的一套美顏自拍的算法,將其應(yīng)用到了手機(jī)上,得到了大量的女性消費者的認(rèn)同,因此雖然手機(jī)硬件配置不高,但依舊占據(jù)了一大批的市場,并且進(jìn)入當(dāng)時市場排名前三,取得了巨大的成功。這樣導(dǎo)致其他很多廠家十分眼紅,大家紛紛效仿,手機(jī)美顏自拍功能得到了巨大的發(fā)展。Vivo緊隨其后,增加手機(jī)前置攝像頭至兩個,將美顏自拍功能作為手機(jī)的賣點之一,也取得成效顯著的成功?,F(xiàn)如今,美顏已經(jīng)不再是只依靠一個算法,它還結(jié)合著當(dāng)下最熱的深度學(xué)習(xí)技術(shù),模仿人們平時化妝的步驟,實現(xiàn)逐層自拍美顏的效果。美麗時代的人看起來更加美麗,也沒有隱藏對美的追求。美麗時代終于使美麗黯然失色。美麗不再供不應(yīng)求,為容貌被壓抑的事物留出更多空間。在世界各地,每三秒鐘,網(wǎng)絡(luò)沖浪者就會上傳一張自己的照片,花費更多的時間來美化照片而不是化妝。這似乎已經(jīng)建立了一種新的社會規(guī)范,例如需要在正式場合穿著西裝,在這種場合下,不給自拍照增添魅力的自拍照會成為一種陌生的景象,并成為一種禮貌的形式。2013年,在牛津英語詞典宣布“selfie”為年度單詞后的12個月中,英語世界中“selfie”的出現(xiàn)頻率飆升了170倍。世界各地的每一秒鐘,網(wǎng)絡(luò)沖浪者都會嘗試通過Internet查找自拍照的圖像,然后每三秒鐘,網(wǎng)絡(luò)沖浪者就會上傳一張自拍照的圖像。這種趨勢也激發(fā)了自拍用戶想象自己的形象,各種各樣的照片編輯應(yīng)用程序正在成為一些亞洲國家的規(guī)范,皮膚拋光,美白和臉部變薄比化妝要花費更多的時間。Instagram是一個過濾器豐富的應(yīng)用程序,預(yù)計每天將產(chǎn)生7500萬張自拍照。一方面,它表現(xiàn)出一種修正的自我和一種未改變的自我期望。另一方面,它形成了新的社會法。對于美圖秀秀的創(chuàng)始人吳新紅來說,相機(jī)的誕生純粹是由數(shù)據(jù)驅(qū)動的。他發(fā)現(xiàn)根據(jù)美圖秀秀的數(shù)據(jù),“人像美”已經(jīng)超越“美化”,成為最常用的功能模塊。所謂的“人像美”就是使用按鍵打磨,按鍵美白的方式美化人像照片。用“美白”,“瘦臉”和“去除粉刺”等術(shù)語代替“白平衡”,“積極負(fù)面影響”和“高ISO降噪”降低了以前不得不求助于專業(yè)人士的自拍照使用者的門檻緩凝劑。攝像機(jī)通過一個按鈕在幾秒鐘內(nèi)完成所有美化工作,從而進(jìn)一步簡化了過程?!懊缊D的最大優(yōu)勢是對女性的了解?!薄懊缊D產(chǎn)品副總裁陳杰說。他和他的團(tuán)隊買了“女人的起源”來研究女人的心理,辦公室里的女人成了優(yōu)秀的測試對象。在美圖的辦公室里,自拍照工人蹲在角落里為了適應(yīng)女性的審美觀,UI設(shè)計色彩的風(fēng)格小巧而清新,以“卡哇伊”風(fēng)格裝在車架上,以適應(yīng)女性的審美觀。一個新的想法:美將產(chǎn)生一種“金光閃閃”的動畫效果,靈感來自于動畫“水手月亮”,當(dāng)水變成冰月時,到處都是花朵和星星。這樣就開始了社交自拍的熱潮。如今,美容相機(jī)每天產(chǎn)生1億張自拍,并分布在社交媒體平臺上,二十一點是最流行的自拍時間。天秤座是最受歡迎的自拍照標(biāo)志,占所有用戶的21%,其中男性占18%。浴室還是唯一地點。自言自語比單詞更能滿足人們對印象管理的需求。盡管自拍者需要控制他人對他或她的看法,但文字的線性本質(zhì)并不能反映人類情感的復(fù)雜性。對虛擬社會心理學(xué)的一項研究表明,圖片使人們感覺就像面對面接觸。人們有意識地選擇具有自己形象的形象,既要表現(xiàn)自己的外觀,又要突出對他們來說很重要的特征和品質(zhì)?!蔽磥恚四樧R別技術(shù)的發(fā)展將大大擴(kuò)大美容效果的可能性。通過機(jī)器學(xué)習(xí),可以根據(jù)每個人的面部特征優(yōu)化美容產(chǎn)品。例如,在機(jī)器看到許多這樣的面孔之后,它可以匹配相應(yīng)的星星。他說:“我們現(xiàn)在擁有一種稱為“一鍵式,獨立的,內(nèi)置軟件的離線應(yīng)用程序”。吳先生說:“將來,它將通過'云'。”“我們可以群集服務(wù)器并進(jìn)行更復(fù)雜的處理?!?.3本文主要工作本文的目的是實現(xiàn)人臉區(qū)域的磨皮美白的安卓應(yīng)用APP。要實現(xiàn)這樣的效果,首先需要選定人臉的區(qū)域范圍,這就要運用到當(dāng)下熱門的深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò),學(xué)習(xí)MTCNN原理,利用先前在本地端訓(xùn)練好的MTCNN模型獲得人臉輪廓范圍,然后了解雙邊濾波器的原理,最后利用雙邊濾波的方式進(jìn)行人臉磨皮,達(dá)到不改變?nèi)四樳吘壍那疤嵯聦崿F(xiàn)美化人臉的目的。1.4本文主要結(jié)構(gòu)本文的章節(jié)做如下安排。第一章緒論主要是介紹該畢業(yè)設(shè)計的背景及意義、相應(yīng)所需要的技術(shù)在國內(nèi)外發(fā)展?fàn)顩r以及開發(fā)該系統(tǒng)所需要的開發(fā)環(huán)境和運行環(huán)境;第二章算法介紹主要是對MTCNN模型和雙邊濾波算法進(jìn)行詳細(xì)的介紹與說明;第三章算法實現(xiàn)主要以圖文的形式講述MTCNN模型是如何進(jìn)行建立和訓(xùn)練的以及雙邊濾波是如何應(yīng)用的。結(jié)論是對整個畢業(yè)設(shè)計工作的歸納與總結(jié),通過比較總結(jié)出自己設(shè)計工作的合理性,對其中優(yōu)點和不足之處提出自己個人的改進(jìn)意見與看法;致謝主要內(nèi)容是對指導(dǎo)自己的導(dǎo)師表示感謝;主要參考文獻(xiàn)所列出的是我曾經(jīng)了解過幫助很大且發(fā)表在公開出版物上的論文或者是網(wǎng)上下載的在設(shè)計中所使用的資料。附錄主要放置的是有參考價值的程序但不適合放到正文中。1.5系統(tǒng)的開發(fā)環(huán)境和運行環(huán)境PyCharm2019.1.2(ProfessionalEdition):PyCharm是由JetBrains創(chuàng)建的PythonIDE,并帶有許多工具,可幫助您更高效地用Python編寫代碼,例如代碼跳轉(zhuǎn),智能提示,語法突出顯示,項目管理,自動完成,單元測試,調(diào)試,版本控制等等。此外,IDE具有許多高級功能,可用于在Django框架下支持專業(yè)的Web開發(fā)。它還支持GoogleAppEngine,而PyCharm還支持IronPython,借助高級代碼分析程序,PyCharm成為了專業(yè)Python開發(fā)人員和初學(xué)者的便捷工具。AndroidStudio3.6.1:AndroidStudio是一個類似于EclipseADT的基于IntellijIDEA的Android開發(fā)和編譯環(huán)境。AndroidStudio提供了用于開發(fā)和調(diào)試的集成Android開發(fā)工具。它基于IDEA,還基于Gradle構(gòu)建支持,基于用于生成常用Android應(yīng)用程序和組件設(shè)計的模板指南,提供了諸如版本兼容性,可用性,捕獲性能問題之類的快速工具。布局功能強(qiáng)大的編譯器,可以在控件預(yù)覽上使用窗體拖動效果,可以重建Android專有和快速修復(fù),還支持Progard標(biāo)志和應(yīng)用程序。Anaconda4.7.12:Anaconda是專門用于方便使用的Python科學(xué)研究數(shù)據(jù),并建立了一套軟件包,涵蓋了幾乎所有常見的Python庫數(shù)據(jù)科學(xué)領(lǐng)域,并且專門用于解決依賴CONDA軟件包管理系統(tǒng)的軟件環(huán)境問題。是提供包管理和環(huán)境管理的功能,可以非常方便地解決多個版本的Python切換,共存和各種第三方包的安裝問題。Anaconda可以使用工具命令conda進(jìn)行安裝和環(huán)境管理,并且它已經(jīng)包含Python和相關(guān)工具。Tensorflow-gpu1.14.0:TensorFlow是當(dāng)前世界上最受歡迎的深度學(xué)習(xí)框架,主要用于語言理解,圖像識別,語音理解等領(lǐng)域。它靈活,快速,適合于產(chǎn)品和大規(guī)模應(yīng)用。TensorFlow使用計算圖執(zhí)行所有計算。計算表示為tf.graph對象的實例,其中數(shù)據(jù)表示為tf.tensor對象,該對象使用tf.operation對象進(jìn)行使用和操作,然后在Session中使用tf.session對象執(zhí)行。由于Tensorflow的GPU版本訓(xùn)練速度更快,所以還需要下載對應(yīng)的CUDA(用來實現(xiàn)GPU運算的平臺,利用顯卡進(jìn)行訓(xùn)練)和CUDNN(加速神經(jīng)網(wǎng)絡(luò)),因此該畢業(yè)設(shè)計中的配置如下:Cuda10.0+Cudnn7.4.2+Python3.7+Tensorflow-gpu1.14.0算法介紹2.1MTCNN2.1.1MTCNN概述MTCNN又稱多任務(wù)卷積神經(jīng)網(wǎng)絡(luò)(Multi-taskconvolutionalneuronetwork),是由中國科學(xué)院深圳研究院于2016年專門針對人臉檢測的多任務(wù)神經(jīng)網(wǎng)絡(luò)模型提出的,該模型主要采用三種級聯(lián)網(wǎng)絡(luò),利用候選框和分類器的思想,快速高效地進(jìn)行人臉檢測。這三個級聯(lián)網(wǎng)絡(luò)是p-net(可快速生成候選框),r-net(可高精度篩選和選擇候選框)和o-net(可生成最終邊界框和面關(guān)鍵點)。該模型還使用非最大抑制,邊界回歸,圖像金字塔和其他技術(shù)。2.1.2原理上圖是MTCNN論文原圖,上面清晰明了顯示了MTCNN的原理流程,我將其分為以下四個步驟:構(gòu)建圖像金字塔。首先對圖片進(jìn)行不斷的Resize,就會得到一系列尺寸大小不同的圖片,以適應(yīng)不同大小人臉的檢測。按照MTCNN論文所述,調(diào)整大小的比例為0.7,這個數(shù)值可以自己根據(jù)下載的數(shù)據(jù)集中人臉大小以及分布來賦值,最好還是控制在0.70-0.80之間較為合適,如果設(shè)置的比例過大,就會造成處理時間過長;如果比例太小的話,就會漏掉一些小型和中型人臉。按照調(diào)整大小的比例對圖片進(jìn)行縮放,直到圖片的大小大于或者等于Pnet要求的12*12的大小。如此,我們就會得到原圖、原圖*0.7、原圖*0.7^2...、原圖*0.7^n(最后一張圖片大小會大于或者等于12),這一系列尺寸大小不同的圖片,由于堆疊起來好像是個金字塔,又被稱為圖片金字塔,最后將這些圖片一張一張地輸入到Pnet中去得到候選。P-Net。全稱是ProposalNetwork,其本質(zhì)就是一個全連接的卷積神經(jīng)網(wǎng)絡(luò),這個網(wǎng)絡(luò)將特征輸入三個卷積層之后,通過人臉分類器來判斷該區(qū)域是否為人臉,同時使用邊框回歸和非極大值抑制,最后將會輸出許多疑似存在人臉的區(qū)域,然后將這些疑似區(qū)域輸入到R-Net中進(jìn)行更細(xì)致的處理。通過第一步,我們可以獲得一系列不同大小的圖像,即圖像金字塔,并將所有這些圖像輸入到Pnet中。我們可以通過FCN進(jìn)行初步的特征提取和邊界校準(zhǔn),并進(jìn)行候選框的邊界框回歸調(diào)整和大多數(shù)候選框的NMS過濾。簡單來說P-Net的思想就是使用較為淺層、簡單的CNN網(wǎng)絡(luò)來實現(xiàn)快速生成疑似人臉候選框。R-Net。全稱是RefineNetwork,其本質(zhì)是一個卷積神經(jīng)網(wǎng)絡(luò),它為第一層p-net網(wǎng)絡(luò)增加了一個完全連接的層,從而使其在過濾輸入圖像方面更加復(fù)雜。圖像通過p-net網(wǎng)絡(luò)后,將出現(xiàn)大量預(yù)測窗口,我們將其發(fā)送到r-net網(wǎng)絡(luò),它將過濾掉許多不符合要求并具有良好性能的候選框。最后,將通過邊界框回歸和NMS對剩余的候選框進(jìn)行優(yōu)化和再次預(yù)測。由于P-Net網(wǎng)絡(luò)的輸出只是一些具有一定置信度的疑似人臉區(qū)域,在該網(wǎng)絡(luò)中,可以對輸入的圖像進(jìn)行更加精細(xì)的選擇,同時過濾掉絕大部分錯誤的輸入,并且再一次使用邊框回歸和非極大值抑制來進(jìn)行人臉區(qū)域的優(yōu)化,最后將會輸出置信度較高的疑似人臉區(qū)域,將這些輸入給O-Net使用。相比于P-NET使用全卷積來輸出1*1*32的特征,R-Net采用的是在最后一個卷積層之后使用了一個128的全連接層,保留住了更多的圖像特征,準(zhǔn)確性也能較優(yōu)與P-Net。簡單的來說就是R-Net的思想就是采用一個比P-Net更加復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)來對P-Net所認(rèn)為可能是人臉區(qū)域的候選框進(jìn)行進(jìn)一步的篩選和調(diào)整,進(jìn)而達(dá)到高精度濾除和人臉區(qū)域優(yōu)化的效果。O-Net它的全稱是OutPutNetwork,其本質(zhì)是一個相對復(fù)雜的卷積神經(jīng)網(wǎng)絡(luò),與r-net相比,它具有一個額外的卷積層。o-net和r-net之間的差異在于這一層,它將通過更多的監(jiān)督來識別面部的面部區(qū)域,并對面部的面部特征點進(jìn)行相應(yīng)的回歸。最后,將會輸出五個人臉的面部特征點。相比于R-Net,這是一個更加復(fù)雜的卷積網(wǎng)路,這個網(wǎng)絡(luò)的輸入特征會更加多,在網(wǎng)絡(luò)結(jié)構(gòu)的最后一樣是一個更大256的全連接網(wǎng)絡(luò)層,保留更多的圖像特征,然后進(jìn)行人臉判別、人臉區(qū)域邊框回歸和人臉特征定位,最后輸出人臉區(qū)域的左上角坐標(biāo)和右下角坐標(biāo)及人臉區(qū)域的五個特征點。由于O-Net擁有更多的特征輸入及更加復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),也因為其更好的性能準(zhǔn)確率,所以將這一層的輸出結(jié)果作為整個網(wǎng)絡(luò)模型的最終輸出。簡單來說O-Net與R-Net的思想殊途同歸,都是采用更加復(fù)雜的網(wǎng)絡(luò)對模型的整體性能進(jìn)行優(yōu)化,提高其人臉檢測的準(zhǔn)確性。2.1.3涉及到的技術(shù)FNC:全稱全卷積網(wǎng)絡(luò),它是除傳統(tǒng)的卷積網(wǎng)絡(luò)連接層之外,然后對最后的卷積層特征圖樣本進(jìn)行去卷積,以能夠恢復(fù)到原始圖像大小,并且反卷積圖像的每個像素都可以預(yù)測一個類別,同時保留原始圖像的空間信息。IOU:對于圖像的子目標(biāo)圖像和用于校準(zhǔn)子目標(biāo)圖像的預(yù)測框,最終校準(zhǔn)的預(yù)測框和真實子圖像的自然框(通常需要手動校準(zhǔn))之間的相關(guān)性稱為IOU(聯(lián)合上的交集),經(jīng)常使用的標(biāo)準(zhǔn)是兩個盒子的橫截面積和合并面積之和。Bounding-Boxregression:全稱邊框回歸,對于一個框,我們經(jīng)常使用四個維向量(x,y,w,h)來表示盒子,其中x和y代表窗口的中心點坐標(biāo),而w代表h的寬度和高度。在下圖中,紅色框P表示原始框,綠色框G表示目標(biāo)框,線性回歸是為了找到一種關(guān)系,以便將輸入的原始窗口P映射到更接近回歸窗口G^真實窗口G。非極大值抑制(Non-MaximumSuppression,NMS):簡而言之,它是抑制非最大值的元素。例如,在行人檢測項目中,滑動窗口提取行人特征,并在由分類器分類識別后,每個窗口將獲得相應(yīng)的分?jǐn)?shù)。但是,滑動框可能會導(dǎo)致許多框包含其他框或幾乎與其他框復(fù)制。然后,使用NMS選擇附近得分最高的框,并取消得分最低的框。就像上面的圖片一樣,找到一輛汽車,算法會找到一堆盒子,我們需要找出哪些盒子沒用。非最大抑制方法如下:首先,假設(shè)有六個矩形框,根據(jù)分類器的分類概率對其進(jìn)行排序,并假設(shè)從小到大的屬于車輛的概率為A,B,C,D,E和F。(1)以最大的概率從矩形框F開始,判斷A?E與F的重疊度IOU是否大于A的某個閾值;(2)如果B和D之間的重疊度超過閾值,則丟棄B和D;我將標(biāo)記第一個矩形F,我們將其保留。(3)從剩余的矩形框A,C和E中選擇概率最高的E,判斷E與A和C之間的重疊度。如果重疊度大于A某個閾值,則將其丟棄;E是我們保留的第二個矩形。重復(fù)并找到所有剩余的框。顧名思義,非最大抑制(NMS)是抑制非最大值的元素,以搜索局部最大值。此局部表示具有兩個變量參數(shù)的鄰域,一個是鄰域的維數(shù),另一個是鄰域的大小。此處不討論通用NMS算法,而是將其用于提取目標(biāo)檢測中得分最高的窗口。例如,在行人檢測中,提取滑動窗口的特征,并由分類器分類和識別后,每個窗口將獲得一個分?jǐn)?shù)。但是,滑動窗口可能會導(dǎo)致許多窗口包含其他窗口或大部分與其他Windows相交。在這種情況下,需要NMS選擇得分最高(行人概率最高)的那些街區(qū),并禁止得分最低的那些窗口。2.2雙邊濾波算法2.2.1雙邊濾波概述雙邊濾波,也稱為BilateralFilter,是一種非線性濾波。這是一種將圖像的空間接近度與像素值相似度相結(jié)合的方法。在濾波時,該濾波方法同時考慮空間接近度信息和顏色相似度信息,在濾除噪聲并使圖像平滑的同時,還實現(xiàn)了邊緣保留。雙邊濾波使用兩個高斯濾波器的組合。一個負(fù)責(zé)計算空間接近度的權(quán)重,即常用的高斯濾波原理。另一個負(fù)責(zé)計算像素值相似度的權(quán)重。在兩個高斯濾波器同時作用下,是雙向濾波。雙邊過濾器的優(yōu)點是可以用來保留邊緣。通常采用高斯濾波來減少噪聲,這會使邊緣模糊更加明顯,并且對高頻細(xì)節(jié)的保護(hù)效果不明顯。顧名思義,雙邊濾波器比高斯濾波器多一個高斯方差sigma-d,并且高斯濾波器是基于空間分布的高斯濾波器函數(shù)。因此,在邊緣附近,像素越遠(yuǎn),對邊緣像素值的影響越小。它保證了邊緣附近像素值的保留。但是,由于保留了太多的高頻信息,對于彩色圖像中的高頻噪聲,雙邊濾波器無法干凈地濾除,而只能很好地濾除低頻信息。2.2.2雙邊濾波原理雙邊濾波的原理是將與空間距離有關(guān)的高斯函數(shù)與灰度距離有關(guān)的高斯函數(shù)相乘。空間距離:指當(dāng)前點到中心點的歐氏距離。高斯函數(shù)在空間域的數(shù)學(xué)形式為:其中(xi,yi)為當(dāng)前點位置,(xc,yc)為中心點的位置,sigma為空間域的標(biāo)準(zhǔn)差?;叶染嚯x:為當(dāng)前點灰度值與中心點灰度值之差的絕對值。高斯函數(shù)在值域內(nèi)的數(shù)學(xué)形式為:其中g(shù)ray(xi,yi)為當(dāng)前點灰度值,gray(xc,yc)為中心點灰度值,sigma為為值域標(biāo)準(zhǔn)差。對于高斯濾波,僅在將空間距離權(quán)重系數(shù)的核與圖像卷積后才能確定中心點的灰度值。也就是說,點離中心越近,其權(quán)重系數(shù)就越大。在雙邊濾波中,增加了灰度信息的權(quán)重,即在鄰域,灰度值接近中心點的灰度值的點的權(quán)重越大,其灰度值差異很大的點的權(quán)重越小。權(quán)重由高斯函數(shù)的值域確定。將空間權(quán)重系數(shù)乘以灰度權(quán)重系數(shù),便得到了最終的卷積模板。由于雙邊濾波需要每個中心點域的灰度信息來確定其系數(shù),因此其速度比一般濾波要慢得多,并且計算的增長率是核心大小的平方。2.2.3雙邊濾波的公式G(I,j)代表輸出點;I,j的S是以(I,j)為中心的2N加1(2N加1)的大小;F(k,l)代表(多個)輸入點;W(I,j,k,l)表示由兩個高斯函數(shù)計算的值。我們假設(shè)公式中的w(I,j,k,l)為m,則對上面的公式進(jìn)行變換,設(shè)m1+m2+m3…+mn=M,則有現(xiàn)在可以看到,這顯然是圖像矩陣與內(nèi)核的卷積。其中,m1/M代表第一個點的權(quán)重值,圖像矩陣和核由卷積算子加權(quán)和求和,最終得到輸出值。現(xiàn)在讓我們討論w(I,j,k,l)。Ws是空間鄰近高斯函數(shù),wr是像素值相似度高斯函數(shù)。如圖所見,w是ws和wr的乘積。對于ws,這是一個普通的高斯濾波器函數(shù),其坐標(biāo)被替換。Sigmas是程序輸入值,并且該函數(shù)是根據(jù)空間接近度計算的。wr正在計算像素值(色彩空間)的相似度,請注意,這是高斯替換坐標(biāo)值,即2sigmar^2以上的范數(shù),即|,f(I,j)-f(k,l),|^2。那是兩點之差的絕對值的平方。其中,在計算彩色圖片的差值時,應(yīng)減去(I,j)點的RGB通道值之和減去(k,l)點的RGB通道值之和。這是一種色彩空間計算,不是作為單個通道進(jìn)行的,而是在矩陣的最終卷積中,它是單個通道乘以權(quán)重而不是三個通道的總和。2.2.4雙邊濾波的權(quán)值分布當(dāng)圖像位于平坦變化的區(qū)域中時,附近的像素值(RGB值)之差不大。此時,wr無限地接近于1,因此這時的兩側(cè)都是普通的高斯濾波,以實現(xiàn)圖像平滑的效果。當(dāng)圖像處于邊緣區(qū)域等急劇變化的區(qū)域時,相鄰區(qū)域的像素值(RGB值)之差非常大。此時,wr接近0,色差越大,wr越接近0,最終整個表達(dá)式的值接近0。最終權(quán)重為0。因此,這不會影響輸出。最終計算中的值。通過這種方式,不僅能平滑圖像,又能保持了圖像的邊緣不模糊。算法實現(xiàn)3.1MTCNN模型實現(xiàn)與訓(xùn)練3.1.1下載訓(xùn)練集并進(jìn)行處理進(jìn)入http://shuoyang1213.me/WIDERFACE,下載訓(xùn)練集WIDERFaceTrainingImages以及標(biāo)簽Faceannotations,解壓后放置到original_data中,進(jìn)入http://mmlab.ie..hk/archive/CNN_FacePoint.htm,下載訓(xùn)練集Trainingset,解壓后放置到original_data中。處理訓(xùn)練集的標(biāo)簽由于訓(xùn)練集的標(biāo)簽,如下所示:0--Parade/0_Parade_marchingband_1_849.jpg1449330122149000000而我們需要的是這樣的:-Parade/0_Parade_marchingband_1_849.jpg449330571.0479.0因此需要對訓(xùn)練集的標(biāo)簽進(jìn)行處理,我們通過查看壓縮包里的readme.txt的說明,可知第一行為文件路徑,第二行為圖中人臉數(shù)量,第三行是人臉信息參數(shù)分別為:x1,y1,w,h,blur,expression,illumination,invalid,occlusion,pose。x1,y1,w,h,代表人臉框的位置;blur:是模糊度,分三檔:0,清晰;1:一般般;2:模糊不清;express:展示形式illumination:曝光,分正常和過曝occlusion:遮擋,分三檔。0,無遮擋;1,小遮擋;2,大遮擋;invalid:無效狀態(tài)pose:(典型和非典型姿態(tài))由于我們只需要圖片路徑和x1,y1,w,h,所以編寫了一個函數(shù)transformTxt專門用來處理標(biāo)簽問題。transformTxt(original_txt_path,final_txt_path)函數(shù)的原型如附錄所示,輸入兩個參數(shù)分別為原先數(shù)據(jù)集的標(biāo)簽地址及之后保存處理后的標(biāo)簽地址。ⅰ以寫入得方式打開之后保存處理后的標(biāo)簽地址,以只讀的方式打開原先數(shù)據(jù)集的標(biāo)簽地址;ⅱ調(diào)用file.readlines()以一行一行的形式進(jìn)行讀取,先去除頭尾空格,之后判斷其是否為“jpg”結(jié)尾,如果是的話,說明是文件路徑名,將其寫入到寫入文件中,如果不是的話,就跳過,最后將其標(biāo)志改為TRUE。ⅲ獲取人臉數(shù)量,由于一行一行讀取,因此文件名后為人臉數(shù)量,只要判斷標(biāo)志是否為TRUE就行了,如果為TRUE,就將其賦值給sum,將其標(biāo)志賦值為FALSE,判斷sum是否為零,若為零,將數(shù)量標(biāo)志賦值為TRUE,否則就跳過。ⅳ處理人臉數(shù)量為零的圖片,判斷數(shù)量標(biāo)志,若為TRUE,則刪除該行,并將數(shù)量標(biāo)志重置為FALSE。ⅴ判斷是否為人臉圖像坐標(biāo)x,y,w,h,先判斷sum是否大于零,如果大于零,則說明圖像有人臉則進(jìn)入雙重for循環(huán),以挨個將人臉圖像坐標(biāo)提取出來,依次寫入寫入文件中。如果為零或者小于零,跳過。處理訓(xùn)練集圖片由于PNet是全卷積網(wǎng)絡(luò),其目的是為了應(yīng)對不同人臉情況,如果只訓(xùn)練有人臉會造成識別正確率下降,將無人臉的時候識別出人臉。為了提高識別準(zhǔn)確率,訓(xùn)練數(shù)據(jù)由四部分組成:pos,part,neg,landmark,分別表示有人臉,部分人臉,無人臉及關(guān)鍵點,比例為1:1:3:1。ⅰ以只讀的形式打開處理過的標(biāo)簽存放地址,調(diào)用file.readlines()函數(shù)讀入,使用FOR循環(huán)來以一行一行的形式讀入。ⅱ調(diào)用line.strip().split('')將一行內(nèi)容以空格的方式分割賦值給字符串?dāng)?shù)組str。ⅲ讀取圖片,由于每行第一個為圖片地址名,故直接調(diào)用cv2.imread讀入圖片,將之后的坐標(biāo)信息,用FOR循環(huán)以四個為一列保存boxes的鏈表中。ⅳ通過for循環(huán)調(diào)用boxes中的每個人臉坐標(biāo)信息,通左右上下坐標(biāo)計算寬高,判斷寬高來舍去圖像過小和在圖片之外的圖像。ⅴ做五次for循環(huán),生成非人臉的圖像,調(diào)用np.random.randint函數(shù)隨機(jī)生成的關(guān)于x1,y1的偏移量在,并且保證x1+Offset_x>0,y1+Offset_y>0和之后與原先不重合。截取偏移后后的左上角坐標(biāo),排除大于原先圖片尺度,截取box,計算IOU,截取圖片并resize成12x12大小image[y1:y2,x1:x2],使用雙線性插值法,縮放圖片至12*12,將IOU值小于0.3判定為非人臉圖像,保存截取圖片及其labol。ⅵ通過FOR循環(huán)二十次,并縮小隨機(jī)選取size范圍,更多截取pos和part圖像。除去尺度小于5的,將偏移量,范圍縮小為原來的五分之一,截取圖像左上坐標(biāo)計算是先計算x1+w/2-size/2坐標(biāo),再加上偏移量,計算新的左上角坐標(biāo),排除超出的圖像,截取box,人臉框相對于截取圖片的偏移量并做歸一化處理,截取圖片并resize成12x12大小image[y1:y2,x1:x2],使用雙線性插值法,縮放圖片至12*12,判斷IOU是否大于0.65,如果大于0.65,則將其列入人臉圖像,如果小于0.65,大于0.4則列入部分人臉中,并將圖片地址及相應(yīng)的人臉坐標(biāo)信息寫入相應(yīng)標(biāo)簽文件中ⅶ將人臉圖像的狀態(tài)定為1,部分人臉圖像的狀態(tài)定為-1,非人臉圖像的狀態(tài)定為0。3.1.2訓(xùn)練模型MTCNN主要訓(xùn)練三個神經(jīng)網(wǎng)絡(luò)PNet,RNet,ONet。將目錄cd到preprocess上,pythongen_12net_data.py生成三種pnet數(shù)據(jù),pythongen_landmark_aug.py12生成pnet的landmark數(shù)據(jù),pythongen_imglist_pnet.py整理到一起,pythongen_tfrecords.py12生成tfrecords文件將目錄cd到train上pythontrain.py12訓(xùn)練pnet將目錄cd到preprocess上,pythongen_hard_example.py12生成三種rnet數(shù)據(jù),pythongen_landmark_aug.py24生成rnet的landmark數(shù)據(jù),pythongen_tfrecords.py24生成tfrecords文件將目錄cd到train上pythontrain.py24訓(xùn)練rnet將目錄cd到preprocess上,pythongen_hard_example.py24生成三種onet數(shù)據(jù),pythongen_landmark_aug.py48生成onet的landmark數(shù)據(jù),pythongen_tfrecords.py48生成tfrecords文件將目錄cd到train上pythontrain.py48訓(xùn)練onet3.2構(gòu)建APP實現(xiàn)攝像頭預(yù)覽如上圖所示,我將攝像頭預(yù)覽分為以下七個主要步驟。調(diào)用Camera的open(intCameraId)方法打開攝像頭。手機(jī)的攝像頭照常來說分為前后攝像頭,對應(yīng)的CameraId分別為android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT和android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK,由于本次畢業(yè)設(shè)計為自拍式的美顏相機(jī),因此將CameraId默認(rèn)設(shè)置為前置攝像頭,即android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT。調(diào)用android.hardware.Camera.open(CameraId),其中CameraId即上文所提到的前置攝像頭ID,并判斷是否調(diào)用成功,返回參數(shù)為boolean。這是由于有時候手機(jī)權(quán)限沒有授予的原因或者攝像頭出現(xiàn)損壞等原因,導(dǎo)致無法正常開啟,以便對之后的情況進(jìn)行相應(yīng)的處理。如果返回的boolean值為true就正常進(jìn)行攝像頭預(yù)覽下一步步驟,如果返回的boolean值為false,則表明無法正常打開攝像頭,就會顯示權(quán)限沒授予或者攝像頭損壞。調(diào)用Camera的getParameters()得到該攝像頭的參數(shù)。這一步主要是為了獲取該攝像頭的參數(shù),調(diào)用Camera.getParameters()會得到android.hardware.Camera.Parameters對象,為之后使用Camera.Parameters對象進(jìn)行參數(shù)設(shè)置。調(diào)用Camera.Parameters對象對參數(shù)進(jìn)行設(shè)置。得到android.hardware.Camera.Parameters對象,便可對參數(shù)進(jìn)行設(shè)置。調(diào)用Parameters.setFocusMode(Stringvalue)設(shè)置聚焦模式,對應(yīng)的value有六種:“auto”-自動,“infinity”-無窮遠(yuǎn),“macro”-微距,“Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE”-連續(xù)對焦,以及“fixed”-固定焦距。由于本次畢業(yè)設(shè)計使用的是攝像頭預(yù)覽,因此采用的是連續(xù)對焦,增加視頻流的清晰度,使預(yù)覽畫面辨識度更高。Parameters.setPreviewSize(intwidth,intheight)設(shè)置預(yù)覽大小的寬和高,有每個設(shè)備可以允許使用的顯示大小不同,再加上與顯示Surface的大小有關(guān),所以需要進(jìn)行適配,首先使用Parameters.getSupportedPreviewSizes()來獲取Camera所支持的大小,一般得到一系列的Camera.Size,我將其保存在一個鏈表中,即List<android.hardware.Camera.Size>中,由于對分辨率沒什么強(qiáng)制性要求,通常就直接取第一個分辨率,使用List.get(inti)來獲取大小,i為鏈表中的位置,從零開始。使用Size.width和Size.height來獲取該大小尺寸的寬和長,將其輸入到上文提到的函數(shù)中來設(shè)置預(yù)覽的大小。調(diào)用Camera的setDisplayOrientation(intvar1),進(jìn)行預(yù)覽角度。如上圖所示,Camera的圖像數(shù)據(jù)來源于攝像頭的,而這個攝像頭在被固定到手機(jī)上后會被默認(rèn)選擇一個方向,一般為手機(jī)向左橫放。又因為手機(jī)的屏幕可以進(jìn)行任意角度旋轉(zhuǎn),這樣就會導(dǎo)致人眼所看到的圖像與手機(jī)攝像頭顯示的頭像就會產(chǎn)生一定的誤差,用戶就不一定看到正確的預(yù)覽界面,也就是人眼所見與你的預(yù)覽界面不一致,因此需要根據(jù)手機(jī)屏幕所在的方向來設(shè)置正確的預(yù)覽方向。對于橫屏的應(yīng)用軟件,其方向與手機(jī)系統(tǒng)攝像頭默認(rèn)的方向一致,因此不用做額外的修改,但對于豎屏應(yīng)用軟件來說,則需要進(jìn)行方向修正,來確保方向一致,且前后攝像頭也不一樣,后置攝像頭只需要修改一下預(yù)覽方向,而前置攝像頭顯示的是鏡像圖像需要進(jìn)行水平翻轉(zhuǎn),而不需要修改方向。因此創(chuàng)建一個函數(shù)專門為這個調(diào)整預(yù)覽方向做處理,首先通過Camera自帶的函數(shù)activity.getWindowManager().getDefaultDisplay().getRotation()獲取手機(jī)系統(tǒng)現(xiàn)在的方向,通過Camera.getCameraInfo(cameraId,info)獲取攝像頭參數(shù)信息,當(dāng)判斷攝像頭朝向為前置攝像頭時,取360度-攝像頭方向的角度-手機(jī)系統(tǒng)當(dāng)前的角度;如果是攝像頭朝向是后置攝像頭,則取360度+攝像頭方向角度+手機(jī)系統(tǒng)當(dāng)前的角度。調(diào)用Camera的setParameters(Camera.Parametersparams),并將通過上面幾個步驟設(shè)置好的Parameters對象作為輸入?yún)?shù)傳入,這樣就可完成了對攝像頭的一些關(guān)鍵的參數(shù)設(shè)置。activity_main.xml中編寫用來預(yù)覽的SurfaceView以及在AndroidManifest.xml中添加攝像頭權(quán)限及聚焦權(quán)限,例如:<uses-permissionandroid:name="android.permission.CAMERA"/><uses-featureandroid:name="android.hardware.camera"/><uses-featureandroid:name="android.hardware.camera.autofocus"/>6、調(diào)用Camera的setPreviewTexture(SurfaceTexturevar1)來設(shè)置預(yù)覽的窗口,函數(shù)內(nèi)的參數(shù)為之前在activity_main.xml中編寫用來預(yù)覽的SurfaceView,并對其取一個ID名,調(diào)用findViewById(R.id.xxxxx),xxxxx即取得ID名,便可獲取到用來預(yù)覽的SurfaceView,最后調(diào)用Camerade的startPreview()函數(shù)開啟預(yù)覽,預(yù)覽的啟動過程全部完成了。7、在應(yīng)用程序終止時,要調(diào)用Camera的stopPreview()函數(shù)停止預(yù)覽,并且使用Camera.release()來釋放資源,避免出現(xiàn)攝像頭等資源沒有被使用卻仍在占用的情況,會導(dǎo)致資源浪費。3.3載入模型修改build.gradle(Module:app)內(nèi)容。這一步是為了載入tensorflow模塊,以便編譯器能夠識別。以Android的形式顯示文件內(nèi)容,在GradleScripts目錄下就會找到build.gradle(Module:app),雙擊打開,在其末尾空白處,另起一行,添加以下內(nèi)容:allprojects{repositories{jcenter()}}dependencies{compile'org.tensorflow:tensorflow-android:+'}測試一下,新建一個類,在里面添加屬性,如下:TensorFlowInferenceInterfaceten;看看是否會出現(xiàn)錯誤,如果沒有,就說明tensorflow模塊已經(jīng)載入成功,系統(tǒng)可以成功識別;如果不能,就說明模塊沒有載入,可以去官網(wǎng)找找資看看是哪一步出錯,還是環(huán)境沒配置好。在main文件夾下創(chuàng)建assets文件夾,將模型文件導(dǎo)入。在Project顯示形式下,在app.src.main文件夾下右鍵,在目錄中選擇new->Directory,取名為assets,將之前訓(xùn)練好的模型,用快捷鍵Ctrl+C,Ctrl+V復(fù)制粘貼進(jìn)來就可以了。創(chuàng)建調(diào)用MTCNN的類,使系統(tǒng)能夠正確調(diào)用該模型。ⅰ創(chuàng)建MTCNN的有參構(gòu)造函數(shù)MTCNN(AssetManageram)有參構(gòu)造函數(shù)主要兩個作用:獲取AssetManager和加載模型。Android應(yīng)用程序的資源可以分為兩大類:assets和res,assets類資源可以以任何的方式進(jìn)行組織,而這些文件最后會被原封不動的地打包在APK文件中。由于我們將MTCNN模型文件放入assets文件夾下,如果我們需要在應(yīng)用程序中訪問或者調(diào)用這些文件,就需要獲取Android資源管理框架,即AssetManager來訪問它。調(diào)用TensorFlowInferenceInterface(AssetManagerassetManager,Stringmodel),初始化TensorFlowInferenceInterface對象,根據(jù)指定的model創(chuàng)建一個本地的Tensorflowsession。ⅱ創(chuàng)建函數(shù)detectFaces(Bitmapbitmap,intminFaceSize),用來調(diào)用模型識別人臉,并輸出人臉坐標(biāo)鏈表首先輸入?yún)?shù)有兩個:bitmap要處理的圖片,minFaceSize最小的人臉像素值調(diào)用PNet函數(shù),獲取經(jīng)過PNet神經(jīng)網(wǎng)絡(luò)篩選出來的疑似人臉區(qū)域鏈表Vector<Box>boxes。調(diào)用square_limit對輸出的疑似人臉區(qū)域進(jìn)行微調(diào),使人臉區(qū)域保持為原先區(qū)域的最大正方形。調(diào)用RNet函數(shù),將經(jīng)過PNet過濾后的疑似人臉區(qū)域鏈表代入,輸出經(jīng)過RNet神經(jīng)網(wǎng)絡(luò)篩選出來的更加準(zhǔn)確的人臉區(qū)域鏈表Vector<Box>boxes。再次調(diào)用square_limit進(jìn)行疑似人臉區(qū)域調(diào)整,微調(diào)后為原先最大正方形最后調(diào)用ONet函數(shù),將經(jīng)過RNet過濾后的疑似人臉區(qū)域鏈表代入,輸出最終的人臉區(qū)域鏈表。ⅲ創(chuàng)建PNet(Bitmapbitmap,intminFaceSize)函數(shù),輸入為bitmap要處理的圖片,minFaceSize最小的人臉像素值,輸出為疑似人臉區(qū)域的坐標(biāo)鏈表。建立一個while循環(huán),只有當(dāng)minFaceSize>bitmap長和寬中最小值,跳出循環(huán),每循環(huán)一次,minFaceSize=minFaceSize/0.7。在循環(huán)中,調(diào)用bitmapResize函數(shù),對輸入圖像進(jìn)行Resize,輸出放大后的圖像。調(diào)用PNetForward函數(shù),運行PNet神經(jīng)網(wǎng)絡(luò),使用inferenceInterface.feed輸入?yún)?shù),inferenceInterface.run運行,inferenceInterface.fetch取出結(jié)果,最后輸出兩個float二維數(shù)組。調(diào)用generateBoxes對輸出的二維數(shù)組進(jìn)行數(shù)據(jù)解析,將結(jié)果保存至類型為Box的鏈表中。調(diào)用非極大值抑制函數(shù),抑制值為0.7,去除不符合要求的Box。調(diào)用邊框區(qū)域回歸函數(shù),進(jìn)行區(qū)域坐標(biāo)化整,將數(shù)值一律化為整型。最后輸出處理完后的疑似人臉區(qū)域的坐標(biāo)鏈表。ⅳ創(chuàng)建RNet(Bitmapbitmap,Vector<Box>boxes)函數(shù)輸入為bitmap要處理的圖片,boxes是經(jīng)過PNet神經(jīng)網(wǎng)絡(luò)辨識后的疑似人臉區(qū)域坐標(biāo)鏈表,輸出為疑似人臉區(qū)域的坐標(biāo)鏈表。調(diào)用crop_and_resize截取boxes中指定的矩形框,并將其Resize到24*24大小,將處理后的數(shù)據(jù)存入浮點型的一維數(shù)組中。調(diào)用RNetForward函數(shù),運行RNet神經(jīng)網(wǎng)絡(luò),使用inferenceInterface.feed輸入?yún)?shù),inferenceInterface.run運行,inferenceInterface.fetch取出結(jié)果,得到類型為Box的鏈表。用非極大值抑制函數(shù),抑制值為0.7,去除不符合要求的Box。調(diào)用邊框區(qū)域回歸函數(shù),進(jìn)行區(qū)域坐標(biāo)化整,將數(shù)值一律化為整型。最后輸出處理完后的疑似人臉區(qū)域的坐標(biāo)鏈表。ⅵ創(chuàng)建ONet(Bitmapbitmap,Vector<Box>boxes)函數(shù)輸入為bitmap要處理的圖片,boxes是經(jīng)過RNet神經(jīng)網(wǎng)絡(luò)辨識后的疑似人臉區(qū)域坐標(biāo)鏈表,輸出為疑似人臉區(qū)域的坐標(biāo)鏈表。調(diào)用crop_and_resize截取boxes中指定的矩形框,并將其Resize到48*48大小,將處理后的數(shù)據(jù)存入浮點型的一維數(shù)組中。調(diào)用RNetForward函數(shù),運行RNet神經(jīng)網(wǎng)絡(luò),使用inferenceInterface.feed輸入?yún)?shù),inferenceInterface.run運行,inferenceInterface.fetch取出結(jié)果,得到類型為Box的鏈表。用非極大值抑制函數(shù),抑制值為0.7,去除不符合要求的Box。調(diào)用邊框區(qū)域回歸函數(shù),進(jìn)行區(qū)域坐標(biāo)化整,將數(shù)值一律化為整型。最后輸出處理完后的疑似人臉區(qū)域的坐標(biāo)鏈表。ⅶ創(chuàng)建nms(Vector<Box>boxes,floatthreshold,Stringmethod)函數(shù)。非極大值抑制函數(shù),輸入為疑似人臉區(qū)域坐標(biāo)鏈表,抑制值及方法標(biāo)志,輸出為疑似人臉區(qū)域的坐標(biāo)鏈表。主要對比思想就是兩兩對比,通過雙重FOR循環(huán)進(jìn)行對比,計算各自的面積以及重復(fù)的面積,計算IOU的公式為:IOU=甲乙重復(fù)的面積/(甲面積+乙面積-甲乙重復(fù)面積)如果IOU比抑制值小的,則對其進(jìn)行刪除;如果IOU比抑制值大的,則留下。ⅷ創(chuàng)建BoundingBoxReggression(Vector<Box>boxes)函數(shù)。邊緣回歸函數(shù),輸入為疑似人臉區(qū)域坐標(biāo)鏈表,輸出為疑似人臉區(qū)域坐標(biāo)鏈表。使用FOR循環(huán)進(jìn)行提取單個人臉區(qū)域坐標(biāo),將左上坐標(biāo)的橫坐標(biāo)與右下坐標(biāo)的橫坐標(biāo)相減計算寬,將左下坐標(biāo)的縱坐標(biāo)與右上坐標(biāo)的縱坐標(biāo)相減計算高。對其進(jìn)行整型化處理。3.4實現(xiàn)菜單1、創(chuàng)建menu,在Android顯示中,選擇res右鍵,選擇NewResourceDirectory,類型選擇menu,就可以創(chuàng)建menu,在menu.xml中編輯菜單欄,例如:<itemandroid:id="@+id/menu_original"android:title="原圖像"/>調(diào)用onCreateOptionsMenu函數(shù),每次Activity一創(chuàng)建就會執(zhí)行,一般只執(zhí)行一次,創(chuàng)建并保留Menu的實例。編輯菜單點擊事件onOptionsItemSelected,當(dāng)每次menu菜單項被點擊時,該方法就會被執(zhí)行一次,。使用switch根據(jù)MenuItem的不同進(jìn)入不同的case響應(yīng)事件。3.5實現(xiàn)渲染當(dāng)點擊菜單對應(yīng)的選項,觸發(fā)onOptionsItemSelected,通過Switch設(shè)置相應(yīng)的濾鏡類型值,傳給渲染類CameraRenderer,CameraRenderer創(chuàng)建新的FilterEngine,F(xiàn)ilterEngine創(chuàng)建新的Progress并根據(jù)傳來的值選擇相應(yīng)片著色器,將頂點著色器和片著色器附在Progress上,鏈接Progress并告訴OpenGLES使用此program。3.6實現(xiàn)美顏3.6.1美白使用texture2D獲取自身的rgba的四維向量值,將值乘以(1+美白進(jìn)度條的進(jìn)度值/200),使得亮度提升,達(dá)到美白效果。3.6.2磨皮使用texture2D獲取自身的rgba的四維向量值,首先取出像素的green通道值,對其進(jìn)行高反差保留,進(jìn)行強(qiáng)光處理處理,計算像素灰度值,將灰度值進(jìn)行次方,將原圖像加上高反差保留圖像乘次方值。3,6.3紅潤texture2D獲取自身的rgba的四維向量值,將值的平方乘3-值的三次方乘2,由于r的值處于0~1之間,如圖所示會使小于0.5的值變小,增大0.5的值,從而使得圖像變紅潤。3.6.4實現(xiàn)Android拖動條(SeekBar)在activity_main.xml布局中定義拖動條,通過findViewById獲取SeekBar,設(shè)置setOnSeekBarChangeListener監(jiān)聽拖動條,onProgressChanged調(diào)用getProgress傳遞拖動條的值給CameraRenderer,CameraRenderer將值傳遞給片著色器。3.7實現(xiàn)濾鏡3.7.1模糊濾鏡texture2D獲取自己周圍九個點的rgba的四維向量值,與0.0950.1180.0950.1180.1480.1180.0950.1180.095進(jìn)行卷積,將加權(quán)和的四維向量值賦給gl_FragColor。3.7.2黑白濾鏡texture2D獲取自身的rgba的四維向量值,將gl_FragColor的rgb值賦值為0.3*r+0.59*g+0.11*b。3.7.3四分濾鏡texture2D獲取自身的rgba的四維向量值,將其縮小為原來的四分之一,再進(jìn)行對應(yīng)的依次復(fù)制到其他剩余的地方。如下圖,先將整副圖像縮小至原來的四分之一即A區(qū)域,之后依次復(fù)制至B、C、D三個區(qū)域。ABCD結(jié)論我將美顏分為三部分:美白、磨皮和紅潤,其中磨皮算法相對于其他來講,應(yīng)該是比較難的了,我第一次實現(xiàn)磨皮的想法就是直接作高斯模糊然后銳化,效果一般且銳化效果明顯邊緣突出導(dǎo)致整個畫面不自然。之后,我就去網(wǎng)上查找相關(guān)資料,發(fā)現(xiàn)大部分磨皮算法都用到了雙邊濾波,由于其模糊保留邊緣,因此磨皮效果好。不過我嘗試了一下,由于處理時間過長,250ms一幀,導(dǎo)致畫面很卡,實時幀率在4-5之間,無法滿足30fps的要求,不過可以個人感覺用來處理照片還是不錯的。我就想能不能改進(jìn)一下,經(jīng)過嘗試發(fā)現(xiàn)還不如原來的,去網(wǎng)上捜了下,發(fā)現(xiàn)有個雙邊濾波的改進(jìn)版快速雙邊濾波,解決了處理時間長的問題,不過沒看懂就沒用了。最后嘗試的是高反差保留,這個算法最大的特點用與原圖像減去高斯模糊和強(qiáng)光處理的圖像得到的只留下邊緣信息,且滿足30fps,美顏效果不錯,就是去痘效果不太明顯。經(jīng)過查找資料,了解到green中含有信息較多,對green信息了個次方處理,會不會去痘效果好些,嘗試了一下,果然還不錯,就是感覺拉拖動條的時候變化不明顯。通過雙邊濾波處理實現(xiàn)美顏效果明顯,但是每一幀處理時間太長,達(dá)到250ms一幀,無法實現(xiàn)實時美顏,因此我查詢網(wǎng)上資料,發(fā)現(xiàn)有一種快速雙邊濾波,是在雙邊濾波的基礎(chǔ)上進(jìn)行的改進(jìn),克服了雙邊濾波處理時間長的缺點。致謝主要參考文獻(xiàn)張志強(qiáng),王萬玉.一種改進(jìn)的雙邊濾波算法[J].中國圖象圖形學(xué)報,2019,14(3):443-447.ZhangK,ZhangZ,LiZ,etal.JointFaceDetectionandAlignmentUsingMultitaskCascadedConvolutionalNetworks[J].IEEESignalProcessingLetters,2016,23(10):1499-1503.附錄1、標(biāo)簽處理函數(shù)deftransformTxt(original_txt_path,final_txt_path):'''對TXT文件中l(wèi)abel信息進(jìn)行處理,留下文件路徑和所有的人臉box:paramoriginal_txt_path:原始txt文件地址:paramfinal_txt_path:處理后txt文件地址:return:bool值True或False'''#以寫入的方式打開文件w_file=open(final_txt_path,'w')#以只讀的方式打開txt文件withopen(original_txt_path,'r')asr_file:lines=r_file.readlines()path_flag=Falseface_num_flag=Falseforlineintqdm(lines):#去除頭尾空格line=line.strip()#判斷是否是文件路徑名if'jpg'inline:path_flag=Trueseek_point=w_file.tell()w_file.write(str(line)+str(''))continue#獲取人臉數(shù)量ifpath_flag==True:path_flag=Falseface_sum=lineifint(face_sum)==0:face_num_flag=Truecontinue#處理人臉數(shù)量為零的圖片ifface_num_flag==True:#刪除該行w_file.seek(seek_point,0)face_num_flag=Falsecontinue#判斷是否是坐標(biāo)x,y,w,hifint(face_sum)>0:face_sum=int(face_sum)-1result=line.split('')foriinrange(4):ifi<2:w_file.write(str(result[i]))else:#保留兩位小數(shù)sum=float(result[i-2])+float(result[i])w_file.write(str(sum))w_file.write('')ifint(face_sum)==0:w_file.write('\n')continuew_file.close()returnTrue2、IOU計算函數(shù)defIOU(box,boxes):'''裁剪的box和圖片所有人臉box的iou值:parambox:裁剪的box,當(dāng)box維度為4時表示box左上右下坐標(biāo),維度為5時,最后一維為box的置信度:paramboxes:圖片所有人臉box,[n,4]:return:iou值,[n,]'''#計算截取的box面積box_area=(box[2]-box[0]+1)*(box[3]-box[1]+1)#boxes面積,[n,](第3列-第1列+1)*(第4列-第2列+1)boxes_area=(boxes[:,2]-boxes[:,0]+1)*(boxes[:,3]-boxes[:,1]+1)#計算重疊部分左上右下坐標(biāo)左上取最大值,右下取最小值x1=np.maximum(box[0],boxes[:,0])y1=np.maximum(box[1],boxes[:,1])x2=np.minimum(box[2],boxes[:,2])y2=np.minimum(box[3],boxes[:,3])#重疊部分長寬width=n

溫馨提示

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

評論

0/150

提交評論