![基于CNN的手勢(shì)游戲控制技術(shù)與開發(fā)實(shí)現(xiàn)_第1頁](http://file4.renrendoc.com/view11/M00/13/35/wKhkGWX1TuqADHC6AAJDIv6WxhA043.jpg)
![基于CNN的手勢(shì)游戲控制技術(shù)與開發(fā)實(shí)現(xiàn)_第2頁](http://file4.renrendoc.com/view11/M00/13/35/wKhkGWX1TuqADHC6AAJDIv6WxhA0432.jpg)
![基于CNN的手勢(shì)游戲控制技術(shù)與開發(fā)實(shí)現(xiàn)_第3頁](http://file4.renrendoc.com/view11/M00/13/35/wKhkGWX1TuqADHC6AAJDIv6WxhA0433.jpg)
![基于CNN的手勢(shì)游戲控制技術(shù)與開發(fā)實(shí)現(xiàn)_第4頁](http://file4.renrendoc.com/view11/M00/13/35/wKhkGWX1TuqADHC6AAJDIv6WxhA0434.jpg)
![基于CNN的手勢(shì)游戲控制技術(shù)與開發(fā)實(shí)現(xiàn)_第5頁](http://file4.renrendoc.com/view11/M00/13/35/wKhkGWX1TuqADHC6AAJDIv6WxhA0435.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
摘要人機(jī)交互是計(jì)算機(jī)領(lǐng)域的熱門話題,計(jì)算機(jī)的發(fā)展不能只專注于硬件提升,在人機(jī)交互方面尤也為重要,如今的交互技術(shù)也是日新月異。手勢(shì)識(shí)別技術(shù)作為一種比較新的交互技術(shù),它可以幫助人們更便捷的操控軟件,加快文檔處理效率。手勢(shì)識(shí)別技術(shù)按輸入設(shè)備的不同可分為基于數(shù)據(jù)手套及其他硬件的手勢(shì)識(shí)別和基于計(jì)算機(jī)視覺的手勢(shì)識(shí)別兩種。手勢(shì)的種類繁多,因而使計(jì)算機(jī)在進(jìn)行手勢(shì)識(shí)別分類操作的時(shí)候顯得比較困難,隨著計(jì)算機(jī)領(lǐng)域的硬件性能的提升,加上更加適合的軟件算法,許多之前不可能解決的問題變成了可能。業(yè)界手勢(shì)識(shí)別大致分為靜態(tài)手勢(shì)識(shí)別和動(dòng)態(tài)手勢(shì)識(shí)別兩種。第一種是計(jì)算機(jī)只通過識(shí)別手部的靜態(tài)圖像來確認(rèn)用戶的指令。第二種是計(jì)算機(jī)通過識(shí)別手部形態(tài),并且識(shí)別手部運(yùn)動(dòng)軌跡來精確用戶指令。針對(duì)靜態(tài)手勢(shì),本項(xiàng)目提出了一種基于CNN的有效提取方法,經(jīng)過opencv庫調(diào)取攝像頭得到手的輪廓,最后,通過輪廓匹配得到識(shí)別結(jié)果。在各種燈光下進(jìn)行重復(fù)測(cè)試,并調(diào)整系統(tǒng)參數(shù)。實(shí)驗(yàn)表明,該方案來提取手勢(shì)并實(shí)現(xiàn)游戲控制是可行的,取得了良好的游戲體驗(yàn)效果。關(guān)鍵詞:手勢(shì)識(shí)別CNNOpencv游戲控制中北大學(xué)信息商務(wù)學(xué)院2015屆畢業(yè)設(shè)計(jì)說明書廣東東軟學(xué)院本科畢業(yè)設(shè)計(jì)(論文) 廣東東軟學(xué)院本科畢業(yè)設(shè)計(jì)(論文) 第I頁共II頁 AbstractHuman-computerinteractionisahottopicinthefieldofcomputers.Thedevelopmentofcomputerscannotonlyfocusonhardwareimprovement,butalsoisparticularlyimportantintermsofhuman-computerinteraction.Today'sinteractiontechnologyisalsochangingwitheachpassingday.Gesturerecognitiontechnologyasarelativelynewinteractivetechnology,itcanhelppeoplemoreeasilycontrolthesoftware,speeduptheefficiencyofdocumentprocessing.Gesturerecognitiontechnologycanbedividedintogesturerecognitionbasedondataglovesandotherhardwareandgesturerecognitionbasedoncomputervisionaccordingtodifferentinputdevices.Therearemanytypesofgestures,whichmakesitdifficultforcomputerstoperformgesturerecognitionandclassificationoperations.Withtheimprovementofhardwareperformanceinthecomputerfieldandmoresuitablesoftwarealgorithms,manyproblemsthatwereimpossibletosolvebeforebecamepossible.Gesturerecognitionintheindustryisroughlydividedintostaticgesturerecognitionanddynamicgesturerecognition.Thefirstisthatthecomputeronlyconfirmstheuser'sinstructionsbyrecognizingthestaticimageofthehand.Thesecondisthatthecomputercanaccuratelydetermineuserinstructionsbyrecognizingtheshapeofthehandandrecognizingthemovementtrajectoryofthehand.Forstaticgestures,thisprojectproposesaneffectiveCNN-basedextractionmethod.Thecameraisobtainedthroughtheopencvlibrarytoobtainthecontourofthehand,andfinally,therecognitionresultisobtainedthroughcontourmatching.Repeatthetestundervariouslightsandadjustthesystemparameters.Experimentsshowthatthisschemeisfeasibletoextractgesturesandachievegamecontrol,andhasachievedgoodgameexperienceeffects.Keywords:\o"添加到收藏夾"GesturerecognitionCNNOpencvGamecontrol廣東東軟學(xué)院本科畢業(yè)設(shè)計(jì)(論文)目錄摘要 3Abstract 4第一章緒論 41.1研究背景與意義 41.2國內(nèi)外研究現(xiàn)狀及分析 51.2.1國外研究現(xiàn)狀 51.2.2國內(nèi)研究現(xiàn)狀 51.3文本主要工作和內(nèi)容 61.4文本章節(jié)安排 6第二章基于Pygame的小游戲開發(fā) 72.1Pygame簡(jiǎn)介 72.2《奔跑吧恐龍》游戲開發(fā) 72.2.1搭建python3.6.8實(shí)驗(yàn)環(huán)境 72.2.2加載pygame模塊 82.2.3實(shí)現(xiàn)小游戲主窗體 92.2.4游戲背景的滾動(dòng) 102.2.5加入障礙物仙人掌 122.2.6加入恐龍?zhí)S 142.2.7事件監(jiān)聽 162.2.8檢測(cè)是否碰撞 172.2.9計(jì)分功能 182.2.10加入游戲結(jié)束頁面 20第三章卷積神經(jīng)網(wǎng)絡(luò)理論介紹 213.1人工神經(jīng)網(wǎng)絡(luò)概念 213.2卷積神經(jīng)網(wǎng)絡(luò) 223.2.1卷積層(Convolutionallayer) 223.2.2 線性整流層(RectifiedLinearUnitslayer) 233.2.3 池化層(Poolinglayer) 243.2.4全連接層(Fully-Connectedlayer) 253.3五大深度學(xué)習(xí)框架介紹 253.3.1TensorFlow 253.3.2Pytorch 263.3.3飛槳 263.3.4Keras 263.3.5Theano 26第四章神經(jīng)網(wǎng)絡(luò)搭建 274.1搭建神經(jīng)網(wǎng)絡(luò)環(huán)境 274.2數(shù)據(jù)采集 284.2.1Opencv庫 284.2.2灰度圖片 284.3神經(jīng)網(wǎng)絡(luò)搭建 304.4測(cè)試網(wǎng)絡(luò) 334.4實(shí)時(shí)游戲效果 37第五章總結(jié)與展望 385.1工作總結(jié) 385.2展望與不足 38參考文獻(xiàn) 39致謝 40緒論1.1研究背景與意義時(shí)間來到了2020年,計(jì)算機(jī)的性能有了飛躍的提升,計(jì)算機(jī)在各個(gè)領(lǐng)域都得到了普及,使得人機(jī)交互技術(shù)越來越成為計(jì)算機(jī)領(lǐng)域的研究熱點(diǎn),手勢(shì)識(shí)別就是其中之一。將手勢(shì)識(shí)別作為一種交互技術(shù)能應(yīng)用到很多場(chǎng)景中,因此,研究手勢(shì)識(shí)別技術(shù)擁有很好的前景。平時(shí)通過鍵盤和觸控實(shí)現(xiàn)的人機(jī)交互技術(shù)在手勢(shì)識(shí)別技術(shù)面前,顯得不那么高端,手勢(shì)識(shí)別技術(shù)應(yīng)用計(jì)算機(jī)視覺收集手部信息,通過程序轉(zhuǎn)化輸出識(shí)別結(jié)果,達(dá)到交互效果。但是,手勢(shì)變化多樣,使得手勢(shì)識(shí)別成為一項(xiàng)極具挑戰(zhàn)性的研究項(xiàng)目。目前的手勢(shì)識(shí)別技術(shù)日趨成熟,有的是基于手環(huán)感知肌肉抖動(dòng)信息來完成手勢(shì)識(shí)別的,有的是通過指套的形式,結(jié)合距離傳感器來實(shí)現(xiàn)手勢(shì)識(shí)別,這兩種比較依賴硬件,還有一種是通過計(jì)算機(jī)視覺來實(shí)現(xiàn),對(duì)硬件要求不高,但可以達(dá)到相近的水平,為了達(dá)到預(yù)期的操作效果和開發(fā)速度,本文中引入了微軟的Opencv函數(shù)庫和CNN(卷積神經(jīng)網(wǎng)絡(luò))。手勢(shì)識(shí)別的意義在于通過手勢(shì)隔空操作,不用去觸碰操作實(shí)體,為人機(jī)交互增添新的方式。圖象處理和圖象識(shí)別是實(shí)現(xiàn)手勢(shì)識(shí)別技術(shù)的前提,手勢(shì)識(shí)別技術(shù)的發(fā)展,使計(jì)算機(jī)可以完成很多看似不可能的任務(wù)。在很多領(lǐng)域中,手勢(shì)識(shí)別都起著很大的作用,下面列出了一些在手勢(shì)識(shí)別中有應(yīng)用前景的領(lǐng)域。在視頻直播領(lǐng)域引入手勢(shì)識(shí)別。直播已成為大眾娛樂項(xiàng)目之一,不光是直播的內(nèi)容更加豐富多彩了,各種直播特效讓屏幕內(nèi)容眼花繚亂,手勢(shì)識(shí)別在其中的作用也非同小可,主播可以在不操作鍵盤,直接通過手勢(shì)來使用各種直播特效來吸引觀眾的眼球。在物聯(lián)網(wǎng)領(lǐng)域引入手勢(shì)識(shí)別技術(shù)。手勢(shì)控制開關(guān)燈,手勢(shì)控制電視,手勢(shì)拍照,手勢(shì)喚醒智能終端等等,增加了人機(jī)互動(dòng)的趣味性。在虛擬現(xiàn)實(shí)領(lǐng)域引入手勢(shì)識(shí)別。虛擬現(xiàn)實(shí)技術(shù)的不僅給我們帶來豐富的視覺體驗(yàn),手勢(shì)識(shí)別技術(shù)的加入使得它能操控虛擬世界的物品,所以手勢(shì)識(shí)別技術(shù)是虛擬現(xiàn)實(shí)技術(shù)交互中的一個(gè)重要環(huán)節(jié)。現(xiàn)如今的虛擬現(xiàn)實(shí)設(shè)備的手勢(shì)識(shí)別大多都是在硬件層面實(shí)現(xiàn)的,成本較高,要想在普通相機(jī)上挑戰(zhàn)高質(zhì)量的手指追蹤效果,難度較大。在手機(jī)領(lǐng)域引入手勢(shì)識(shí)別。隨著手機(jī)性能的提升,圖像處理能力也得到了相應(yīng)的提高,越來越多的手機(jī)廠商也開始注重手機(jī)的AI性能,像谷歌的pixe系列,華為的高端系列,小米等,特別是華為的EMUI10智慧全連接系統(tǒng),加入了系統(tǒng)級(jí)別的手勢(shì)操作,為手機(jī)操作增添了不少樂趣。圖1-1手勢(shì)識(shí)別應(yīng)用場(chǎng)景1.2國內(nèi)外研究現(xiàn)狀及分析1.2.1國外研究現(xiàn)狀21世紀(jì)初,手勢(shì)識(shí)別技術(shù)就得到了技術(shù)人員的廣泛研究,特別是基于計(jì)算機(jī)視覺的手勢(shì)識(shí)別。2004年韓國Inda大學(xué)和KoreaPolytechnic大學(xué)的JongShillLee、YoungJooLee等人用熵分析法從背景復(fù)雜的視頻流中分割出手勢(shì)區(qū)域并進(jìn)行手勢(shì)識(shí)別[1]。利用freeman碼技術(shù)進(jìn)行手部邊緣的檢測(cè),計(jì)算出手勢(shì)中心到手部邊緣的距離。它在六種手勢(shì)的分類識(shí)別上可以達(dá)到百分之九十五的識(shí)別率。2010年chendongYu等人[2]在手勢(shì)識(shí)別中采用了基于視覺的組合特征,并結(jié)合了手部面積、周長(zhǎng)、重心、面積比和長(zhǎng)寬比等特征點(diǎn),提高了手勢(shì)識(shí)別率。2014年,臉書收購了一家VR的初創(chuàng)公司,并吸收了其在手勢(shì)識(shí)別技術(shù)深耕多年的技術(shù)人員。2019年,Oculus發(fā)布了可通過四個(gè)較為廉價(jià)的攝像頭實(shí)現(xiàn)精度較高的手勢(shì)識(shí)別的V12測(cè)試版本,并開放API。1.2.2國內(nèi)研究現(xiàn)狀我國在手勢(shì)識(shí)別方面的研究與國外相比并沒有落后太多,但隨著國內(nèi)學(xué)者的努力,我們也在一步步的追趕。2006年來自中國科學(xué)技術(shù)大學(xué)和哈爾濱工業(yè)大學(xué)劉巖[3]等人,研究了基于“大小手”的實(shí)時(shí)徒手手勢(shì)識(shí)別,將雙手分為大手和小手,并根據(jù)單手的重疊情況進(jìn)行處理。他們的論文用了他們首創(chuàng)的大小手特征提取算法,實(shí)現(xiàn)了基于動(dòng)態(tài)的手勢(shì)識(shí)別技術(shù),對(duì)17種常用的手勢(shì)進(jìn)行了識(shí)別率達(dá)百分之九十四。2012年根據(jù)AdaBoost算法和光流匹配的原理,王凱等人[4]提出了一種實(shí)時(shí)手勢(shì)識(shí)別方案:只要與計(jì)算機(jī)相連,通過攝像頭讀取2D手勢(shì)視頻片段,就可以對(duì)手勢(shì)進(jìn)行更精確的識(shí)別。運(yùn)用迭代算法,對(duì)一個(gè)訓(xùn)練集訓(xùn)練多個(gè)分類器,將多個(gè)分類器再重組成一個(gè)強(qiáng)分類器,實(shí)現(xiàn)手勢(shì)的分類識(shí)別。最近幾年上線的百度AI開放平臺(tái)提供了多種手勢(shì)識(shí)別產(chǎn)品,通過API連接可以識(shí)別多種常見手勢(shì),如抱拳,停止,比心,數(shù)字,剪刀手等。1.3文本主要工作和內(nèi)容本文的研究重點(diǎn)在于:研究并開發(fā)基于Pygame框架的小游戲開發(fā)。研究CNN的網(wǎng)絡(luò)結(jié)構(gòu),采用一種合適的模型結(jié)構(gòu)進(jìn)行訓(xùn)練。研究用合適的分類算法,用于提高手勢(shì)識(shí)別的準(zhǔn)確率。研究使用何種方式進(jìn)行手勢(shì)分類識(shí)別。1.4文本章節(jié)安排第一章:緒論。介紹了本論文研究背景與研究意義,分析國內(nèi)外關(guān)于手勢(shì)識(shí)別的研究歷史與各大廠商研究現(xiàn)狀,并撰寫了本文研究的主要內(nèi)容和章節(jié)安排。 第二章:基于pygame小游戲開發(fā)。本章簡(jiǎn)單介紹了pygame模塊,并開發(fā)一款基于pygame的小游戲。第三章:CNN理論介紹。本章簡(jiǎn)單介紹了CNN的結(jié)構(gòu),介紹了時(shí)下主流的幾種深度學(xué)習(xí)框架。第四章:神經(jīng)網(wǎng)絡(luò)搭建。本章編寫從搭建到設(shè)計(jì)CNN結(jié)構(gòu)再到訓(xùn)練模型的全過程,使用訓(xùn)練好的模型進(jìn)行手勢(shì)識(shí)別并操控游戲。第五章:總結(jié)與展望。首先為整個(gè)實(shí)驗(yàn)做實(shí)驗(yàn)總結(jié),簡(jiǎn)述了整個(gè)項(xiàng)目開發(fā)過程并思考了實(shí)驗(yàn)的不足之處,以及改進(jìn)方向以供后續(xù)開發(fā)?;赑ygame的小游戲開發(fā)2.1Pygame簡(jiǎn)介Pygame是一個(gè)用于游戲開發(fā)的跨平臺(tái)的Python模塊,由于基于SDL,所以他有很多多媒體相關(guān)函數(shù)。對(duì)于Python程序,使用Pygame模塊可以創(chuàng)建功能豐富的游戲和各式各樣的多媒體程序,并且因?yàn)镻ygame模塊的部分是由C語言開發(fā)而成,所以它執(zhí)行起來并不算慢,它還擁有Python語言的面向?qū)ο?、腳本編程和高度可移植等特性。當(dāng)你再開發(fā)游戲時(shí)使用pygame模塊,你會(huì)發(fā)現(xiàn)十分簡(jiǎn)單,每一個(gè)控件都是一個(gè)相對(duì)獨(dú)立的surface對(duì)象。Surface對(duì)象的作用是在Pygame中顯示圖像,該對(duì)象可以將一個(gè)圖像繪制到另一個(gè)圖像的上方,并設(shè)置圖像的透明度。并且Pygame中的Rect類能儲(chǔ)和處理矩形對(duì)象,比如文本框控件,Button控件等。React類能定義組件的參數(shù),這樣可以讓開發(fā)者更加容易地使用圖像的屬性來完成容器中的定位布局。2.2《奔跑吧恐龍》游戲開發(fā)2.2.1搭建python3.6.8實(shí)驗(yàn)環(huán)境如圖2-1,本小游戲用python3.6.8作為基礎(chǔ)實(shí)驗(yàn)環(huán)境。Python是一種高級(jí)編程語言,它設(shè)計(jì)得非常容易閱讀,而且是可移植的,不同的操作系統(tǒng)之間只需要重新編譯即可完美運(yùn)行,它還有豐富的科學(xué)計(jì)算庫,并且是免費(fèi)開源的。Python是一種交互式語言,可以使用眾多開發(fā)工具來編寫和調(diào)試程序。Python支持面向?qū)ο缶幊?,?duì)于初級(jí)程序員來說,Python是一門很棒的語言,它支持簡(jiǎn)單的文字處理,用flash框架搭建web后端框架,用Pygame編寫高性能游戲。由于語法簡(jiǎn)單,對(duì)初級(jí)程序員友好,python成為當(dāng)下熱門編程語言之一。由于各大廠都有用Python的項(xiàng)目,所以Python的生態(tài)也一直很好,有豐富的學(xué)習(xí)資源,完善的中文文檔,開發(fā)者社區(qū)等。圖2-1python3.6.8安裝2.2.2加載pygame模塊Pip是一款現(xiàn)代化的公共Python包管理工具,它可以用來查找、下載、安裝和卸載Python包。Pip默認(rèn)源國內(nèi)訪問比較慢,所以用國內(nèi)清華源加載,如圖2-2所示。圖2-2pip加載pygame模塊2.2.3實(shí)現(xiàn)小游戲主窗體importpygamefrompygame.localsimport*#將游戲窗口設(shè)置在顯示中心os.environ['SDL_VIDEO_CENTERED']='1'#定義一些全局變量SCREEN_WIDTH=1280SCREEN_HEIGHT=720FPS=30GROUND_HEIGHT=SCREEN_HEIGHT–70PLAY_GAME=True#初始化pygame并創(chuàng)建窗口pygame.init()window=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))pygame.display.set_caption("奔跑吧恐龍")實(shí)現(xiàn)效果如圖2-3:圖2-3《奔跑吧恐龍》主窗口2.2.4游戲背景的滾動(dòng)其實(shí)《奔跑吧恐龍》這個(gè)游戲只有背景在滾動(dòng),恐龍并沒有前移。背景由4張圖片組成,如圖2-4,并不斷向后移動(dòng)和刷新。#創(chuàng)建和移動(dòng)單個(gè)背景的類classBackground:def__init__(self,image_path,speed=10):self.image0,self.rect0=load_image(image_path,1280,720)self.image1,self.rect1=load_image(image_path,1280,720)self.rect0.bottom=SCREEN_HEIGHTself.rect1.bottom=SCREEN_HEIGHTself.rect1.left=self.rect0.rightself.speed=speeddefdraw(self):window.blit(self.image0,self.rect0)window.blit(self.image1,self.rect1)defupdate(self):self.rect0.left-=self.speedself.rect1.left-=self.speedifself.rect0.right<0:self.rect0.left=self.rect1.rightifself.rect1.right<0:self.rect1.left=self.rect0.right#使用Background類創(chuàng)建和移動(dòng)單個(gè)或多個(gè)背景classAllBackgrounds:def__init__(self,game_speed):self.background_0=Background("image/background/bg_0.png",game_speed)self.background_1=Background("image/background/bg_1.png",game_speed-7)self.background_2=Background("image/background/bg_2.png",game_speed-8)self.background_3=Background("image/background/bg_3.png",game_speed-9)defupdate_speed(self,speed):self.background_0.speed=speedself.background_1.speed=speed-7self.background_2.speed=speed-8self.background_3.speed=speed-9defdraw(self):self.background_3.draw()self.background_2.draw()self.background_1.draw()self.background_0.draw()defupdate(self):self.background_3.update()self.background_2.update()self.background_1.update()self.background_0.update()圖2-42.2.5加入障礙物仙人掌游戲的規(guī)則是恐龍?jiān)竭^仙人掌就加分,如果在跳躍或落地時(shí)碰到仙人掌則死亡,仙人掌是隨機(jī)出現(xiàn)的,如圖2-5。#創(chuàng)建和移動(dòng)障礙仙人掌的類classCactus:def__init__(self,speed=10):self.cactus_images=load_sprites("image/cactus/","cactus_",5,160,160)self.cactus_image_0,self.rect_0=self.cactus_images[0],self.cactus_images[0].get_rect()self.cactus_image_1,self.rect_1=self.cactus_images[1],self.cactus_images[1].get_rect()self.rect_0.bottom=GROUND_HEIGHT-11self.rect_0.left=SCREEN_WIDTHself.rect_1.bottom=GROUND_HEIGHT-11self.rect_1.left=self.rect_0.right+SCREEN_WIDTH/2self.speed=speedself.range_0=240self.range_1=720defget_cactus(self):current_cactus=[self.cactus_image_0,self.cactus_image_1]cactus_rect=[self.rect_0,self.rect_1]returncurrent_cactus,cactus_rectdefupdate_speed(self,speed):self.speed=speedself.range_0+=1self.range_1+=1defdraw(self):window.blit(self.cactus_image_0,self.rect_0)window.blit(self.cactus_image_1,self.rect_1)defupdate(self):self.rect_0.left-=self.speedself.rect_1.left-=self.speedifself.rect_0.right<0:temp_position=self.rect_1.right+random.randrange(self.range_0,self.range_1)iftemp_position>SCREEN_WIDTH:self.rect_0.left=temp_positionelse:self.rect_0.left=SCREEN_WIDTHtemp_index=random.randrange(0,5)self.cactus_image_0=self.cactus_images[temp_index]ifself.rect_1.right<0:temp_position=self.rect_0.right+random.randrange(self.range_0,self.range_1)iftemp_position>SCREEN_WIDTH:self.rect_1.left=temp_positionelse:self.rect_1.left=SCREEN_WIDTHtemp_index=random.randrange(0,5)self.cactus_image_1=self.cactus_images[temp_index]圖2-52.2.6加入恐龍?zhí)S這個(gè)游戲中,恐龍只有跳躍障礙物這個(gè)動(dòng)作。如圖#創(chuàng)建和恐龍?zhí)S的類classDino:def__init__(self):self.idle_images=load_sprites("image/dino/","idle_",10,220,153)self.running_images=load_sprites("image/dino/","run_",8,220,153)self.jumping_images=load_sprites("image/dino/","jump_",16,220,153)self.rect=self.idle_images[0].get_rect()self.rect.bottom=GROUND_HEIGHTself.rect.left=70self.jump_limit=GROUND_HEIGHT-290self.jump_speed=50#開始跳躍的速度self.gravity_up=4#跳躍時(shí)的變化率self.gravity_down=2#跌落時(shí)的變化率#這些索引在子畫面的圖像之間循環(huán),使恐龍看起來動(dòng)起來self.idle_index=0self.running_index=0self.jumping_index=0#這些布爾值確定應(yīng)顯示哪些圖像self.idle=Trueself.running=Falseself.jumping=Falseself.falling=False圖2-62.2.7事件監(jiān)聽整個(gè)游戲不止包含對(duì)鍵盤的監(jiān)聽,還包括鼠標(biāo)點(diǎn)按位置的監(jiān)聽等。foreventinpygame.event.get():ifevent.type==QUIT:pygame.quit()#退出pygamesys.exit()#退出程序ifevent.type==pygame.MOUSEBUTTONDOWN:mx,my=pygame.mouse.get_pos()#獲取鼠標(biāo)單擊坐標(biāo)ifgame_over:#檢查是否單擊了“playagin”按鈕ifgame_over_screen.rect.left<mx<game_over_screen.rect.rightand\game_over_screen.rect.top<my<game_over_screen.rect.bottom:play_again=Truerun=Falsekey=pygame.key.get_pressed()#按下空格鍵ifkey[K_SPACE]orkey[K_UP]:ifgame_over:play_again=Truerun=Falseelifnotdino.jumping:jump_sound.play()dino.jumping=Truedino.running=Falseifdino.idle:dino.idle=False2.2.8檢測(cè)是否碰撞 當(dāng)恐龍碰撞到障礙物仙人掌的時(shí)候,游戲結(jié)束,所以要寫一個(gè)檢測(cè)是否碰到障礙物的類。defcheck_collision(self,all_cactus):ifself.running:dino_mask=pygame.mask.from_surface(self.running_images[self.running_index])elifself.jumping:dino_mask=pygame.mask.from_surface(self.jumping_images[self.jumping_index])else:dino_mask=pygame.mask.from_surface(self.idle_images[self.idle_index])current_cactus,cactus_rect=all_cactusoffset_0=(cactus_rect[0].left-self.rect.left,cactus_rect[0].top-self.rect.top)offset_1=(cactus_rect[1].left-self.rect.left,cactus_rect[1].top-self.rect.top)collide=dino_mask.overlap(pygame.mask.from_surface(current_cactus[0]),offset_0)or\dino_mask.overlap(pygame.mask.from_surface(current_cactus[1]),offset_1)returncollide2.2.9計(jì)分功能 加入計(jì)分機(jī)制,游戲進(jìn)行的同時(shí),分?jǐn)?shù)不斷增加,且分?jǐn)?shù)實(shí)時(shí)顯示在屏幕上直至恐龍碰到仙人掌,停止計(jì)分,并將最高分寫入high_score.txt,如圖2-7。#用于在屏幕上計(jì)數(shù)和繪制分?jǐn)?shù)并將高分?jǐn)?shù)保存在文件中classScore:def__init__(self):self.high_score_image,self.rect_high=load_image("image/score/high_score.png",35,35)self.current_score_image,self.rect_current=load_image("image/score/current_score.png",35,35)self.rect_high.topright=(SCREEN_WIDTH-15,20)self.rect_current.topright=(SCREEN_WIDTH-15,65)self.high_score=0self.score=0self.load()self.high_score_achieved=Falseself.call_count=0defcount(self):ifself.call_count%2==0:self.score+=1ifself.high_score_achieved:self.high_score=self.scoreelifself.score>self.high_score:self.high_score=self.scoreself.high_score_achieved=Truescore_sound.play()self.call_count=self.call_count+1defdraw(self):window.blit(self.high_score_image,self.rect_high)window.blit(self.current_score_image,self.rect_current)draw_text(str(self.high_score),"font/monofonto.ttf",28,(19,130,98),SCREEN_WIDTH-60,20,"topright")draw_text(str(self.score),"font/monofonto.ttf",28,(19,130,98),SCREEN_WIDTH-60,65,"topright")defload(self):#載入高分try:withopen("high_score.txt","r")asfile:self.high_score=int(file.read())except(IOError,ValueError):self.high_score=0defsave(self):#保存高分ifself.high_score_achieved:withopen("high_score.txt","w")asfile:file.write(str(self.high_score))圖2-72.2.10加入游戲結(jié)束頁面當(dāng)檢測(cè)到恐龍碰撞到障礙物仙人掌后,應(yīng)該有彈出一個(gè)GameOver界面,如圖2-8。classGameOver:def__init__(self):self.replay_image,self.rect=load_image("image/game_over/replay_0.png",200,60)self.rect.center=(SCREEN_WIDTH/2,SCREEN_HEIGHT/2)defdraw(self):draw_text("GAMEOVER","font/northcliff_stencil.otf",80,(255,0,0),SCREEN_WIDTH/2,SCREEN_HEIGHT/3,"midtop")window.blit(self.replay_image,self.rect)圖2-8游戲結(jié)束畫面卷積神經(jīng)網(wǎng)絡(luò)理論介紹3.1人工神經(jīng)網(wǎng)絡(luò)概念人工神經(jīng)網(wǎng)絡(luò)(ArtificialNeuralNetwork,ANN),人為搭建的神經(jīng)網(wǎng)絡(luò),用輸入層模擬人腦的信息輸入,經(jīng)過各個(gè)神經(jīng)元的相互處理運(yùn)算,傳遞到下一層神經(jīng)元,經(jīng)過一層或多層復(fù)雜網(wǎng)絡(luò)的處理,最后輸出處理后的信息。人工神經(jīng)網(wǎng)絡(luò)使知識(shí)的表現(xiàn)形式更加有特色,智能性強(qiáng)的特點(diǎn),使它一開始就受到各學(xué)科領(lǐng)域的重視。它是一種高度非線性、可進(jìn)行復(fù)雜邏輯運(yùn)算、可以非線性關(guān)系實(shí)現(xiàn)的由多個(gè)簡(jiǎn)單元素相互聯(lián)系構(gòu)成的復(fù)雜網(wǎng)絡(luò)。人工神經(jīng)網(wǎng)絡(luò)是一個(gè)能讓計(jì)算機(jī)處理和優(yōu)化的數(shù)學(xué)模型,而生物神經(jīng)網(wǎng)絡(luò)是通過刺激,產(chǎn)生新的連接,讓信號(hào)能夠通過新的連接傳遞而形成反饋。雖然現(xiàn)在的計(jì)算機(jī)技術(shù)越來越高超,不過我們身體里的神經(jīng)系統(tǒng)經(jīng)過了數(shù)千萬年的進(jìn)化,還是獨(dú)一無二的,迄今為止,再復(fù)雜,再龐大的人工神經(jīng)網(wǎng)絡(luò)系統(tǒng),也不能替換我們的大腦,我們應(yīng)該感到自豪。人工神經(jīng)網(wǎng)絡(luò)中,各個(gè)神經(jīng)元可以表示不同的處理機(jī)制,或一些有意義的抽象模型。根據(jù)作用的不同可把神經(jīng)元分為輸入層、隱含層和輸出層三層,隱含層的層數(shù)是不固定的。輸入層接收需要處理的信息;隱含層處于輸入層和輸出層之間,一般我們?cè)谙到y(tǒng)外部是無法觀察到里面的處理過程和數(shù)據(jù)的,相當(dāng)于一個(gè)盲盒。輸出層輸出經(jīng)過多層神經(jīng)元計(jì)算后的結(jié)果;神經(jīng)元與神經(jīng)元之間的連接有一個(gè)體現(xiàn)連接強(qiáng)度的數(shù)據(jù),稱之為權(quán)值。ANN對(duì)信息的處理是并行的,同時(shí)處理多個(gè)變量,如圖3-1是包含兩層隱含層的神經(jīng)網(wǎng)絡(luò)。圖3-1簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)3.2卷積神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)(ConvolutionalNeuralNetwork,CNN)是近些年逐步興起的一種神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),它可以提取特征值進(jìn)行卷積運(yùn)算,使維度更高的特征被提取出來,減少計(jì)算量,加快信息處理能力,同時(shí)它也被應(yīng)用于視頻分析、自然語言處理、藥物研發(fā),疫情預(yù)測(cè),城市大腦等領(lǐng)域.。3.2.1卷積層(Convolutionallayer)在卷積神經(jīng)網(wǎng)絡(luò)中,卷積層的作用是提取特征,多層卷積層能提取更高維的特征,每層之間都有一個(gè)或多個(gè)卷積核(濾波器,convolutionkernel),第一層卷積層經(jīng)過卷積運(yùn)算提取低維特征值送入第二層卷積層中,不斷迭代運(yùn)算,最終輸出超高維度的特征值,前提是找到合適的卷積核。實(shí)際應(yīng)用中,首先要對(duì)原始圖片數(shù)據(jù)進(jìn)行特征提取,然后將所提取的特征輸入到全連接網(wǎng)絡(luò)。卷積能有效的將圖片特征提取出來,通常會(huì)使用一個(gè)正方形的卷積核來遍歷圖中的每個(gè)像素點(diǎn),有時(shí)為了輸出和卷積核尺寸相同的圖片,需要對(duì)圖片進(jìn)行全零填充。圖3-2模擬卷積運(yùn)算過程。圖3-2卷積運(yùn)算3.2.2 線性整流層(RectifiedLinearUnitslayer)線性整流層又稱修正線性單元,是一種人工神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù)(activationfunction),通常指代以斜坡函數(shù)及其變種為代表的非線性函數(shù)。以下列出3種常見的激活函數(shù)圖像:圖3-3relu函數(shù)圖3-4Tanh函數(shù)圖3-5Sigmoid函數(shù)它們3種激活函數(shù)的梯度特性各不相同。在飽和區(qū)域,Sigmoid函數(shù)和Tanh函數(shù)的值都無限趨近與一個(gè)固定值,也就是說梯度接近于0,這很容易引起梯度消失的問題,減慢收斂速度。當(dāng)網(wǎng)絡(luò)層數(shù)逐漸增多,梯度消失的問題就會(huì)顯現(xiàn)出來。反之,Relu函數(shù)的梯度為常數(shù)時(shí),相較于梯度趨于0的激活函數(shù),出現(xiàn)深層網(wǎng)絡(luò)的收斂問題明顯減少。Relu函數(shù)有單一的特性,與Sigmoid函數(shù)和Tanh函數(shù)相比,更符合生物大腦神經(jīng)元的特點(diǎn)。sigmoid函數(shù)和tanh函數(shù)完全可導(dǎo),特別是在輸出層,優(yōu)勢(shì)很大。3.2.3 池化層(Poolinglayer)卷積是為了將大維度的特征提取出來,將特征分割成多個(gè)區(qū)域,用不同的池化方式減少特征數(shù)量。Maxpooling可提取圖片紋理,avergepooling池化可保留背景特征,還有stochasticpooling和mixedpooling如圖3-6列舉兩種。圖3-6兩種池化方式3.2.4全連接層(Fully-Connectedlayer)全連接層將各局部特征組合成全局特征,用矩陣向量乘積計(jì)算各類別的最終輸出,它作為一個(gè)整體在卷積神經(jīng)網(wǎng)絡(luò)中起著分類作用。3.3五大深度學(xué)習(xí)框架介紹隨著硬件性能的提升,各大互聯(lián)網(wǎng)大廠也沒有停下極致開發(fā)的技術(shù)追趕,大家紛紛做出了自己的深度學(xué)習(xí)框架,廠商自己應(yīng)用的同時(shí),不忘開源精神,讓深度度學(xué)習(xí)框架迅猛發(fā)展,不少框架成為行業(yè)標(biāo)桿3.3.1TensorFlowGoogle的TensorFlow,可以說是目前工業(yè)領(lǐng)域應(yīng)用最多的深度學(xué)習(xí)框架。Intel,Nvidia,Twitter和其他一些知名的公司都在使用它。Google為了構(gòu)建了此工智能生態(tài)系統(tǒng),從基礎(chǔ)研究、AI教育到應(yīng)用實(shí)現(xiàn),花費(fèi)了大量的精力,把Tensorflow當(dāng)作Google戰(zhàn)略發(fā)展的基石。Tensorflow對(duì)較為熱門的編程語言,如Python、C++、JAVA、Go,還是JavaScript、Julia、C#,TensorFlow都提供了全方位的支持,幾乎所有開發(fā)人員都可以從熟悉的語言開始深入學(xué)習(xí)。目前,TensorFlow已經(jīng)建立起了一個(gè)活躍的社區(qū),完善的文檔系統(tǒng),極大地降低了學(xué)習(xí)成本,但社區(qū)和文檔仍以英文為主,中文支持有待加強(qiáng)。此外,TensorFlow還提供了非常直觀的可視化計(jì)算圖。該模型可以快速部署到各種硬件機(jī)器上,從高性能計(jì)算機(jī)到移動(dòng)設(shè)備,再到小型、輕型智能終端。多年來,TensorFlow1.0版本的缺點(diǎn)一直受到開發(fā)者詬病,其構(gòu)建深度學(xué)習(xí)框架需要教復(fù)雜的代碼,并且還需要反復(fù)多次地構(gòu)建靜態(tài)圖。TensorFlow2.0版本得到了很大的改善。從整體上看TensorFlow極佳深度學(xué)習(xí)框架。3.3.2PytorchFacebook創(chuàng)建的Pytorch是融合了Lua寫的Torch庫,目前已在學(xué)術(shù)界和工業(yè)界得到廣泛應(yīng)用,近期Caffe2項(xiàng)目融入到了Pytorch中,使得它擁有了很好的跨平臺(tái)性能,TensorFlow在深度學(xué)習(xí)框架領(lǐng)域中也找到了對(duì)手。經(jīng)常查閱國外深度學(xué)習(xí)論文的人會(huì)發(fā)現(xiàn),學(xué)術(shù)界對(duì)其情有獨(dú)鐘,它簡(jiǎn)潔易用的特點(diǎn),加上強(qiáng)勁的基于teasor的GPU加速,還有類似與Python的代碼風(fēng)格,十分易于閱讀,且大小只有Tensorflow的十分之一左右。Pytorch劣勢(shì)在于模型部署,TensorFlow和Pytorch越來越相似,TensorFlow加入了動(dòng)態(tài)圖架構(gòu),而Pytorch致力于其在工業(yè)界更加易用。3.3.3飛槳飛槳(PaddlePaddle),是百度于2016年開源的深度學(xué)習(xí)框架,2020年,它也迎來了1.7版本的大更新,增強(qiáng)了框架功能,全面提升預(yù)測(cè)部署能力,分布式訓(xùn)練的發(fā)布,使得其能支持千萬級(jí)規(guī)模分類任務(wù),并對(duì)參數(shù)服務(wù)器模式進(jìn)行了優(yōu)化整合,對(duì)編譯選項(xiàng)、編譯依賴以及代碼庫進(jìn)行了全面清理優(yōu)化,模型庫持續(xù)完善,優(yōu)化了整體層次結(jié)構(gòu),增加了動(dòng)態(tài)圖模型實(shí)現(xiàn),端到端開發(fā)套件和工具組件進(jìn)一步完善。[5]3.3.4KerasKeras是一個(gè)用Python編寫的高級(jí)神經(jīng)網(wǎng)絡(luò)API,它目前只支持3個(gè)后端選項(xiàng),包括TensorFlow,Theano和CNTK,Keras的開發(fā)重點(diǎn)是支持快速的實(shí)驗(yàn),能夠以最小的時(shí)延把你的想法轉(zhuǎn)換為實(shí)驗(yàn)結(jié)果,是做好研究的關(guān)鍵。[6]3.3.5TheanoTheano作為在2017年停止更新的高效深度學(xué)習(xí)Python庫,對(duì)中文用戶極不友好,沒有中文文檔。但它有媲美C的處理速度,還能使用GPU進(jìn)行計(jì)算,依舊還有很多用戶在使用它。第四章神經(jīng)網(wǎng)絡(luò)搭建4.1搭建神經(jīng)網(wǎng)絡(luò)環(huán)境Anaconda是一個(gè)開源的集包和編程環(huán)境的版本管理工具,支持主流操作系統(tǒng),它還包含了超過180個(gè)科學(xué)包和這些包的依賴項(xiàng),安裝Anaconda能極大的減少我們配置依賴環(huán)境時(shí)間,提高開發(fā)效率。圖4-1Anaconda下載頁面安裝完成后測(cè)試環(huán)境變量是否配置成功,如圖4-2??捎胏onda-V查看conda版本,調(diào)用keras需要一個(gè)后端引擎,比如TensorFlow,Theano,CNTK,建議使用TensorFlow后端。當(dāng)然,你也可以在keras的配置文件中更改backend.圖4-2測(cè)試環(huán)境是否配置成功4.2數(shù)據(jù)采集4.2.1Opencv庫Opencv(LibraryVisionSourceComputerOpen)是一個(gè)跨平臺(tái)的開源庫,在計(jì)算機(jī)視覺領(lǐng)域很受歡迎,尤其是加上了對(duì)移動(dòng)端的支持,可以在IOS和Android端無縫開發(fā),其包含了工業(yè)領(lǐng)域的所需的500多個(gè)函數(shù)包,Opencv的核心任務(wù)是計(jì)算機(jī)視覺,所以本項(xiàng)目將Opencv庫作為開發(fā)必備。4.2.2灰度圖片為了跟容易提取特征,減少計(jì)算量,且opencv的很多函數(shù)只支持單通道,所以我們盡量把采集到三原色圖片轉(zhuǎn)為灰度圖片。#保存圖片函數(shù)defsaveROIImg(img):globalcounter,saveimg,gestname,sample_numsifcounter>sample_nums:saveimg=Falsecounter=0gestname=""returncounter=counter+1name=gestname+str(counter)print("Savingimg:",name)cv2.imwrite(path+name+".png",img)#防止保存圖片過快,造成手勢(shì)無變化time.sleep(0.04)#手勢(shì)處理函數(shù)(二值掩模)defbinaryMask(frame,x0,y0,width,height):#只處理識(shí)別框部分cv2.rectangle(frame,(x0,y0),(x0+width,y0+height),(0,255,0),1)roi=frame[y0:y0+height,x0:x0+width]gray=cv2.cvtColor(roi,cv2.COLOR_BGR2GRAY)blur=cv2.GaussianBlur(gray,(5,5),2)th3=cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,11,2)ret,res=cv2.threshold(th3,minValue,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)ifsaveimg==True:saveROIImg(res)returnres采集后分類放在geskind的文件夾中,如下圖所示采集過程:圖4-3采集視角圖4-4存儲(chǔ)在geskind文件夾的部分手勢(shì)圖4.3神經(jīng)網(wǎng)絡(luò)搭建第一步初始化所需數(shù)據(jù)及創(chuàng)建存放數(shù)據(jù)集的手勢(shì)文件夾GESTURE_FOLDER="geskind"MODEL_NAME="ss_model.h5"LABEL_NAME="ss_labels.dat"data=[]labels=[]class_num=0train_num=20try:os.makedirs(GESTURE_FOLDER)exceptOSErrorase:print(GESTURE_FOLDER+'文件夾已創(chuàng)建')print('請(qǐng)將手勢(shì)圖片種類放在目錄下的geskind文件夾中')class_num=int(input('請(qǐng)輸入準(zhǔn)確的手勢(shì)種類數(shù):'))train_num=int(input('請(qǐng)輸入訓(xùn)練訓(xùn)練次數(shù):'))第二步遍歷采集到的手勢(shì)圖片,并進(jìn)行歸一化和標(biāo)簽二值化處理#遍歷手勢(shì)圖片forimage_fileinpaths.list_images(GESTURE_FOLDER):image=cv2.imread(image_file)image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)image=cv2.resize(image,(100,100))#增加維度image=np.expand_dims(image,axis=2)#獲取手勢(shì)圖片對(duì)應(yīng)名稱label=image_file.split(os.path.sep)[-2]#將標(biāo)簽和數(shù)據(jù)添加進(jìn)data和labeldata.append(image)labels.append(label)print('數(shù)據(jù)標(biāo)簽加載完成')#歸一化data=np.array(data,dtype="float")/255.0labels=np.array(labels)#測(cè)試集,數(shù)據(jù)集分離(X_train,X_test,Y_train,Y_test)=train_test_split(data,labels,test_size=0.2,random_state=0)#標(biāo)簽二值化lb=LabelBinarizer().fit(Y_train)Y_train=lb.transform(Y_train)Y_test=lb.transform(Y_test)#標(biāo)簽數(shù)據(jù)文件保存withopen(LABEL_NAME,"wb")asf:pickle.dump(lb,f)print('生成dat文件,開始構(gòu)建神經(jīng)網(wǎng)絡(luò)')第三步,選擇relu函數(shù)為激活函數(shù),創(chuàng)建一個(gè)三層池化的卷積神經(jīng)網(wǎng)絡(luò)并保存訓(xùn)練好的模型。#神經(jīng)網(wǎng)絡(luò)構(gòu)建model=Sequential()#第一層卷積池化model.add(Conv2D(32,(3,3),padding="same",input_shape=(100,100,1),activation="relu"))model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))#第二層卷積池化model.add(Conv2D(64,(3,3),padding="same",activation="relu"))model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))#第三層卷積池化model.add(Conv2D(128,(3,3),padding="same",activation="relu"))model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))#全連接層model.add(Flatten())model.add(Dense(64,activation="relu"))#防止過擬合model.add(Dropout(0.5))#輸出層,如果你只有兩個(gè)手勢(shì),用二分類sigmoidmodel.add(Dense(class_num,activation="softmax"))#建立優(yōu)化器,如果你知有兩個(gè)手勢(shì),loss用binary_pile(loss="categorical_crossentropy",optimizer=optimizers.RMSprop(lr=0.0001),metrics=["accuracy"])print('構(gòu)建成功,開始訓(xùn)練')history=model.fit(X_train,Y_train,validation_data=(X_test,Y_test),batch_size=32,epochs=train_num,verbose=1)#保存模型model.save(MODEL_NAME)print('訓(xùn)練保存完成')100次訓(xùn)練結(jié)果如圖4-5所示:圖4-5訓(xùn)練100次的結(jié)果4.4測(cè)試網(wǎng)絡(luò)測(cè)試一下訓(xùn)練好的網(wǎng)絡(luò)效果有沒有達(dá)到預(yù)期,如果沒有達(dá)到預(yù)期,則需要增加訓(xùn)練次數(shù),或者使用其他方法達(dá)到所需訓(xùn)練效果,代碼如下。minValue=70x0=400y0=200height=200width=200#手勢(shì)處理函數(shù)(二值掩模)defbinaryMask(frame,x0,y0,width,height):globalguessGesture,visualize,mod,lastgesture,saveImgcv2.rectangle(frame,(x0,y0),(x0+width,y0+height),(0,255,0),1)roi=frame[y0:y0+height,x0:x0+width]gray=cv2.cvtColor(roi,cv2.COLOR_BGR2GRAY)blur=cv2.GaussianBlur(gray,(5,5),2)th3=cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,11,2)ret,res=cv2.threshold(th3,minValue,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)returnres#模型和標(biāo)簽名MODEL_NAME="ss_model.h5"LABEL_NAME="ss_labels.dat"#加載標(biāo)簽withopen(LABEL_NAME,"rb")asf:lb=pickle.load(f)#加載神經(jīng)網(wǎng)絡(luò)model=load_model(MODEL_NAME)#打開攝像頭cap=cv2.VideoCapture(0)framecount=0fps=""#開始時(shí)間start=time.time()while(True):ret,frame=cap.read()frame=cv2.flip(frame,3)frame=cv2.resize(frame,(640,480))ifret==True:roi=binaryMask(frame,x0,y0,width,height)roi1=cv2.resize(roi,(100,100))#添加維度roi1=np.expand_dims(roi1,axis=2)roi1=np.expand_dims(roi1,axis=0)prediction=model.predict(roi1)#預(yù)測(cè)手勢(shì)gesture=lb.inverse_transform(prediction)[0]cv2.putText(frame,gesture,(100,100),cv2.FONT_HERSHEY_SIMPLEX,2,(0,255,0),2)#計(jì)算幀率framecount=framecount+1end=time.time()second=(end-start)if(second>=1):fps='FPS:%s'%(framecount)start=time.time()framecount=0#輸出fpscv2.putText(frame,fps,(10,20),cv2.FONT_HERSHEY_SIMPLEX,0.7,(0,255,0),2,1)#顯示攝像頭內(nèi)容和處理后手勢(shì)的圖像內(nèi)容cv2.imshow('Original',frame)cv2.imshow('ROI',roi)key=cv2.waitKey(5)&0xff測(cè)試效果還行,如圖4-6所示:圖4-6測(cè)試神經(jīng)網(wǎng)絡(luò)訓(xùn)練效果4.4實(shí)時(shí)游戲效果要想用手勢(shì)識(shí)別出來的結(jié)果實(shí)現(xiàn)游戲操控,我們只需要將預(yù)測(cè)結(jié)果與鍵盤事件綁定起來就可以實(shí)現(xiàn)了。ifgesture=='1':keybd_event(37)#鍵盤按下左elifgesture=='2':keybd_event(39)#鍵盤按下右elifgesture=='3':keybd_event(38)#鍵盤按上elifgesture=='none':win32api.keybd_event(38,0,win32con.KEYEVENTF_KEYUP,0)win32api.keybd_event(37,0,win32con.KEYEVENTF_KEYUP,0)win32api.keybd_event(39,0,win32con.KEYEVENTF_KEYUP,0)游戲效果如圖:圖4-7游戲中的效果圖總結(jié)與展望5.1工作總結(jié)手勢(shì)識(shí)別技術(shù),是人機(jī)交互中比較新穎的技術(shù),相信在未來,市場(chǎng)中將會(huì)出現(xiàn)越來越多基于手勢(shì)識(shí)別的產(chǎn)品。本次實(shí)驗(yàn)就是基于此基礎(chǔ),研究了基于CNN的手勢(shì)識(shí)別的游戲操控技術(shù)。本次實(shí)驗(yàn)的主要工作:開發(fā)了一款有趣的小游戲《奔跑吧,恐龍》。為了減少計(jì)算量,對(duì)數(shù)據(jù)集進(jìn)行了歸一化處理,并能自由控制數(shù)據(jù)集的大小。本次實(shí)驗(yàn)搭建的CNN結(jié)構(gòu)較為簡(jiǎn)單,擁有3層卷積池化,使用Relu函數(shù)為激活函數(shù),loss用的是categorical_crossentropy,如果只有兩個(gè)手勢(shì),loss用binary_crossentropy,使用了Dropout預(yù)防止過擬合。通過Opencv結(jié)合訓(xùn)練好的模型進(jìn)行手勢(shì)預(yù)測(cè),使用Opencv裁切圖片,之后將圖像進(jìn)行幾何歸一化,通過雙線內(nèi)插值算法將圖像統(tǒng)一重塑為100*100像素。綜上所述,本次實(shí)驗(yàn)使用了keras框架設(shè)計(jì)了手勢(shì)識(shí)別系統(tǒng),可將識(shí)別手勢(shì)的結(jié)果來控制小游戲,增添交互樂趣。5.2展望與不足該實(shí)驗(yàn)拓展了我對(duì)CNN的知識(shí)視野,為CNN圖像分類研究提供了新的思路。因?yàn)樽约旱闹R(shí)水平和實(shí)驗(yàn)時(shí)間有限,對(duì)于手勢(shì)識(shí)別的研究還存在許多不足之處。由于測(cè)試用的電腦硬件水平所限,不能使用Tensoeflow的GPU加速,用的是比較簡(jiǎn)單的完全基于Keras搭建的神經(jīng)網(wǎng)絡(luò),在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過程中,容易出現(xiàn)過擬合的現(xiàn)象,對(duì)于欠擬合,一般通過增加網(wǎng)絡(luò)層數(shù),增加神經(jīng)元數(shù),增加訓(xùn)練數(shù)據(jù)集的方法就解決了。此次搭建的神經(jīng)網(wǎng)絡(luò)還是有很大的發(fā)展空間的,后期可以加入更多的手勢(shì)進(jìn)行識(shí)別,但對(duì)于性能較弱的平臺(tái)又是一個(gè)負(fù)擔(dān),還未找到完美的解決方案。先階段還未對(duì)程序進(jìn)行GUI設(shè)計(jì),漂亮的圖像界面對(duì)于用戶來說在視覺上更易接受,特別是年輕用戶群體。參考文獻(xiàn)[1]LEEJS,LEEYJ,LEEEH,eta1.HandregionextractionandGesturerecognitionfromvideostreamwithcomplexbackgroundthroughentropyanalysis[C].SanFrancisco,CA,USA:Proceedingsofthe26thAnnualInternationalConferenceoftheIEEEEMBS.2004.[2]YuChendong,WANGXuan,HUANGHejiao.Visionbasedhandgesturerecognitionusingcombinationalfeatures[C].20106thInternationalConferenceonIntelligentInformationHidingandMultimediaSignalProcessing,2010.[3]滕達(dá),楊壽保,劉巖,等.基于“大小手”的徒手手勢(shì)實(shí)時(shí)識(shí)別[J].計(jì)算機(jī)應(yīng)用,2006,26(9):2041—2043.[4]王凱,于鴻洋,張萍.基于Adaboost算法和光流匹配的實(shí)時(shí)手勢(shì)識(shí)別[J].微電子學(xué)與計(jì)算機(jī),2012,29(4):138—141.[5]飛槳官網(wǎng)/[6]Keras中文文檔https://keras.io/zh[7]ChristianSzegedy,WeiLiu,YangqingJia,PierreSermanet,ScottReed,DragomirAnguelov,DumitruErhan,VincentVanhoucke,AndrewRabinovich.Goingdeeperwithconvolutions7-12June2015致謝光陰似箭,轉(zhuǎn)眼就要大學(xué)畢業(yè),大一仿佛就在昨天,然而一篇畢業(yè)論文的完成卻宣告著我將近二十載的求學(xué)生涯即將結(jié)束。這篇論文的完成,由馬世登老師精心指導(dǎo),從初稿選題到中期報(bào)告,再到課后相關(guān)的畢設(shè)知識(shí)和資料,老師都耐心地做了點(diǎn)撥,并提出了寶貴的意見,使學(xué)生深受啟發(fā),思想開闊。與教師的交流,被教師的風(fēng)趣幽默感染,如同與朋友的交談。選題時(shí),我有了新的想法,老師又重新提出了意見和建議,在此,我深表謝意,感謝老師對(duì)我的熱情幫助,同時(shí),對(duì)于給老師帶來的不便,我感到很抱歉!在這四年的大學(xué)生活中,感謝母校對(duì)我的培養(yǎng),感謝所有大學(xué)老師的教誨,感謝我身邊的同學(xué)和朋友們,在學(xué)習(xí)和生活中給予我的幫助,在此衷心地說一聲:謝謝!感謝我的父母,在成長(zhǎng)的道路上,正是他們的支持和付出,才讓我一步一個(gè)腳印走到今天,我將更加努力的學(xué)習(xí)和工作,不辜負(fù)父母對(duì)我的期望。大學(xué)生活的結(jié)束也代表了新生活的開始,時(shí)光不會(huì)因?yàn)槲覀兊牧魬俣V沽魇?,我?huì)永遠(yuǎn)記得大學(xué)里所有的老師和朋友,永遠(yuǎn)記得我們一起走過的美好時(shí)光。我會(huì)帶著你們對(duì)我的期望,重新裝扮起來,為自己的生活而奮斗。
怎樣提高電腦系統(tǒng)運(yùn)行速度WindowsXP的啟動(dòng)速度比Windows2000要快30%左右,但相對(duì)于Windows98仍然要慢了不少,不過,我們可以通過優(yōu)化設(shè)置,來大大提高WindowsXP的啟動(dòng)速度。加快系統(tǒng)啟動(dòng)速度主要有以下方法:盡量減少系統(tǒng)在啟動(dòng)時(shí)加載的程序與服務(wù);對(duì)磁盤及CPU等硬件進(jìn)行優(yōu)化設(shè)置;修改默認(rèn)設(shè)置,減少啟動(dòng)等待時(shí)間等。這些方法大部分既可減少系統(tǒng)啟動(dòng)的時(shí)間,又可以節(jié)省系統(tǒng)資源,加快電腦運(yùn)行速度。1.加快系統(tǒng)啟動(dòng)速度WindowsXP的啟動(dòng)速度比Windows2000要快30%左右,但相對(duì)于Windows98仍然要慢了不少,不過,我們可以通過優(yōu)化設(shè)置,來大大提高WindowsXP的啟動(dòng)速度。加快系統(tǒng)啟動(dòng)速度主要有以下方法:盡量減少系統(tǒng)在啟動(dòng)時(shí)加載的程序與服務(wù);對(duì)磁盤及CPU等硬件進(jìn)行優(yōu)化設(shè)置;修改默認(rèn)設(shè)置,減少啟動(dòng)等待時(shí)間等。這些方法大部分既可減少系統(tǒng)啟動(dòng)的時(shí)間,又可以節(jié)省系統(tǒng)資源,加快電腦運(yùn)行速度。(1)MsconfigWindowsXP的啟動(dòng)速度在系統(tǒng)安裝初期還比較快,但隨著安裝的軟件不斷增多,系統(tǒng)的啟動(dòng)速度會(huì)越來越慢,這是由于許多軟件把自己加在了啟動(dòng)程序中,這樣開機(jī)即需運(yùn)行,大大降低了啟動(dòng)速度,而且也占用了大量的系統(tǒng)資源。對(duì)于這樣一些程序,我們可以通
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度環(huán)保設(shè)備購銷合同樣本及格式說明
- 2025年度進(jìn)出口貿(mào)易電子商務(wù)平臺(tái)運(yùn)營服務(wù)合同
- 發(fā)熱管項(xiàng)目融資計(jì)劃書
- 邢臺(tái)2024年河北邢臺(tái)廣宗縣招聘事業(yè)單位工作人員38人筆試歷年參考題庫附帶答案詳解
- 鹽城2025年江蘇省鹽城市教育局直屬學(xué)校招聘教師14人筆試歷年參考題庫附帶答案詳解
- 濰坊2025年山東濰坊市產(chǎn)業(yè)技術(shù)研究院招聘7人筆試歷年參考題庫附帶答案詳解
- 楚雄云南楚雄州消防救援局招聘6人筆試歷年參考題庫附帶答案詳解
- 株洲2025年湖南株洲市蘆淞區(qū)面向應(yīng)屆生招聘教師30人筆試歷年參考題庫附帶答案詳解
- 杭州2025年浙江杭州市臨安區(qū)高虹鎮(zhèn)人民政府招聘編外聘用人員筆試歷年參考題庫附帶答案詳解
- 普洱云南普洱市消防救援支隊(duì)專職消防員消防文員招錄筆試歷年參考題庫附帶答案詳解
- 培訓(xùn)學(xué)校書法課家長(zhǎng)會(huì)
- 護(hù)士年終總結(jié)及工作計(jì)劃
- 與信仰對(duì)話 課件-2024年入團(tuán)積極分子培訓(xùn)
- 中醫(yī)護(hù)理學(xué)-情志護(hù)理
- 中學(xué)美術(shù)《剪紙藝術(shù)》完整課件
- 數(shù)字化智能化園區(qū)建設(shè)水平評(píng)價(jià)標(biāo)準(zhǔn)(征求意見稿)
- 2024至2030年中國電極糊行業(yè)市場(chǎng)調(diào)查分析及產(chǎn)業(yè)前景規(guī)劃報(bào)告
- 2025年中考英語熱點(diǎn)時(shí)文閱讀-發(fā)明創(chuàng)造附解析
- 湖南株洲二中2022自主招生考試英語試卷試題(精校打?。?/a>
- 血透室護(hù)理質(zhì)控
- 粵語課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論