手写数字识别(图像,视频,实时摄像头)MNIST DATASET(手把手教程):Jupyter+Tensorflow
本实验要用到 Anaconda+Jupyter+Tensorflow没有环境的看这:链接: Anaconda+Jupyter+Opencv+tensorflow安装.有任何问题评论回复。
打开Jupyter:
注意:因为我们要做图像处理,我希望你需要处理的图像、视频和程序保存在同一位置。
比如:
我们不需要下载数据集,因为MNIST数据集在tensorflow里,我们只需要用Kares加载就可以了。
实验用了三层卷积和三层全连接。具体原理很多文章讲到,这里就直接上代码了:
代码有详细注释:
首先加载"MNIST Dataset" :
训练和测试数据集:
正则化之前检查每个像素的值:
确定是灰度图后,正则化。正则化就是将0-255的数据转化到0-1之间。
检查标签
重置置图像大小,使它适合做卷积
创建一个深度神经网络
结果:
训练模型:
在测试集上预测
结果:
现在我手写一个,用来测试:
加载图片:
重设输入图像参数:
预测结果:
识别视频里的手写数字:
import numpy as np
font_scale=1.5 #字体大小
font=cv2.FONT_HERSHEY_PLAIN#字体类型
cap=cv2.VideoCapture('2021-04-04_182439.mp4')
if not cap.isOpened():
cap=cv2.VideoCapture(0)
if not cap.isOpened():
raise IOError('Can not open video')
text='Some text in a box!'
#获得box的长和宽
(text_width,text_height)=cv2.getTextSize(text,font,fontScale=font_scale,thickness=1)[0]
#设置box的开始位置
text_offset_x=10
text_offset_y=img.shape[0]-25
#设置box的坐标
box_coords=((text_offset_x,text_offset_y),(text_offset_x+text_width+2,text_offset_y-text_height-2))
cntr=0;
while True:
ret,frame=cap.read()
cntr=cntr+1;
if((cntr%2)==0):
gray=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)#先将彩图转化为灰度图
resized=cv2.resize(gray,(28,28),interpolation=cv2.INTER_AREA)#调整输入图片的尺寸
newing=tf.keras.utils.normalize(resized,axis=1)#正则化
newing=np.array(newing).reshape(-1,IMG_SIZE,IMG_SIZE,1)#kneral operation
predicions=model.predict(newing)
status=np.argmax(predicions)
print(status)
print(type(status))
x1,y1,w1,h1=0,0,175,75
#画绿色的矩形
cv2.rectangle(frame,(x1,x1),(x1+w1,y1+h1),(0,255,0),-1)
#add text
cv2.putText(frame,status.astype(str),(x1+int(w1/5),y1+int(h1/2)),cv2.FONT_HERSHEY_SIMPLEX,0.7,(0,0,255),2)
cv2.imshow('handwritten Digits Recognition Test',frame)
if cv2.waitKey(2) & 0xFF==ord('q'):
break
cap.replease()
cv2.destroyAllwimdows()
结果是视频,文章里传不了,请看链接: link.
视频截图:
实时摄像头:
import numpy as np
font_scale=1.5 #字体大小
font=cv2.FONT_HERSHEY_PLAIN#字体类型
cap=cv2.VideoCapture(1)
if not cap.isOpened():
cap=cv2.VideoCapture(0)
if not cap.isOpened():
raise IOError('Can not open video')
text='Some text in a box!'
#获得box的长和宽
(text_width,text_height)=cv2.getTextSize(text,font,fontScale=font_scale,thickness=1)[0]
#设置box的开始位置
text_offset_x=10
text_offset_y=img.shape[0]-25
#设置box的坐标
box_coords=((text_offset_x,text_offset_y),(text_offset_x+text_width+2,text_offset_y-text_height-2))
cntr=0;
while True:
ret,frame=cap.read()
cntr=cntr+1;
if((cntr%2)==0):
gray=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)#先将彩图转化为灰度图
resized=cv2.resize(gray,(28,28),interpolation=cv2.INTER_AREA)#调整输入图片的尺寸
newing=tf.keras.utils.normalize(resized,axis=1)#正则化
newing=np.array(newing).reshape(-1,IMG_SIZE,IMG_SIZE,1)#kneral operation
predicions=model.predict(newing)
status=np.argmax(predicions)
print(status)
print(type(status))
x1,y1,w1,h1=0,0,175,75
#画绿色的矩形
cv2.rectangle(frame,(x1,x1),(x1+w1,y1+h1),(0,255,0),-1)
#add text
cv2.putText(frame,status.astype(str),(x1+int(w1/5),y1+int(h1/2)),cv2.FONT_HERSHEY_SIMPLEX,0.7,(0,0,255),2)
cv2.imshow('handwritten Digits Recognition Test',frame)
if cv2.waitKey(2) & 0xFF==ord('q'):
break
cap.replease()
cv2.destroyAllwimdows()
这个你们自己玩去吧,我就不贴结果了。