




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多媒体技术与应用
第9章多媒体技术拓展应用9.1.1神经网络的发展9.1.2感知机9.1.3神经网络9.1.4卷积神经网络9.1深度学习概述生物神经元的结构9.1.1神经网络的发展M-P模型:1943年美国心理学家McCulloch(麦卡洛克)和数学家Pitts(皮茨)最先在论文《神经活动中所蕴含思想的逻辑活动》中提出的第一个神经元数学模型,将接收到的一个输入中多个分量加权求和后通过硬限幅函数处理后再输出。第一代:感知机,1950年左右被提出来,算法分为输入层和输出层,输入和输出之间为线性关系,感知机无法处理非线性模型;第二代:多层感知机(MLP),又叫人工神经网络(ANN),在中间加了多个隐含层,隐含层可以引入非线性结构,能够处理非线性问题;第三代:深度神经网络,主要包括深度神经网络(DNN)、循环神经网络(RNN)、卷积神经网络(CNN)等。9.1.1神经网络的发展9.1.2感知机9.1.3神经网络9.1.4卷积神经网络9.1深度学习概述9.1.2感知机感知机是一个简单的二分类线性分类模型,可以接收多个输入信号并输出一个结果信号。1.感知机模型
2.感知机的特点只有1层输入信号的感知机称为单层感知机,适合于线性分类当权重参数b=-0.5,ω1=ω2=1.0时,感知机可表示为由直线−0.5+x1+x2=0分割成的两个空间单层感知机的缺陷:无法实现非线性可分空间如右图所示的圆圈和三角标志无法画一条直线来分隔只能绘制一条曲线来进行分隔9.1.1神经网络的发展9.1.2感知机9.1.3神经网络9.1.4卷积神经网络9.1深度学习概述1.神经网络就是把多个单层感知机进行组合,形成一个多层感知机,可实现更复杂的功能。神经网络的特点:①
神经网络包括输入层、中间层和输出层,中间层又称为隐含层;②
该网络由3层神经元构成,但只有2层神经元有权重,一般称之为2层网络;③
信号从输入到输出都是单向的,整个网络中无反馈,称为前馈神经网络;输入层输出层中间层2.激活函数将输入信号的总和转换为输出信号,设x=b+ω1x1+ω2x2,则y=h(x)函数h(x)称之为激活函数,即决定如何来激活输入信号的总和。
激活函数实质是一种非线性的数学变换,用于对上一层神经元的输出进行某种数学变换,将变换后的结果作为下一层神经元的输入。如果使用线性激活函数时,不管神经网络有几层,最终输出还是一个线性变换,无法发挥多层网络叠加带来的优势,所以激活函数都使用非线性的激活函数。2.常用非线性激活函数(1)ReLU激活函数(RectifiedLinearUnit,线性整流函数):该函数以阈值为界,一旦输入超过某个阈值,就输出,这就是感知机中的激活函数,又叫阶跃函数
2.常用非线性激活函数(2)Sigmoid激活函数:当输入信号x较小时,输出接近为0,随着输入信号x的增大,输出向1靠近,对每个神经元的输出进行了归一化处理。一般用于将预测概率作为输出的模型,主要用于输出为二分类的神经网络模型。
(3)tanh激活函数(双曲正切函数):输出以0为中心,范围在-1和+1之间,与Sigmoid相比,tanh的梯度下降作用更强在一般的二分类问题中,tanh函数用于隐含层,而Sigmoid函数则用于输出层2.常用非线性激活函数(4)Softmax激活函数:对于神经网络具有K个信号的输出向量,Softmax可以将其变换到K个数值位于(0,1)之间的实数,刚好可以对应每个输出结果出现的概率,并且各项输出的总和为1,输出值中概率值最大的即为对应的结果,一般用于多分类问题。2.常用非线性激活函数机器学习就是要从训练数据中获得最优权重参数的过程。神经网络中参数的数量超多,需要在学习过程中通过反向传播的方式不断地调整网络中的权重参数,使模型中的权重参数尽可能达到最优。3.损失函数损失函数就是用来评价模型的预测值和真实值不一样的程度,用于衡量神经网络性能一个指标,模型训练过程中损失函数的值越来越小,说明模型的性能越来越好常见的损失函数(1)均方误差(MSE,MeanSquaredError)(2)交叉熵误差(CrossEntropyError)
交叉熵就是用来判定实际的输出与期望输出的接近程度
优化器就是在深度学习的反向传播过程中,通过损失函数来指引如何调整各个权重参数往正确的方向更新到合适的大小,更新后的各个权重参数使损失函数的值不断逼近全局最小。4.优化器①
批量梯度下降(BGD):使用所有样本计算梯度并更新权重参数,计算工作量大,训练速度慢,能够更准确地逼近最优解。②
随机梯度下降法(SGD):每轮迭代都是针对一个样本而不是全部样本,更新速度大大加快,但是得到的可能只是局部最优而不是全局最优解。③
小批量梯度下降(MBGD):每轮迭代都是针对一个小样本集合,既可以加快训练速度,又可以避免只能得到局部最优,如手写数字识别batch_size=32。4.优化器④
自适应梯度下降(AdaGrad):对不同的权重参数调整不同的学习率α,对频繁变化的权重参数以更小的步长进行更新,而稀疏的权重参数以更大的步长进行更新,一般默认学习率α=0.01。⑤
均方根传递(RMSProp):采用指数加权移动平均(累计局部梯度和)来替代AdaGrad中的累计平方梯度和,能够在不稳定的目标函数情况下很好地收敛,可克服AdaGrad梯度急剧减小的问题。5.模型的评价预测值真实值正类负类正类ab负类cd(1)准确率(Accuracy):(a+d)/(a+b+c+d),所有样本中被正确预测的比例;(2)精确率(Precision):a/(a+c),所有被预测为正类的样本中,预测正确的比例(3)召回率(Recall):a/(a+b),所有真实类别为正类的样本中,被正确预测出来的比例;(4)F1得分:2a/(2a+b+c),是准确率和召回率的一种调和均值;混淆矩阵其他评价方法泛化能力:是指机器学习算法处理训练集之外未知样本的适应能力,即把未知样本作为测试集,检测已训练好的模型在测试集上的适应能力。拟合(fit):模型在训练集与测试集上的表现都好欠拟合:就是模型在训练集与测试集上的表现都不好过拟合:模型在训练数据集上表现很好,但在未知数据集上却表现欠佳模型出现欠拟合或过拟合的话,建议增加训练样本数,调整超参数,包括Epcho、batch-size(小批量的大小)、学习率等,对训练集与测试集数据做归一化预处理等。9.1.1神经网络的发展9.1.2感知机9.1.3神经网络9.1.4卷积神经网络9.1深度学习概述卷积神经网络的结构(1)输入层卷积神经网络的输入层可以处理多维数据,如四维数组【0,0,0,0】可理解为第1张图片的第0行第0列的第0个通道的像素值通常在数据输入卷积神经网络前,需对数据进行归一化处理,若输入数据为像素,原始像素值【0,255】会被归一化处理为【0,1】之间的实数,有利于提升卷积神经网络的学习效率和性能。
隐含层又叫隐藏层,一般包含了卷积层、池化层和全连接层(2)隐含层卷积计算过程②
池化层:每个卷积层输出的特征图会被传递至池化层进行特征选择和信息过滤,仿照人的视觉系统进行降维(又叫降采样),可以提取出图像更高层的抽象特征。③
全连接层:是卷积神经网络隐含层的最后部分,特征图在全连接层中会失去空间拓扑结构,被展平为一个向量,对提取的特征进行非线性组合得到最后的输出结果使用逻辑函数或Softmax函数输出分类标签,对于物体识别问题,输出层将输出物体的中心坐标、大小(尺寸)和分类信息等。(2)隐含层(3)输出层9.2.1基于按钮交互的动画实现9.2.2基于图像识别的动画实现9.2拓展应用案例—剪刀石头布简单交互动画的运行结果界面设计思路(1)准备好代表剪刀石头布的图片;(2)机器出的图片用一个标签显示,由系统时钟控制其随机出现;(3)我出的是哪个,通过单击图片按钮实现;(4)当我单击某个按钮时,系统时钟暂停,机器标签显示的图片即为机器出结果;(5)根据游戏规则判别输赢,并对赢的次数进行累计;(6)游戏采用5局3胜制,当某一方获胜时,弹出对话框,显示最后的结果;(7)点按“下一局”,开始新一轮的比赛。9.2.1基于按钮交互的动画实现9.2.2基于图像识别的动画实现9.2拓展应用案例—剪刀石头布剪刀石头布——采用图像识别(神经网络模型)1)我和机器随机出的剪刀石头布图片动画显示在界面上面;2)左下角显示当前摄像头采集的图像画面;3)单击按钮“开始识别”,视频采集画面静止,将当前识别出的图片显示在上面我出的图片位置,同时动画停止,并与当前机器出的图片按游戏规则判别输赢,动画图片下方显示当前输赢次数;4)单击“继续出拳”按钮,继续视频采集,游戏采用5局3胜制,游戏结束弹出赢了的对话框;5)单击“下一局”按钮,继续下一轮的游戏Step1,设计思路剪刀石头布——采用图像识别(神经网络简单建模)首先采集剪刀石头布的图像,并按规律保存为图像文件,本例采集了3000*3=9000张训练用的原始jpg格式的图像(大小为640*480),采用外接USB摄像头,背景为黑色的屏幕背景。采集了2000*3=6000张测试用jpg图像文件。三种图片分三次采集,分别保存在指定目录下,本例为当前目录。准备工作1:采集原始图像importimageio#图像输入输出处理importvisvisasvv#计算机视觉库fc,i=0,-100#图片起始编号为负,便于将来采用时从1开始success=Truecapt=imageio.get_reader('<video3>')#ThinkPad中打开外接USB摄像头,0~2为内置摄像头#windowssurface:0为前置摄像头,1对于后置摄像头,2对应外接USB摄像头frame=capt.get_next_data()#读取帧数据t=vv.imshow(frame,clim=(0,255))#将帧数据显示在VV的视频窗口t中,clim控制颜色的范围forimincapt:#循环控制读取cessEvents()#vv处理事件t.SetData(im)#刷新t窗口中的图像fc=fc+1#累计帧数iffc%5==0:#设置截取的帧频,这里每隔5帧保存一次i+=1#给需要保存的图像文件编号vv.imwrite("jd_%d.jpg"%i,im)#将图像保存为指定的jpg文件ifi==6000:#当保存的文件数为6000时停止采集capt.close()#关闭摄像头break#退出循环app=vv.use()#开始消息循环app.Run()vv.closeAll()#关闭采集窗口剪刀石头布——采用图像识别(神经网络简单建模)分别读取三种图像文件,按照训练模型中的格式要求进行处理,同时对其进行标注(对应剪刀石头布的序号)准备工作2:制作数据集importnumpyasnpfromPILimportImageimportrandom#初始化一个二维的图像数组,默认为空,第1维是高度,第2维是宽度TrainImage=np.array([],dtype=np.uint8,ndmin=2)#存放打乱顺序的图像TrainLabel=[0]*9000TrainImg=np.array([],dtype=np.uint8,ndmin=2)#顺序添加图像数据TrainLbl=[]foriinrange(3000):#读取3000张训练用剪刀图像
TrainLbl.append(0)#剪刀的标记为0fileName=r"F:\sjb_recog\trainphoto\jd_"+str(i)+'.jpg'#打开图像文件并转换为灰度图像,数据类型为np的二维数组
img=np.array(Image.open(fileName).convert("L"))#再从数组类型转换成图像,然后缩放图像大小,本例是缩小了10倍
imgResize=Image.fromarray(img.astype('uint8')).resize((64,48))#将所有训练图像数据(二维数组)依次添加到用于存储训练图像的三维数组中
TrainImg=np.append(TrainImg,imgResize)TrainImage=np.append(TrainImage,imgResize)foriinrange(3000):#读取3000张训练用石头图像
TrainLbl.append(1)#石头标记为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张训练用布图像
TrainLbl.append(2)#布标记为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)#再将训练图像数据改成三维数组,依次表示图像的序号,像素的高度和宽度TrainImg=TrainImg.reshape(9000,48,64)#有序的图像数组TrainImage=TrainImage.reshape(9000,48,64)#有序的图像数组xh=random.sample(range(0,9000),9000)#随机生成9000个不一样的随机整数0~9000,打乱图像顺序random.shuffle(xh)foriinrange(9000):k=xh[i]TrainImage[k]=TrainImg[i]TrainLabel[k]=TrainLbl[i]准备工作2:制作数据集(续)准备工作2:制作数据集(续)TestImg=np.array([],dtype=np.uint8,ndmin=2)TestLbl=[]TestImage=np.array([],dtype=np.uint8,ndmin=2)#存放打乱顺序的图像TestLabel=[0]*6000foriinrange(2000):#读取2000张训练用剪刀图像TestLbl.append(0)#剪刀的标记为0fileName=r"F:\sjb_recog\trainphoto\jd_"+str(3000+i)+'.jpg'#打开图像文件并转换为灰度图像,数据类型为np的二维数组img=np.array(Image.open(fileName).convert("L"))#再从数组类型转换成图像,然后缩放图像大小,本例是缩小了10倍imgResize=Image.fromarray(img.astype('uint8')).resize((64,48))#将所有训练图像数据(二维数组)依次添加到用于存储训练图像的三维数组中TestImg=np.append(TestImg,imgResize)TestImage=np.append(TestImage,imgResize)准备工作2:制作数据集(续)foriinrange(2000):#读取2000张训练用石头图像TestLbl.append(1)#石头标记为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张训练用布图像TestLbl.append(2)#布标记为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)准备工作2:制作数据集(续)#再将训练图像数据改成三维数组,依次表示图像的序号,像素的高度和宽度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函数将训练集和测试集的图像数据以及标签数据写入sjb.npz数据集文件中np.savez(r'C:\Users\lxm\.keras\datasets\sjb.npz',TrainImage=TrainImage,TrainLabel=TrainLabel,TestImage=TestImage,TestLabel=TestLabel)#访问该数据集中的数据用#data=np.load(r'C:\Users\lxm\.keras\datasets\sjb.npz')#data['TrainImage']获取训练图像数据,data['TrainLabel']获取训练标签准备工作3:训练神经网络模型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)读取数据集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)准备图像数据:变换数据维度,并将图像数据转化为[0~1]准备工作3:训练神经网络模型fromtensorflow.kerasimportmodelsfromtensorflow.kerasimportlayersnetwork=models.Sequential()network.add(layers.Dense(512,activation='relu',input_shape=(64*48,)))network.add(layers.Dense(3,activation='softmax'))(3)创建训练模型并添加层pile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])(4)指定模型的优化器、损失函数和评价方法准备工作3:训练神经网络模型fromtensorflow.keras.utilsimportto_categoricaltrain_labels=to_categorical(train_labels)test_labels=to_categorical(test_labels)(5)处理训练标签和测试标签network.fit(train_images,train_labels,epochs=6,batch_size=32)(6)开始模型的训练,指定轮数和每轮数据批量的大小network.save("F:\sjb_recog\sjb-2.h5")(7)保存训练好的模型(8)查看测试结果test_loss,test_acc=network.evaluate(test_images,test_labels)模型的改进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)模型的改进(续)fromtensorflow.keras.utilsimportto_categoricaltrain_labels=to_categorical(train_labels)test_labels=to_categorical(test_labels)sjbMpile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])模型的改进(续)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,导入必要的库,全局变量初始化root=tk.Tk()root.title("游戏:剪刀石头布")root.geometry('600x600')random.seed()#随机数种子jqNo=1#机器默认出剪刀meWin,jqWin=0,0#我赢的次数和机器赢的次数初始化为0imgtk=None#控制画布上显示的图片im1=None#控制图像的数据传递conCapture=True#控制视频是否继续采集Step3,界面控件设计#定义两个标签,时钟开始后随机显示我和机器出的图片jqLabel=tk.Label(root,text=‘机器出的’)#机器出的图片,标签显示jqLabel.place(x=220,y=60,width=150,height=50)myLabel=tk.Label(root,text='我出的')#我出的图片,标签显示myLabel.place(x=20,y=60,width=120,height=50)#下面先加载用于显示的图片对象,分别控制机器和我出的图片jqph=[None,None,None]#初始化图像文件对象,两个语句不能合在一起赋值,否则引用的图片是一样的myph=[None,None,None]foriinrange(3):jqph[i]=tk.PhotoImage(file='r'+str(i+1)+'.gif')#每个图像文件必须单独保存,不能迭代赋值myph[i]=tk.PhotoImage(file='l'+str(i+1)+'_2.gif')jq_disp=tk.Label(root,image=jqph[0])#机器默认出的剪刀石头布jq_disp.place(x=250,y=120,width=70,height=50)my_disp=tk.Label(root,image=myph[0])#我默认出的剪刀石头布my_disp.place(x=50,y=120,width=70,height=50)Step3,界面控件设计(续)#下面定义两个标签。分别显示我和机器赢的次数,文本可动态变化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)#定义一个下一局按钮,单击开始下一轮比赛nextbt=tk.Button(root,text="下一局",command=nextClick)nextbt.place(x=450,y=400,width=70,height=30)nextbt.config(state="disabled")#在图片上方放2个提示性的文字标签tsLb1=tk.Label(root,text="我")tsLb1.place(x=40,y=30,width=90,height=30)tsLb2=tk.Label(root,text="机器")tsLb2.place(x=240,y=30,width=90,height=30)Step3,界面控件设计(续)#定义一块画布,用于显示采集的视频图像canvas=tk.Canvas(root,width=400,height=300)canvas.place(x=10,y=250)#定义两个按钮,控制开始图像识别和继续出拳
recogBt=tk.Button(root,text="开始识别",command=startRecog)recogBt.place(x=450,y=300,width=70,height=30)conCaptBt=tk.Button(root,text="继续出拳",command=conCapt)conCaptBt.place(x=450,y=350,width=70,height=30)conCaptBt.config(state="disabled")#继续出拳按钮默认为灰Step4,主程序设计#0是内置摄像头,1是外接USB摄像头,capt.read()将开启摄像头capt=cv2.VideoCapture(1,cv2.CAP_DSHOW)#定义一个全局的定时器,调用Fun_timer处理相应的事件,机器默认显示第1张图片timer1=tr.Timer(0.1,Fun_timer,['1'])timer1.start()#开启定时器t=tr.Thread(target=dispVideo)#通过线程控制执行自定义函数t.start()#启动线程model=load_model(r".\sjb-2.h5")#载入训练好的模型root.focus_set()#获取焦点root.mainloop()#开始事件循环Step5,随机显示图片的动画设计defFun_timer(n):#时钟触发时,将三张照片随机显示
globaljqNo,timer1,myph,jqph,my_disp,jq_dispi=eval(n)-1jqNo=i+1#记住当前机器出的图片序号
jq_disp=tk.Label(root,image=jqph[i])#image指定机器要打开的图片文件
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秒调用一次Fun_timer函数,参数为随机生成的文件序号(字符)
timer1.start()#启动时钟
root.update()#刷新窗体Step6,采集视频的显示defdispVideo():#控制视频的显示
globalcanvas,capt,imgtk,im1,conCapture,timer1capt=cv2.VideoCapture(1,,cv2.CAP_DSHOW)#0对应内置,1对应USB外置摄像头
conCapture=True#控制摄像头是否继续捕获图像
defcapture():#捕获摄像头的图像并显示
globalcanvas,capt,imgtk,im1whileTrue:rval,frame=capt.read()#从摄像头读取图像保存在frame中,rval保存是否读取成功
ifconCaptureandrval:#conCapture=True表示摄像头继续捕获图像im=Image.fromarray(frame)#转换图像的数据类型,im可显示为图像
im1=im.convert("L")#将其转换为灰度图像
imgtk=ImageTk.PhotoImage(image=im1)#将读取到的图像转换为image属性支持的类型
canvas.create_image(200,150,image=imgtk)#200,150指定图像的中心
canvas.image=imgtk#该语句用于解决图像显示时候的闪烁
rval,frame=capt.read()#继续从摄像头读取图像
t1=tr.Thread(target=capture)#创建一个线程t,指向函数capturet1.start()Step7,开始识别图像defstartRecog():#单击开始识别按钮执行的功能
globalcanvas,capt,imgtk,im1,conCapture,model,timer1,myph,jqph,jqNo,my_disp,jq_dispglobalconCapture=False#通过该逻辑变量控制摄像头停止捕获视频
timer1.cancel()#定时器停止,使机器出拳画面静止
conCaptBt.config(state="active")#继续出拳按钮变亮
recogBt.config(state="disabled")#开始识别按钮变灰
imgRecognized=np.array([],dtype=np.uint8,ndmin=2)#初始化图像列表,一个二维的空列表
canvas.create_image(200,150,image=imgtk)#当前画布显示待识别的图像
imGray=np.array(im1)#先将待识别的图像im1转换成灰度图像
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))#继续变换为二维数组
imgRecognized=imgRecognized.astype('float32')/255#将所有像素点的值变换到【0,1】区间
result=model.predict_classes(imgRecognized)#调用训练好的模型开始预测,结果保存在result中ifresult==0:rk=0elifresult==1:rk=1elifresult==2:rk=2my_disp.config(text='',image=myph[rk])#我出的图片标签替换显示为图片
root.update()#更新照片必须刷新窗体才能显示
Judge(rk+1,jqNo)#调用判别输赢的函数model=load_model(r".\sjb-2.h5")defstartRecog():#单击开始识别按钮执行的功能globalcanvas,capt,imgtk,im1,conCapture,modelglobaltimer1,myph,jqph,jqNo,my_disp,jq_dispconCapture=False#通过该逻辑变量控制摄像头停止捕获视频timer1.cancel()#定时器停止,使机器出拳画面静止conCaptBt.config(state="active")#继续出拳按钮变亮recogBt.config(state="disabled")#开始识别按钮变灰imgRecognized=np.array([],dtype=np.uint8,ndmin=3)#初始化图像列表,一个四维的空列表canvas.create_image(200,150,image=imgtk)#当前画布显示待识别的图像imGray=np.array(im1)#先将待识别的图像im1转换为np数组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#将所有像素点的值变换到【0,1】区间result=model.predict_classes(imgRecognized)#调用训练好的模型开始预测,结果保存在result中ifresult==0:rk=0elifresult==1:rk=1elifresult==2:rk=2Step7,开始识别图像(使用改进的模型)my_disp.config(text='',image=myph[rk])#我出的图片标签替换显示为图片
root.update()#更新照片必须刷新窗体才能显示
Judge(rk+1,jqNo)#调用判别输赢的函数model=load_model(r".\sjb-4.h5")Step8,判别输赢defJudge(x,y):#x对应我出的图片序号,y对应机器出
globalmeWin,jqWin,timer1ifx!=y:#根据图片序号判输赢
ifx==1andy==2:#我出剪刀,机器出石头
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 租赁合同设计方案
- 长尾医疗市场在2025年医保支付改革中的机遇与挑战报告
- 2025年特色小镇特色小镇生态环保设施资金申请项目评估报告
- 高考录取大学专业协议书
- 花草绿化管理合同协议书
- 济南救护车采购合同范本
- 签定珠宝展活动合同协议
- 电商供应商合同协议模板
- 自愿现金赠与协议书模板
- 网约车替班司机合同范本
- PDCA提高便秘患者肠镜检查肠道准备合格率
- 淮南新东辰控股集团有限责任公司招聘笔试题库2024
- 03D201-4 10kV及以下变压器室布置及变配电所常用设备构件安装
- 人民网删除稿件(帖文)申请登记表
- DL-T997-2020燃煤电厂石灰石-石膏湿法脱硫废水水质控制指标
- (正式版)YBT 6328-2024 冶金工业建构筑物安全运维技术规范
- 2022年袋鼠数学竞赛真题一二年级组含答案
- 2024年内蒙古交通集团赤峰分公司招聘笔试参考题库附带答案详解
- 诊所中药饮片清单
- 零信任安全架构-第1篇
- 物业客服主管的角色与职责解析
评论
0/150
提交评论