基于深层卷积网络的手写数字识别 minist_「Tensorflow」基于CNN的数字OCR识别

导读

对于人类来说,识别手写的数字是一件非常容易的事情。我们甚至不用思考,就可以看出下面的数字分别是1,2,3。

da2156d21fcf2e815ad3ee03edf4b0ee.png

那机器如何来识别数字?

本期将使用Tensorflow搭建卷积神经网络,进行手写数字的识别。代码可关注同名ghz,后台回复「手写数字识别」即可免费获取。

本系列文章

Part1:基于CNN的数字OCR识别

part2:基于CNN的汉字识别

预处理

对于手写数字的初始图片如下所示。在搭建网络前我们需要对其进行预处理。

a1081c64a8ee4e00207747111d5c3897.png

▌读入图片并进行二值化

图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('s.png')
lowerb = (0,0,116)
upperb = (255,255,255)
back_mask = cv2.inRange(cv2.cvtColor(img, cv2.COLOR_BGR2HSV), lowerb, upperb)
cv2.imwrite(s2.png', back_mask)

8e3e44ce5d0fa79caabe9349e50e5e17.png

▌腐蚀与反色

形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算;先腐蚀后膨胀的过程称为开运算。

# 形态学操作, 圆形核腐蚀
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
back_mask = cv2.erode(back_mask, kernel, iterations=1)
# 反色 变为数字的掩模
num_mask = cv2.bitwise_not(back_mask)

▌中值滤波

中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。

# 中值滤波
num_mask = cv2.medianBlur(num_mask,3) 
cv2.imwrite('s3', num_mask)

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,其基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。

以上结果运行如下:

b07870dcc762dea3bc22990b26a3c927.png

图像分割

读入图片,进行二值化操作,通过外接矩形获得轮廓的位置信息,提取数字轮廓的图片,与索引组成轮廓信息的字典,循环轮廓,使用外接矩形的位置信息参数并获得分割数字。

# 寻找轮廓
bimg, contours, hier = cv2.findContours(num_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours_sort(contours)canvas = cv2.cvtColor(num_mask, cv2.COLOR_GRAY2BGR)
def getStandardDigit(img):STD_WIDTH = 32 # 标准宽度STD_HEIGHT = 64height,width = img.shape# 判断是否存在长条的1new_width = int(width * STD_HEIGHT / height)if new_width > STD_WIDTH:new_width = STD_WIDTH# 以高度为准进行缩放resized_num = cv2.resize(img, (new_width,STD_HEIGHT), interpolation = cv2.INTER_NEAREST)# 新建画布canvas = np.zeros((STD_HEIGHT, STD_WIDTH))x = int((STD_WIDTH - new_width) / 2) canvas[:,x:x+new_width] = resized_numreturn canvasminWidth = 5 # 最小宽度
minHeight = 20 # 最小高度base = 1000 # 计数编号
imgIdx = base # 当前图片的编号# 检索满足条件的区域
for cidx,cnt in enumerate(contours):(x, y, w, h) = cv2.boundingRect(cnt)if w < minWidth or h < minHeight:# 如果不满足条件就过滤掉continue# 获取ROI图片digit = num_mask[y:y+h, x:x+w]digit = getStandardDigit(digit)cv2.imwrite('./digits_bin/{}.png'.format(imgIdx), digit)imgIdx+=1# 原图绘制圆形cv2.rectangle(canvas, pt1=(x, y), pt2=(x+w, y+h),color=(0, 255, 255), thickness=2)  
cv2.imwrite('ss.png', canvas)

▌获取数字位置信息

ede79e30efd27c5bf04a122804c8e08d.png

▌获取单张图片

1447f8d979fa5d70cc9c415202bfdc3b.png

卷积神经网络

通过上述操作,我们可以对图片中的数字进行提取。在将图片传入网络前,我们需要进行网络的搭建。卷积神经网络(CNN)是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一 。卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络。

79eb850012597acb83a6cfb3421d9970.png

卷积神经网络与普通神经网络非常相似,它们都由具有可学习的权重和偏置常量(biases)的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的分数,普通神经网络里的一些计算技巧到这里依旧适用。

卷积神经网络利用输入图片的特点,把神经元设计成三个维度:width, height, depth。一个卷积神经网络由很多层组成,它们的输入是三维的,输出也是三维的,有的层有参数,有的层不需要参数。

▌核心代码

model = Sequential()
model.add(Conv2D(filters= 32, kernel_size=(5,5), padding='Same', activation='relu',input_shape=(28,28,1)))
model.add(Conv2D(filters= 32, kernel_size=(5,5), padding='Same', activation='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))  
model.add(Conv2D(filters= 64, kernel_size=(3,3), padding='Same', activation='relu'))
model.add(Conv2D(filters= 64, kernel_size=(3,3), padding='Same', activation='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))    
model.add(Dropout(0.25))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(x=x_Train_normalize,y=y_train,epochs = 10,batch_size = 200)
model.save('minst.h5')

迭代结果

Train on 60000 samples
Epoch 1/10
60000/60000 [==============================] - 207s 3ms/sample - loss: 0.2343 - accuracy: 0.9249
Epoch 2/10
60000/60000 [==============================] - 179s 3ms/sample - loss: 0.0600 - accuracy: 0.9818
Epoch 3/10
60000/60000 [==============================] - 182s 3ms/sample - loss: 0.0438 - accuracy: 0.9868
Epoch 4/10
60000/60000 [==============================] - 188s 3ms/sample - loss: 0.0345 - accuracy: 0.9895
Epoch 5/10
60000/60000 [==============================] - 180s 3ms/sample - loss: 0.0296 - accuracy: 0.9910
Epoch 6/10
60000/60000 [==============================] - 187s 3ms/sample - loss: 0.0262 - accuracy: 0.9922
Epoch 7/10
60000/60000 [==============================] - 172s 3ms/sample - loss: 0.0218 - accuracy: 0.9930
Epoch 8/10
60000/60000 [==============================] - 171s 3ms/sample - loss: 0.0204 - accuracy: 0.9934
Epoch 9/10
60000/60000 [==============================] - 195s 3ms/sample - loss: 0.0177 - accuracy: 0.9938
Epoch 10/10
60000/60000 [==============================] - 170s 3ms/sample - loss: 0.0175 - accuracy: 0.9942

▌模型结构

da14816a0d1e0ca0055501542cc3a9f6.png

数字识别

通过上述操作,我们已经搭建好卷积神经网络,并且用MNIST进行了模型的训练。MNIST由70000张手写数字(0~9)图片组成,每张图片的大小是28 x 28像素,数字的大小是20 x 20,位于图片的中心

当前我们提取的图片特征与其有出入,如下图。为了得到与其近似的图片,我们还需要将提取的数字图片缩放为28*28大小。

cd1c3eb49787a80c9e062963cb341903.png

▌核心代码

def plot_image(image):fig=plt.gcf()fig.set_size_inches(2,2)plt.imshow(image,cmap=plt.cm.binary)plt.show()for xx in range(11):num_mask = cv2.imread('./pig/{}.png'.format(xx),0)num_mask = cv2.resize(num_mask,(28,28))plot_image(num_mask)cv2.imwrite('./pngn/{}.png'.format(xx),  num_mask)number.append(num_mask)print(num_mask.shape)

▌运行结果

9aefce51381af4ecfc6477f4a4388264.png

但从mnist数据集考虑特点,其数字位于图片中央,而我们分割出的数字却顶格到图片边缘。对此我们对图片进行优化。

db283d00027bcb1a32ef6b27509bc9d9.png

▌核心代码

img28 = np.zeros([28, 28], np.uint8)
cv2.imwrite('./img28.png',  img28)for xx in range(11):num_mask = cv2.imread('./pig/{}.png'.format(xx),0)num_mask = cv2.resize(num_mask,(20,20))img28 = Image.open('./img28.png')num_mask = Image.open('./pngn/{}.png'.format(xx))img28.paste(num_mask,(4,4))plot_image(img28)img28 = cv2.cvtColor(np.asarray(img28),cv2.COLOR_RGB2BGR)  cv2.imwrite('./pic/{}.png'.format(xx),  img28)

▌运行结果

2e558e68f4631fe1963751728ac9eeef.png

最后我们便可以加载训练的模型,对上面提取、处理的图片进行识别。

▌核心代码

number2 = np.array(number)
print(number2.shape)
testingNorm  = number2.reshape(11,28,28,1).astype('float32')
model = keras.models.load_model('minst.h5')
result=model.predict_classes(testingNorm)
print(result)sum = 0
re = [1,7 ,8 ,5, 3, 5, 9, 1, 2, 3, 4]
for i in range(0,len(result)):if result[i] == re[i]:sum += 1
sum /= len(result)
print("sum=", sum)
with open("reuslt.txt","w") as f:f.write(str(result))

▌运行结果

(11, 28, 28)
[1 7 8 5 3 5 9 1 2 3 4]
sum= 1.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年5G创新深度研究报告

来源&#xff1a;中信建投从历史上看&#xff0c;每一轮科技产业创新周期均主要由通信代际升级驱动&#xff0c;历时 5-8 年。我们认为 2017-2019 年为 4G 时代的稳定成熟期&#xff0c;而进入 2020 年&#xff0c;运营商加速投入 5G 网络建设&#xff0c;科技软硬件有望在运营…

鹰眼系统原理_山东首家露天焚烧鹰眼监控系统在我镇投入使用

露天冒烟着火&#xff0c;不用人员到现场&#xff0c;电子围栏就会锁定目标&#xff0c;自动报警&#xff0c;提醒监管人员立即现场处置。日前&#xff0c;莱西市院上镇新安装建设的污染源鹰眼监控系统投入使用&#xff0c;实现了环境监控全方位、自动化。据了解&#xff0c;这…

机器人的工作原理,这是我见过最详细的解析!

来源&#xff1a;网络很多人一听到“机器人”这三个字脑中就会浮现“外形酷炫”、“功能强大”、“高端”等这些词&#xff0c;认为机器人就和科幻电影里的“终结者”一样高端炫酷。其实不然&#xff0c;在本文中&#xff0c;我们将探讨机器人学的基本概念&#xff0c;并了解机…

linux mint 图标主题_如何在 Linux Mint 中更换主题

一直以来&#xff0c;使用 Cinnamon 桌面环境的 Linux Mint 都是一种卓越的体验。这也是为何我喜爱 Linux Mint的主要原因之一。-- Its Foss&#xff08;作者&#xff09;一直以来&#xff0c;使用 Cinnamon 桌面环境的 Linux Mint 都是一种卓越的体验。这也是为何我喜爱 Linux…

服务器物品展示框刷物品,我的世界1period;11period;2展示框刷物品bug | 手游网游页游攻略大全...

发布时间&#xff1a;2017-09-25我的世界惊现全新无限刷物品bug 服主大大都要注意了.那今天给大家分享一个玩家无意间发现的新的无限刷物品bug,而且还是在服务器中哦!那感兴趣的玩家不妨进来看看哦! 在一个rpg服务器玩 开小号召唤boss的时候发现的. ...标签&#xff1a;我的世界…

Nature:揭示人大脑类器官为何缺乏正常人脑特有的细胞亚型和复杂回路

来源&#xff1a;生物谷作为在实验室中通常利用人类干细胞培育出的大脑样组织三维球体&#xff0c;大脑类器官被吹捧为有潜力让科学家们在受控的实验室条件下研究大脑回路的形成。关于大脑类器官的讨论非常热闹&#xff0c;一些科学家认为它们将使得快速开发针对破坏性的脑部疾…

anaconda 怎么安装xlrd_Pyinstaller打包,文件太大了怎么办?

这是一个很长的故事&#xff0c;嫌长的直接看最后的结论事情经过上周接了个需求&#xff0c;写了个小工具给客户&#xff0c;他要求打包成exe文件&#xff0c;这当然不是什么难事。因为除了写Python的&#xff0c;绝大多数人电脑里都没有Python编译器&#xff0c;所以打包成exe…

android checkbox 选中事件_使用Vue3.0新特性造轮子 WidgetUI3.0 (Checkbox复选框组件)

"title"标题示例代码&#xff1a;data [ { title: 新日小卫士二代, }, { title: 车子质量不合格, }, { title: 我买的骑士1号仪表台进水怎么回事&#xff1f;, }, { title: 风雅欧妮大灯高低调节, }]"title"标题和"desc"描…

服务器装系统用哪个好,服务器系统重装用哪个系统

服务器系统重装用哪个系统 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。重装裸金属服务器的操作系统。快速发放裸金属服务器支持…

2020图机器学习GNN的四大研究趋势

来源&#xff1a;专知【导读】以图神经网络为代表的图机器学习在近两年成为研究热点之一。近日&#xff0c;图机器学习专家 Sergei Ivanov 为我们解读了他总结出来的 2020 年图机器学习的四大热门趋势&#xff0c;包括图神经网络的理论理解、应用普及、应用、图嵌入框架&#x…

c++ 将文件内容输出到word上_原来PDF转Word可以这么简单,只需要一个键!办公起来真方便...

在职场办公中&#xff0c;我们经常接触到PDF文件&#xff0c;如果让你把PDF转换成Word&#xff0c;你还在束手无策吗&#xff1f;今天就来教你3种方法&#xff0c;如何将PDF转换成Word。01.复制粘贴法相信很多新手都只会【CtrlC/V】&#xff0c;虽然PDF文件不能直接被修改&…

python的类和实例_Python使用类和实例

我们可以使用类来模拟现实世界中的很多情景。类编写好后&#xff0c;你的大部分时间都将花在使用根据类创建的实例上。你需要执行的一个重要任务是修改实例的属性。你可以直接修改实例的属性&#xff0c;也可以编写方法以特定的方式进行修改。 Car类 下面来编写一个表示汽车的类…

iApp最新版无服务器多功能软件库源码

无需服务器的多功能软件库源码分享&#xff0c;仅需添加一个后台应用和一个文档即可 使用教程如下&#xff1a; 在浏览器中打开理想后台地址&#xff1a;http://apps.xiaofei.run/user/ 如果没有账号&#xff0c;请注册一个免费账号。 登录账号后&#xff0c;添加一个后台应…

rpc协议微服务器,RPC协议及实现方式(分布式微服务治理的核心)

分布式微服务治理的核心在于: 微服务和分布式(微服务框架)微服务的最优技术实现目前是: SpringBoot(RPC 框架)分布式的最优技术实现目前是: Thrift,Motan,Dubbo,Spring Cloud(Netflix OSS),Finagle,gRPCRPC 是什么RPC 的全称是 Remote Procedure Call &#xff0c;是一种进程间…

2019年度全球工程前沿研究报告

来源&#xff1a;JAS自动化学报英文版1. 工程研究前沿1.1 Top 10 工程研究前沿发展态势信息与电子工程领域 Top 10 工程研究前沿涉及电子科学与技术、光学工程与技术、仪器科学与技术、信息与通信工程、计算机科学与技术、控制科学与技术等学科方向。其中&#xff0c;“面向光互…

python取数字第一位数_python基础:8.切片和缩进

0.前言如果可以的话&#xff0c;请先关注&#xff08;专栏和账号&#xff09;&#xff0c;然后点赞和收藏&#xff0c;最后学习和进步。你的支持是我继续写下去的最大动力&#xff0c;个人定当倾囊而送&#xff0c;不负所望。谢谢&#xff01;&#xff01;&#xff01;1.前提基…

python图像_Python图像处理库(PIL)

Python Imaging Library为您的python程序添加图像处理能力。这个库提供广泛的文件格式支持、高效的内部表示和相当强大的图像处理能力。 核心图像库是为快速访问几种基本像素格式图像设计的。它能为一般的图像处理工具提供一个可靠的基础。 这个Pythonic library可以 装载和保存…

怎么开通手机信息服务器,如何用手机建立网站

如何用手机建立网站 内容精选换一换本文以营销版网站配置为例&#xff0c;介绍如何通过云速建站服务快速创建一个网站。云速建站操作简单方便&#xff0c;只需四步&#xff0c;就可以轻松创建一个网站。建站流程开通网站&#xff1a;包括购买营销版站点、购买精美模板(可选)和安…

cmd测试cuda安装_安装:anaconda+cuda+pytorch+pycharm

每次安装都要在网上各种搜索&#xff0c;为了下次安装的时候简单一点&#xff0c;把对我安装帮助较大的链接整理了一下&#xff0c;整个过程仅供参考&#xff1a;除了pycharm&#xff0c;其他位置均不建议更改默认位置&#xff0c;建议全程可开着cmd1、anaconda安装直接下载&am…

AI会完美的执行我们设定的目标,但这不是一个好消息

来源&#xff1a;混沌巡洋舰导读&#xff1a; 科普网站quanta magazine上一篇名为 Artificial Intelligence Will Do What We Ask. That’s a Problem的文&#xff0c;是关于AI与人际交互时&#xff0c;如何满足更好的理解人类需求。该文的核心观点是&#xff1a;通过教机器理解…