版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
多媒體技術(shù)與應(yīng)用
第9章多媒體技術(shù)拓展應(yīng)用9.1.1神經(jīng)網(wǎng)絡(luò)的發(fā)展9.1.2感知機(jī)9.1.3神經(jīng)網(wǎng)絡(luò)9.1.4卷積神經(jīng)網(wǎng)絡(luò)9.1深度學(xué)習(xí)概述生物神經(jīng)元的結(jié)構(gòu)9.1.1神經(jīng)網(wǎng)絡(luò)的發(fā)展M-P模型:1943年美國(guó)心理學(xué)家McCulloch(麥卡洛克)和數(shù)學(xué)家Pitts(皮茨)最先在論文《神經(jīng)活動(dòng)中所蘊(yùn)含思想的邏輯活動(dòng)》中提出的第一個(gè)神經(jīng)元數(shù)學(xué)模型,將接收到的一個(gè)輸入中多個(gè)分量加權(quán)求和后通過硬限幅函數(shù)處理后再輸出。第一代:感知機(jī),1950年左右被提出來,算法分為輸入層和輸出層,輸入和輸出之間為線性關(guān)系,感知機(jī)無法處理非線性模型;第二代:多層感知機(jī)(MLP),又叫人工神經(jīng)網(wǎng)絡(luò)(ANN),在中間加了多個(gè)隱含層,隱含層可以引入非線性結(jié)構(gòu),能夠處理非線性問題;第三代:深度神經(jīng)網(wǎng)絡(luò),主要包括深度神經(jīng)網(wǎng)絡(luò)(DNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)、卷積神經(jīng)網(wǎng)絡(luò)(CNN)等。9.1.1神經(jīng)網(wǎng)絡(luò)的發(fā)展9.1.2感知機(jī)9.1.3神經(jīng)網(wǎng)絡(luò)9.1.4卷積神經(jīng)網(wǎng)絡(luò)9.1深度學(xué)習(xí)概述9.1.2感知機(jī)感知機(jī)是一個(gè)簡(jiǎn)單的二分類線性分類模型,可以接收多個(gè)輸入信號(hào)并輸出一個(gè)結(jié)果信號(hào)。1.感知機(jī)模型
2.感知機(jī)的特點(diǎn)只有1層輸入信號(hào)的感知機(jī)稱為單層感知機(jī),適合于線性分類當(dāng)權(quán)重參數(shù)b=-0.5,ω1=ω2=1.0時(shí),感知機(jī)可表示為由直線?0.5+x1+x2=0分割成的兩個(gè)空間單層感知機(jī)的缺陷:無法實(shí)現(xiàn)非線性可分空間如右圖所示的圓圈和三角標(biāo)志無法畫一條直線來分隔只能繪制一條曲線來進(jìn)行分隔9.1.1神經(jīng)網(wǎng)絡(luò)的發(fā)展9.1.2感知機(jī)9.1.3神經(jīng)網(wǎng)絡(luò)9.1.4卷積神經(jīng)網(wǎng)絡(luò)9.1深度學(xué)習(xí)概述1.神經(jīng)網(wǎng)絡(luò)就是把多個(gè)單層感知機(jī)進(jìn)行組合,形成一個(gè)多層感知機(jī),可實(shí)現(xiàn)更復(fù)雜的功能。神經(jīng)網(wǎng)絡(luò)的特點(diǎn):①
神經(jīng)網(wǎng)絡(luò)包括輸入層、中間層和輸出層,中間層又稱為隱含層;②
該網(wǎng)絡(luò)由3層神經(jīng)元構(gòu)成,但只有2層神經(jīng)元有權(quán)重,一般稱之為2層網(wǎng)絡(luò);③
信號(hào)從輸入到輸出都是單向的,整個(gè)網(wǎng)絡(luò)中無反饋,稱為前饋神經(jīng)網(wǎng)絡(luò);輸入層輸出層中間層2.激活函數(shù)將輸入信號(hào)的總和轉(zhuǎn)換為輸出信號(hào),設(shè)x=b+ω1x1+ω2x2,則y=h(x)函數(shù)h(x)稱之為激活函數(shù),即決定如何來激活輸入信號(hào)的總和。
激活函數(shù)實(shí)質(zhì)是一種非線性的數(shù)學(xué)變換,用于對(duì)上一層神經(jīng)元的輸出進(jìn)行某種數(shù)學(xué)變換,將變換后的結(jié)果作為下一層神經(jīng)元的輸入。如果使用線性激活函數(shù)時(shí),不管神經(jīng)網(wǎng)絡(luò)有幾層,最終輸出還是一個(gè)線性變換,無法發(fā)揮多層網(wǎng)絡(luò)疊加帶來的優(yōu)勢(shì),所以激活函數(shù)都使用非線性的激活函數(shù)。2.常用非線性激活函數(shù)(1)ReLU激活函數(shù)(RectifiedLinearUnit,線性整流函數(shù)):該函數(shù)以閾值為界,一旦輸入超過某個(gè)閾值,就輸出,這就是感知機(jī)中的激活函數(shù),又叫階躍函數(shù)
2.常用非線性激活函數(shù)(2)Sigmoid激活函數(shù):當(dāng)輸入信號(hào)x較小時(shí),輸出接近為0,隨著輸入信號(hào)x的增大,輸出向1靠近,對(duì)每個(gè)神經(jīng)元的輸出進(jìn)行了歸一化處理。一般用于將預(yù)測(cè)概率作為輸出的模型,主要用于輸出為二分類的神經(jīng)網(wǎng)絡(luò)模型。
(3)tanh激活函數(shù)(雙曲正切函數(shù)):輸出以0為中心,范圍在-1和+1之間,與Sigmoid相比,tanh的梯度下降作用更強(qiáng)在一般的二分類問題中,tanh函數(shù)用于隱含層,而Sigmoid函數(shù)則用于輸出層2.常用非線性激活函數(shù)(4)Softmax激活函數(shù):對(duì)于神經(jīng)網(wǎng)絡(luò)具有K個(gè)信號(hào)的輸出向量,Softmax可以將其變換到K個(gè)數(shù)值位于(0,1)之間的實(shí)數(shù),剛好可以對(duì)應(yīng)每個(gè)輸出結(jié)果出現(xiàn)的概率,并且各項(xiàng)輸出的總和為1,輸出值中概率值最大的即為對(duì)應(yīng)的結(jié)果,一般用于多分類問題。2.常用非線性激活函數(shù)機(jī)器學(xué)習(xí)就是要從訓(xùn)練數(shù)據(jù)中獲得最優(yōu)權(quán)重參數(shù)的過程。神經(jīng)網(wǎng)絡(luò)中參數(shù)的數(shù)量超多,需要在學(xué)習(xí)過程中通過反向傳播的方式不斷地調(diào)整網(wǎng)絡(luò)中的權(quán)重參數(shù),使模型中的權(quán)重參數(shù)盡可能達(dá)到最優(yōu)。3.損失函數(shù)損失函數(shù)就是用來評(píng)價(jià)模型的預(yù)測(cè)值和真實(shí)值不一樣的程度,用于衡量神經(jīng)網(wǎng)絡(luò)性能一個(gè)指標(biāo),模型訓(xùn)練過程中損失函數(shù)的值越來越小,說明模型的性能越來越好常見的損失函數(shù)(1)均方誤差(MSE,MeanSquaredError)(2)交叉熵誤差(CrossEntropyError)
交叉熵就是用來判定實(shí)際的輸出與期望輸出的接近程度
優(yōu)化器就是在深度學(xué)習(xí)的反向傳播過程中,通過損失函數(shù)來指引如何調(diào)整各個(gè)權(quán)重參數(shù)往正確的方向更新到合適的大小,更新后的各個(gè)權(quán)重參數(shù)使損失函數(shù)的值不斷逼近全局最小。4.優(yōu)化器①
批量梯度下降(BGD):使用所有樣本計(jì)算梯度并更新權(quán)重參數(shù),計(jì)算工作量大,訓(xùn)練速度慢,能夠更準(zhǔn)確地逼近最優(yōu)解。②
隨機(jī)梯度下降法(SGD):每輪迭代都是針對(duì)一個(gè)樣本而不是全部樣本,更新速度大大加快,但是得到的可能只是局部最優(yōu)而不是全局最優(yōu)解。③
小批量梯度下降(MBGD):每輪迭代都是針對(duì)一個(gè)小樣本集合,既可以加快訓(xùn)練速度,又可以避免只能得到局部最優(yōu),如手寫數(shù)字識(shí)別batch_size=32。4.優(yōu)化器④
自適應(yīng)梯度下降(AdaGrad):對(duì)不同的權(quán)重參數(shù)調(diào)整不同的學(xué)習(xí)率α,對(duì)頻繁變化的權(quán)重參數(shù)以更小的步長(zhǎng)進(jìn)行更新,而稀疏的權(quán)重參數(shù)以更大的步長(zhǎng)進(jìn)行更新,一般默認(rèn)學(xué)習(xí)率α=0.01。⑤
均方根傳遞(RMSProp):采用指數(shù)加權(quán)移動(dòng)平均(累計(jì)局部梯度和)來替代AdaGrad中的累計(jì)平方梯度和,能夠在不穩(wěn)定的目標(biāo)函數(shù)情況下很好地收斂,可克服AdaGrad梯度急劇減小的問題。5.模型的評(píng)價(jià)預(yù)測(cè)值真實(shí)值正類負(fù)類正類ab負(fù)類cd(1)準(zhǔn)確率(Accuracy):(a+d)/(a+b+c+d),所有樣本中被正確預(yù)測(cè)的比例;(2)精確率(Precision):a/(a+c),所有被預(yù)測(cè)為正類的樣本中,預(yù)測(cè)正確的比例(3)召回率(Recall):a/(a+b),所有真實(shí)類別為正類的樣本中,被正確預(yù)測(cè)出來的比例;(4)F1得分:2a/(2a+b+c),是準(zhǔn)確率和召回率的一種調(diào)和均值;混淆矩陣其他評(píng)價(jià)方法泛化能力:是指機(jī)器學(xué)習(xí)算法處理訓(xùn)練集之外未知樣本的適應(yīng)能力,即把未知樣本作為測(cè)試集,檢測(cè)已訓(xùn)練好的模型在測(cè)試集上的適應(yīng)能力。擬合(fit):模型在訓(xùn)練集與測(cè)試集上的表現(xiàn)都好欠擬合:就是模型在訓(xùn)練集與測(cè)試集上的表現(xiàn)都不好過擬合:模型在訓(xùn)練數(shù)據(jù)集上表現(xiàn)很好,但在未知數(shù)據(jù)集上卻表現(xiàn)欠佳模型出現(xiàn)欠擬合或過擬合的話,建議增加訓(xùn)練樣本數(shù),調(diào)整超參數(shù),包括Epcho、batch-size(小批量的大?。W(xué)習(xí)率等,對(duì)訓(xùn)練集與測(cè)試集數(shù)據(jù)做歸一化預(yù)處理等。9.1.1神經(jīng)網(wǎng)絡(luò)的發(fā)展9.1.2感知機(jī)9.1.3神經(jīng)網(wǎng)絡(luò)9.1.4卷積神經(jīng)網(wǎng)絡(luò)9.1深度學(xué)習(xí)概述卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)(1)輸入層卷積神經(jīng)網(wǎng)絡(luò)的輸入層可以處理多維數(shù)據(jù),如四維數(shù)組【0,0,0,0】可理解為第1張圖片的第0行第0列的第0個(gè)通道的像素值通常在數(shù)據(jù)輸入卷積神經(jīng)網(wǎng)絡(luò)前,需對(duì)數(shù)據(jù)進(jìn)行歸一化處理,若輸入數(shù)據(jù)為像素,原始像素值【0,255】會(huì)被歸一化處理為【0,1】之間的實(shí)數(shù),有利于提升卷積神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)效率和性能。
隱含層又叫隱藏層,一般包含了卷積層、池化層和全連接層(2)隱含層卷積計(jì)算過程②
池化層:每個(gè)卷積層輸出的特征圖會(huì)被傳遞至池化層進(jìn)行特征選擇和信息過濾,仿照人的視覺系統(tǒng)進(jìn)行降維(又叫降采樣),可以提取出圖像更高層的抽象特征。③
全連接層:是卷積神經(jīng)網(wǎng)絡(luò)隱含層的最后部分,特征圖在全連接層中會(huì)失去空間拓?fù)浣Y(jié)構(gòu),被展平為一個(gè)向量,對(duì)提取的特征進(jìn)行非線性組合得到最后的輸出結(jié)果使用邏輯函數(shù)或Softmax函數(shù)輸出分類標(biāo)簽,對(duì)于物體識(shí)別問題,輸出層將輸出物體的中心坐標(biāo)、大?。ǔ叽纾┖头诸愋畔⒌取#?)隱含層(3)輸出層9.2.1基于按鈕交互的動(dòng)畫實(shí)現(xiàn)9.2.2基于圖像識(shí)別的動(dòng)畫實(shí)現(xiàn)9.2拓展應(yīng)用案例—剪刀石頭布簡(jiǎn)單交互動(dòng)畫的運(yùn)行結(jié)果界面設(shè)計(jì)思路(1)準(zhǔn)備好代表剪刀石頭布的圖片;(2)機(jī)器出的圖片用一個(gè)標(biāo)簽顯示,由系統(tǒng)時(shí)鐘控制其隨機(jī)出現(xiàn);(3)我出的是哪個(gè),通過單擊圖片按鈕實(shí)現(xiàn);(4)當(dāng)我單擊某個(gè)按鈕時(shí),系統(tǒng)時(shí)鐘暫停,機(jī)器標(biāo)簽顯示的圖片即為機(jī)器出結(jié)果;(5)根據(jù)游戲規(guī)則判別輸贏,并對(duì)贏的次數(shù)進(jìn)行累計(jì);(6)游戲采用5局3勝制,當(dāng)某一方獲勝時(shí),彈出對(duì)話框,顯示最后的結(jié)果;(7)點(diǎn)按“下一局”,開始新一輪的比賽。9.2.1基于按鈕交互的動(dòng)畫實(shí)現(xiàn)9.2.2基于圖像識(shí)別的動(dòng)畫實(shí)現(xiàn)9.2拓展應(yīng)用案例—剪刀石頭布剪刀石頭布——采用圖像識(shí)別(神經(jīng)網(wǎng)絡(luò)模型)1)我和機(jī)器隨機(jī)出的剪刀石頭布圖片動(dòng)畫顯示在界面上面;2)左下角顯示當(dāng)前攝像頭采集的圖像畫面;3)單擊按鈕“開始識(shí)別”,視頻采集畫面靜止,將當(dāng)前識(shí)別出的圖片顯示在上面我出的圖片位置,同時(shí)動(dòng)畫停止,并與當(dāng)前機(jī)器出的圖片按游戲規(guī)則判別輸贏,動(dòng)畫圖片下方顯示當(dāng)前輸贏次數(shù);4)單擊“繼續(xù)出拳”按鈕,繼續(xù)視頻采集,游戲采用5局3勝制,游戲結(jié)束彈出贏了的對(duì)話框;5)單擊“下一局”按鈕,繼續(xù)下一輪的游戲Step1,設(shè)計(jì)思路剪刀石頭布——采用圖像識(shí)別(神經(jīng)網(wǎng)絡(luò)簡(jiǎn)單建模)首先采集剪刀石頭布的圖像,并按規(guī)律保存為圖像文件,本例采集了3000*3=9000張訓(xùn)練用的原始jpg格式的圖像(大小為640*480),采用外接USB攝像頭,背景為黑色的屏幕背景。采集了2000*3=6000張測(cè)試用jpg圖像文件。三種圖片分三次采集,分別保存在指定目錄下,本例為當(dāng)前目錄。準(zhǔn)備工作1:采集原始圖像importimageio#圖像輸入輸出處理importvisvisasvv#計(jì)算機(jī)視覺庫(kù)fc,i=0,-100#圖片起始編號(hào)為負(fù),便于將來采用時(shí)從1開始success=Truecapt=imageio.get_reader('<video3>')#ThinkPad中打開外接USB攝像頭,0~2為內(nèi)置攝像頭#windowssurface:0為前置攝像頭,1對(duì)于后置攝像頭,2對(duì)應(yīng)外接USB攝像頭frame=capt.get_next_data()#讀取幀數(shù)據(jù)t=vv.imshow(frame,clim=(0,255))#將幀數(shù)據(jù)顯示在VV的視頻窗口t中,clim控制顏色的范圍forimincapt:#循環(huán)控制讀取cessEvents()#vv處理事件t.SetData(im)#刷新t窗口中的圖像fc=fc+1#累計(jì)幀數(shù)iffc%5==0:#設(shè)置截取的幀頻,這里每隔5幀保存一次i+=1#給需要保存的圖像文件編號(hào)vv.imwrite("jd_%d.jpg"%i,im)#將圖像保存為指定的jpg文件ifi==6000:#當(dāng)保存的文件數(shù)為6000時(shí)停止采集capt.close()#關(guān)閉攝像頭break#退出循環(huán)app=vv.use()#開始消息循環(huán)app.Run()vv.closeAll()#關(guān)閉采集窗口剪刀石頭布——采用圖像識(shí)別(神經(jīng)網(wǎng)絡(luò)簡(jiǎn)單建模)分別讀取三種圖像文件,按照訓(xùn)練模型中的格式要求進(jìn)行處理,同時(shí)對(duì)其進(jìn)行標(biāo)注(對(duì)應(yīng)剪刀石頭布的序號(hào))準(zhǔn)備工作2:制作數(shù)據(jù)集importnumpyasnpfromPILimportImageimportrandom#初始化一個(gè)二維的圖像數(shù)組,默認(rèn)為空,第1維是高度,第2維是寬度TrainImage=np.array([],dtype=np.uint8,ndmin=2)#存放打亂順序的圖像TrainLabel=[0]*9000TrainImg=np.array([],dtype=np.uint8,ndmin=2)#順序添加圖像數(shù)據(jù)TrainLbl=[]foriinrange(3000):#讀取3000張訓(xùn)練用剪刀圖像
TrainLbl.append(0)#剪刀的標(biāo)記為0fileName=r"F:\sjb_recog\trainphoto\jd_"+str(i)+'.jpg'#打開圖像文件并轉(zhuǎn)換為灰度圖像,數(shù)據(jù)類型為np的二維數(shù)組
img=np.array(Image.open(fileName).convert("L"))#再?gòu)臄?shù)組類型轉(zhuǎn)換成圖像,然后縮放圖像大小,本例是縮小了10倍
imgResize=Image.fromarray(img.astype('uint8')).resize((64,48))#將所有訓(xùn)練圖像數(shù)據(jù)(二維數(shù)組)依次添加到用于存儲(chǔ)訓(xùn)練圖像的三維數(shù)組中
TrainImg=np.append(TrainImg,imgResize)TrainImage=np.append(TrainImage,imgResize)foriinrange(3000):#讀取3000張訓(xùn)練用石頭圖像
TrainLbl.append(1)#石頭標(biāo)記為1fileName=r"F:\sjb_recog\trainphoto\st_"+str(i)+'.jpg'
img=np.array(Image.open(fileName).convert("L"))imgResize=Image.fromarray(img.astype('uint8')).resize((64,48))TrainImg=np.append(TrainImg,imgResize)TrainImage=np.append(TrainImage,imgResize)
foriinrange(3000):#讀取3000張訓(xùn)練用布圖像
TrainLbl.append(2)#布標(biāo)記為2fileName=r"F:\sjb_recog\trainphoto\bu_"+str(i)+'.jpg'img=np.array(Image.open(fileName).convert("L"))imgResize=Image.fromarray(img.astype('uint8')).resize((64,48))TrainImg=np.append(TrainImg,imgResize)TrainImage=np.append(TrainImage,imgResize)#再將訓(xùn)練圖像數(shù)據(jù)改成三維數(shù)組,依次表示圖像的序號(hào),像素的高度和寬度TrainImg=TrainImg.reshape(9000,48,64)#有序的圖像數(shù)組TrainImage=TrainImage.reshape(9000,48,64)#有序的圖像數(shù)組xh=random.sample(range(0,9000),9000)#隨機(jī)生成9000個(gè)不一樣的隨機(jī)整數(shù)0~9000,打亂圖像順序random.shuffle(xh)foriinrange(9000):k=xh[i]TrainImage[k]=TrainImg[i]TrainLabel[k]=TrainLbl[i]準(zhǔn)備工作2:制作數(shù)據(jù)集(續(xù))準(zhǔn)備工作2:制作數(shù)據(jù)集(續(xù))TestImg=np.array([],dtype=np.uint8,ndmin=2)TestLbl=[]TestImage=np.array([],dtype=np.uint8,ndmin=2)#存放打亂順序的圖像TestLabel=[0]*6000foriinrange(2000):#讀取2000張訓(xùn)練用剪刀圖像TestLbl.append(0)#剪刀的標(biāo)記為0fileName=r"F:\sjb_recog\trainphoto\jd_"+str(3000+i)+'.jpg'#打開圖像文件并轉(zhuǎn)換為灰度圖像,數(shù)據(jù)類型為np的二維數(shù)組img=np.array(Image.open(fileName).convert("L"))#再?gòu)臄?shù)組類型轉(zhuǎn)換成圖像,然后縮放圖像大小,本例是縮小了10倍imgResize=Image.fromarray(img.astype('uint8')).resize((64,48))#將所有訓(xùn)練圖像數(shù)據(jù)(二維數(shù)組)依次添加到用于存儲(chǔ)訓(xùn)練圖像的三維數(shù)組中TestImg=np.append(TestImg,imgResize)TestImage=np.append(TestImage,imgResize)準(zhǔn)備工作2:制作數(shù)據(jù)集(續(xù))foriinrange(2000):#讀取2000張訓(xùn)練用石頭圖像TestLbl.append(1)#石頭標(biāo)記為1fileName=r"F:\sjb_recog\trainphoto\st_"+str(3000+i)+'.jpg'
img=np.array(Image.open(fileName).convert("L"))imgResize=Image.fromarray(img.astype('uint8')).resize((64,48))TestImg=np.append(TestImg,imgResize)TestImage=np.append(TestImage,imgResize)foriinrange(2000):#讀取2000張訓(xùn)練用布圖像TestLbl.append(2)#布標(biāo)記為2fileName=r"F:\sjb_recog\trainphoto\bu_"+str(3000+i)+'.jpg'img=np.array(Image.open(fileName).convert("L"))imgResize=Image.fromarray(img.astype('uint8')).resize((64,48))TestImg=np.append(TestImg,imgResize)TestImage=np.append(TestImage,imgResize)準(zhǔn)備工作2:制作數(shù)據(jù)集(續(xù))#再將訓(xùn)練圖像數(shù)據(jù)改成三維數(shù)組,依次表示圖像的序號(hào),像素的高度和寬度TestImg=TestImg.reshape(6000,48,64)TestImage=TestImage.reshape(6000,48,64)xh1=random.sample(range(0,6000),6000)random.shuffle(xh1)foriinrange(6000):kk=xh1[i]TestImage[kk]=TestImg[i]TestLabel[kk]=TestLbl[i]#用savez函數(shù)將訓(xùn)練集和測(cè)試集的圖像數(shù)據(jù)以及標(biāo)簽數(shù)據(jù)寫入sjb.npz數(shù)據(jù)集文件中np.savez(r'C:\Users\lxm\.keras\datasets\sjb.npz',TrainImage=TrainImage,TrainLabel=TrainLabel,TestImage=TestImage,TestLabel=TestLabel)#訪問該數(shù)據(jù)集中的數(shù)據(jù)用#data=np.load(r'C:\Users\lxm\.keras\datasets\sjb.npz')#data['TrainImage']獲取訓(xùn)練圖像數(shù)據(jù),data['TrainLabel']獲取訓(xùn)練標(biāo)簽準(zhǔn)備工作3:訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型importnumpyasnpdata=np.load(r'C:\Users\lxm\.keras\datasets\sjb.npz')train_images=data['TrainImage']test_images=data['TestImage']train_labels=data['TrainLabel'].astype(np.uint8)test_labels=data['TestLabel'].astype(np.uint8)(1)讀取數(shù)據(jù)集train_images=train_images.reshape((9000,64*48))test_images=test_images.reshape((6000,64*48))train_images=train_images.astype('float32')/255test_images=test_images.astype('float32')/255(2)準(zhǔn)備圖像數(shù)據(jù):變換數(shù)據(jù)維度,并將圖像數(shù)據(jù)轉(zhuǎn)化為[0~1]準(zhǔn)備工作3:訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型fromtensorflow.kerasimportmodelsfromtensorflow.kerasimportlayersnetwork=models.Sequential()network.add(layers.Dense(512,activation='relu',input_shape=(64*48,)))network.add(layers.Dense(3,activation='softmax'))(3)創(chuàng)建訓(xùn)練模型并添加層pile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])(4)指定模型的優(yōu)化器、損失函數(shù)和評(píng)價(jià)方法準(zhǔn)備工作3:訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型fromtensorflow.keras.utilsimportto_categoricaltrain_labels=to_categorical(train_labels)test_labels=to_categorical(test_labels)(5)處理訓(xùn)練標(biāo)簽和測(cè)試標(biāo)簽network.fit(train_images,train_labels,epochs=6,batch_size=32)(6)開始模型的訓(xùn)練,指定輪數(shù)和每輪數(shù)據(jù)批量的大小network.save("F:\sjb_recog\sjb-2.h5")(7)保存訓(xùn)練好的模型(8)查看測(cè)試結(jié)果test_loss,test_acc=network.evaluate(test_images,test_labels)模型的改進(jìn)fromtensorflow.kerasimportlayersfromtensorflow.kerasimportmodelssjbModel=models.Sequential()sjbModel.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(48,64,1)))sjbModel.add(layers.MaxPooling2D((2,2)))sjbModel.add(layers.Conv2D(64,(3,3),activation='relu'))sjbModel.add(layers.MaxPooling2D((2,2)))sjbModel.add(layers.Conv2D(64,(3,3),activation='relu'))sjbModel.add(layers.Flatten())sjbModel.add(layers.Dense(512,activation='relu'))sjbModel.add(layers.Dense(3,activation='softmax'))importnumpyasnpdata=np.load(r'C:\Users\lxm\.keras\datasets\sjb.npz')train_images=data['TrainImage'].reshape(9000,48,64,1)train_images=train_images.astype('float32')/255test_images=data['TestImage'].reshape(6000,48,64,1)test_images=test_images.astype('float32')/255train_labels=data['TrainLabel'].astype(np.uint8)test_labels=data['TestLabel'].astype(np.uint8)模型的改進(jìn)(續(xù))fromtensorflow.keras.utilsimportto_categoricaltrain_labels=to_categorical(train_labels)test_labels=to_categorical(test_labels)sjbMpile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])模型的改進(jìn)(續(xù))sjbModel.fit(train_images,train_labels,epochs=5,batch_size=64)sjbModel.save("F:\sjb_recog\sjb-4.h5")test_loss,test_acc=sjbModel.evaluate(test_images,test_labels)print('test_acc:',test_acc)importtkinterastkimportrandomimportthreadingastrimporttkinter.messagebox#importmatplotlib.pyplotaspltimportcv2fromPILimportImage,ImageTkfromtensorflow.keras.modelsimportload_modelimportnumpyasnpStep2,導(dǎo)入必要的庫(kù),全局變量初始化root=tk.Tk()root.title("游戲:剪刀石頭布")root.geometry('600x600')random.seed()#隨機(jī)數(shù)種子jqNo=1#機(jī)器默認(rèn)出剪刀meWin,jqWin=0,0#我贏的次數(shù)和機(jī)器贏的次數(shù)初始化為0imgtk=None#控制畫布上顯示的圖片im1=None#控制圖像的數(shù)據(jù)傳遞conCapture=True#控制視頻是否繼續(xù)采集Step3,界面控件設(shè)計(jì)#定義兩個(gè)標(biāo)簽,時(shí)鐘開始后隨機(jī)顯示我和機(jī)器出的圖片jqLabel=tk.Label(root,text=‘機(jī)器出的’)#機(jī)器出的圖片,標(biāo)簽顯示jqLabel.place(x=220,y=60,width=150,height=50)myLabel=tk.Label(root,text='我出的')#我出的圖片,標(biāo)簽顯示myLabel.place(x=20,y=60,width=120,height=50)#下面先加載用于顯示的圖片對(duì)象,分別控制機(jī)器和我出的圖片jqph=[None,None,None]#初始化圖像文件對(duì)象,兩個(gè)語句不能合在一起賦值,否則引用的圖片是一樣的myph=[None,None,None]foriinrange(3):jqph[i]=tk.PhotoImage(file='r'+str(i+1)+'.gif')#每個(gè)圖像文件必須單獨(dú)保存,不能迭代賦值myph[i]=tk.PhotoImage(file='l'+str(i+1)+'_2.gif')jq_disp=tk.Label(root,image=jqph[0])#機(jī)器默認(rèn)出的剪刀石頭布jq_disp.place(x=250,y=120,width=70,height=50)my_disp=tk.Label(root,image=myph[0])#我默認(rèn)出的剪刀石頭布my_disp.place(x=50,y=120,width=70,height=50)Step3,界面控件設(shè)計(jì)(續(xù))#下面定義兩個(gè)標(biāo)簽。分別顯示我和機(jī)器贏的次數(shù),文本可動(dòng)態(tài)變化varMe=tkinter.StringVar()lbMe=tk.Label(root,textvariable=varMe)lbMe.place(x=50,y=200,width=70,height=30)varJq=tkinter.StringVar()lbjq=tk.Label(root,textvariable=varJq)lbjq.place(x=250,y=200,width=70,height=30)#定義一個(gè)下一局按鈕,單擊開始下一輪比賽nextbt=tk.Button(root,text="下一局",command=nextClick)nextbt.place(x=450,y=400,width=70,height=30)nextbt.config(state="disabled")#在圖片上方放2個(gè)提示性的文字標(biāo)簽tsLb1=tk.Label(root,text="我")tsLb1.place(x=40,y=30,width=90,height=30)tsLb2=tk.Label(root,text="機(jī)器")tsLb2.place(x=240,y=30,width=90,height=30)Step3,界面控件設(shè)計(jì)(續(xù))#定義一塊畫布,用于顯示采集的視頻圖像canvas=tk.Canvas(root,width=400,height=300)canvas.place(x=10,y=250)#定義兩個(gè)按鈕,控制開始圖像識(shí)別和繼續(xù)出拳
recogBt=tk.Button(root,text="開始識(shí)別",command=startRecog)recogBt.place(x=450,y=300,width=70,height=30)conCaptBt=tk.Button(root,text="繼續(xù)出拳",command=conCapt)conCaptBt.place(x=450,y=350,width=70,height=30)conCaptBt.config(state="disabled")#繼續(xù)出拳按鈕默認(rèn)為灰Step4,主程序設(shè)計(jì)#0是內(nèi)置攝像頭,1是外接USB攝像頭,capt.read()將開啟攝像頭capt=cv2.VideoCapture(1,cv2.CAP_DSHOW)#定義一個(gè)全局的定時(shí)器,調(diào)用Fun_timer處理相應(yīng)的事件,機(jī)器默認(rèn)顯示第1張圖片timer1=tr.Timer(0.1,Fun_timer,['1'])timer1.start()#開啟定時(shí)器t=tr.Thread(target=dispVideo)#通過線程控制執(zhí)行自定義函數(shù)t.start()#啟動(dòng)線程model=load_model(r".\sjb-2.h5")#載入訓(xùn)練好的模型root.focus_set()#獲取焦點(diǎn)root.mainloop()#開始事件循環(huán)Step5,隨機(jī)顯示圖片的動(dòng)畫設(shè)計(jì)defFun_timer(n):#時(shí)鐘觸發(fā)時(shí),將三張照片隨機(jī)顯示
globaljqNo,timer1,myph,jqph,my_disp,jq_dispi=eval(n)-1jqNo=i+1#記住當(dāng)前機(jī)器出的圖片序號(hào)
jq_disp=tk.Label(root,image=jqph[i])#image指定機(jī)器要打開的圖片文件
jq_disp.place(x=250,y=120,width=70,height=50)my_disp=tk.Label(root,image=myph[i])#image指定我要打開的圖片文件
my_disp.place(x=50,y=120,width=70,height=50)timer1=tr.Timer(0.1,Fun_timer,args=[str(random.randint(1,3))])
#每隔0.1秒調(diào)用一次Fun_timer函數(shù),參數(shù)為隨機(jī)生成的文件序號(hào)(字符)
timer1.start()#啟動(dòng)時(shí)鐘
root.update()#刷新窗體Step6,采集視頻的顯示defdispVideo():#控制視頻的顯示
globalcanvas,capt,imgtk,im1,conCapture,timer1capt=cv2.VideoCapture(1,,cv2.CAP_DSHOW)#0對(duì)應(yīng)內(nèi)置,1對(duì)應(yīng)USB外置攝像頭
conCapture=True#控制攝像頭是否繼續(xù)捕獲圖像
defcapture():#捕獲攝像頭的圖像并顯示
globalcanvas,capt,imgtk,im1whileTrue:rval,frame=capt.read()#從攝像頭讀取圖像保存在frame中,rval保存是否讀取成功
ifconCaptureandrval:#conCapture=True表示攝像頭繼續(xù)捕獲圖像im=Image.fromarray(frame)#轉(zhuǎn)換圖像的數(shù)據(jù)類型,im可顯示為圖像
im1=im.convert("L")#將其轉(zhuǎn)換為灰度圖像
imgtk=ImageTk.PhotoImage(image=im1)#將讀取到的圖像轉(zhuǎn)換為image屬性支持的類型
canvas.create_image(200,150,image=imgtk)#200,150指定圖像的中心
canvas.image=imgtk#該語句用于解決圖像顯示時(shí)候的閃爍
rval,frame=capt.read()#繼續(xù)從攝像頭讀取圖像
t1=tr.Thread(target=capture)#創(chuàng)建一個(gè)線程t,指向函數(shù)capturet1.start()Step7,開始識(shí)別圖像defstartRecog():#單擊開始識(shí)別按鈕執(zhí)行的功能
globalcanvas,capt,imgtk,im1,conCapture,model,timer1,myph,jqph,jqNo,my_disp,jq_dispglobalconCapture=False#通過該邏輯變量控制攝像頭停止捕獲視頻
timer1.cancel()#定時(shí)器停止,使機(jī)器出拳畫面靜止
conCaptBt.config(state="active")#繼續(xù)出拳按鈕變亮
recogBt.config(state="disabled")#開始識(shí)別按鈕變灰
imgRecognized=np.array([],dtype=np.uint8,ndmin=2)#初始化圖像列表,一個(gè)二維的空列表
canvas.create_image(200,150,image=imgtk)#當(dāng)前畫布顯示待識(shí)別的圖像
imGray=np.array(im1)#先將待識(shí)別的圖像im1轉(zhuǎn)換成灰度圖像
imgRec=Image.fromarray(imGray.astype('uint8')).resize((64,48))#將圖像縮小10倍imgRecognized=np.append(imgRecognized,imgRec)#將圖像添加到圖像列表imgRecognizedimgRecognized=imgRecognized.reshape(1,48,64)#將該圖像列表變成三維
imgRecognized=imgRecognized.reshape((1,64*48))#繼續(xù)變換為二維數(shù)組
imgRecognized=imgRecognized.astype('float32')/255#將所有像素點(diǎn)的值變換到【0,1】區(qū)間
result=model.predict_classes(imgRecognized)#調(diào)用訓(xùn)練好的模型開始預(yù)測(cè),結(jié)果保存在result中ifresult==0:rk=0elifresult==1:rk=1elifresult==2:rk=2my_disp.config(text='',image=myph[rk])#我出的圖片標(biāo)簽替換顯示為圖片
root.update()#更新照片必須刷新窗體才能顯示
Judge(rk+1,jqNo)#調(diào)用判別輸贏的函數(shù)model=load_model(r".\sjb-2.h5")defstartRecog():#單擊開始識(shí)別按鈕執(zhí)行的功能globalcanvas,capt,imgtk,im1,conCapture,modelglobaltimer1,myph,jqph,jqNo,my_disp,jq_dispconCapture=False#通過該邏輯變量控制攝像頭停止捕獲視頻timer1.cancel()#定時(shí)器停止,使機(jī)器出拳畫面靜止conCaptBt.config(state="active")#繼續(xù)出拳按鈕變亮recogBt.config(state="disabled")#開始識(shí)別按鈕變灰imgRecognized=np.array([],dtype=np.uint8,ndmin=3)#初始化圖像列表,一個(gè)四維的空列表canvas.create_image(200,150,image=imgtk)#當(dāng)前畫布顯示待識(shí)別的圖像imGray=np.array(im1)#先將待識(shí)別的圖像im1轉(zhuǎn)換為np數(shù)組imgRec=Image.fromarray(imGray.astype('uint8')).resize((64,48))#將圖像縮小10倍
imgRec=np.array(imgRec).reshape(48,64,1)imgRecognized=np.append(imgRecognized,imgRec)#將圖像添加到圖像列表imgRecognizedimgRecognized=imgRecognized.reshape(1,48,64,1)#將該圖像列表變成四維imgRecognized=imgRecognized.astype(‘float32’)/255#將所有像素點(diǎn)的值變換到【0,1】區(qū)間result=model.predict_classes(imgRecognized)#調(diào)用訓(xùn)練好的模型開始預(yù)測(cè),結(jié)果保存在result中ifresult==0:rk=0elifresult==1:rk=1elifresult==2:rk=2Step7,開始識(shí)別圖像(使用改進(jìn)的模型)my_disp.config(text='',image=myph[rk])#我出的圖片標(biāo)簽替換顯示為圖片
root.update()#更新照片必須刷新窗體才能顯示
Judge(rk+1,jqNo)#調(diào)用判別輸贏的函數(shù)model=load_model(r".\sjb-4.h5")Step8,判別輸贏defJudge(x,y):#x對(duì)應(yīng)我出的圖片序號(hào),y對(duì)應(yīng)機(jī)器出
globalmeWin,jqWin,timer1ifx!=y:#根據(jù)圖片序號(hào)判輸贏
ifx==1andy==2:#我出剪刀,機(jī)器出石頭
溫馨提示
- 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. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)產(chǎn)品初加工機(jī)相關(guān)項(xiàng)目投資計(jì)劃書范本
- 麻醉科安全管理與服務(wù)優(yōu)化措施計(jì)劃
- 加強(qiáng)社區(qū)內(nèi)商業(yè)活動(dòng)的合理規(guī)劃計(jì)劃
- 2024-2025學(xué)年福建省漳州市漳浦縣人教版三年級(jí)上冊(cè)期中測(cè)試數(shù)學(xué)試卷-A4
- 《講數(shù)列的應(yīng)用》課件
- 《設(shè)備管理工作規(guī)劃》課件
- 《信息的加密》課件
- 《教材股票估值》課件
- 質(zhì)量分析報(bào)告范文
- 《電工技術(shù)》課件-第11章
- 2024年考研(英語一)真題及參考答案
- 心肺復(fù)蘇術(shù)課件2024新版
- 部編版一年級(jí)上冊(cè)語文期末試題帶答案
- 2023-2024公需科目(數(shù)字經(jīng)濟(jì)與驅(qū)動(dòng)發(fā)展)考試題庫(kù)及答案
- 2024標(biāo)準(zhǔn)版勞務(wù)合同范本下載
- 2024年交管12123學(xué)法減分考試題庫(kù)和答案
- 嗶哩嗶哩產(chǎn)品介紹商業(yè)模式用戶體驗(yàn)分析PPT課程課件
- 物流公司貨物運(yùn)輸安全生產(chǎn)管理制度
- 米色紋理相聲介紹卡通通用PPT模板
- 鐳雕技術(shù)員培訓(xùn)教材
- 語言與社會(huì)身份(989)
評(píng)論
0/150
提交評(píng)論