基于CNN的手勢(shì)游戲控制技術(shù)與開發(fā)實(shí)現(xiàn)_第1頁
基于CNN的手勢(shì)游戲控制技術(shù)與開發(fā)實(shí)現(xiàn)_第2頁
基于CNN的手勢(shì)游戲控制技術(shù)與開發(fā)實(shí)現(xiàn)_第3頁
基于CNN的手勢(shì)游戲控制技術(shù)與開發(fā)實(shí)現(xiàn)_第4頁
基于CNN的手勢(shì)游戲控制技術(shù)與開發(fā)實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論