手写数字识别 [MNIST+CV+AdaBoost]
实验内容
输入图像:普通A4纸,上面有手写的如下信息:
- 学号
- 手机号
- 身份证号
所有输入格式一致,数字号码不粘连,但是拍照时可能角度不正。
输出:
- 根据标准流程输出每一个主要步骤的结果,包括A4纸张的矫正结果,行数据的切割,单个字符的切割结果。
- 对A4纸的四个角、学号、手机号、身份证号进行识别,识别结果保存到Excel表格。
实验步骤
边缘检测
在之前的学习中采用了canny算子或者是图像分割来获得边缘。由于A4纸的边缘比较明显,这里可以采用更简单的prewitt算子,只计算像素上下和左右的梯度,加快运算速度。可以看到效果还是很好。
角点检测
采用之前霍夫变换的代码,将图像变换到霍夫空间,检测出直线,再计算交点的坐标,输出到文件point.txt中。
A4纸矫正
获得角点坐标后,利用透视变换的公式对每个像素进行处理。最后结果保存在result/fixed文件夹中。
二值化
由于图像的文字和背景的灰度值并没有很好的区分开,所以使用全局阈值是不行的。这里采用了wellner自适应二值化算法。 算法基本的细想就是遍历图像,计算一个移动的平均值。如果某个像素明显的低于这个平均值,则设置为黑色,否则设置为白色。
行分割
基于垂直方向的直方图,把原图分割为多个子图,每个子图包含一行数字。计算每一行黑色像素的数量,会出现峰和谷,谷的地方就是分割线的地方。结果保存在result/divideY文件夹中。
列分割
同样的方法,基于水平方向的直方图,把行子图分割为多个子图,每个子图包含一个数字。结果保存在divide文件夹中。
膨胀
在二值化的时候,有可能出现字符断裂的情况,使用滤波器进行膨胀操作来扩张字符。
对每张子图,用连通区域标记的方法从左到右分割数字。同时还需要把图片取反,因为mnist训练集的数据是黑底白字的。结果保存在result/number文件夹中。每一行数字存在了一个文件夹中。
预测
使用MNIST数据集进行测试,尝试了adaBoost和svm两种模型,发现还是adaBoost对自己的数据集的识别准确率高一点,而且训练速度较快。结果保存在number.xlsx中。
结果分析
10张图片
A4纸矫正和角点的检测全部正确,在行分割时对于倾斜的文字,如图9,有两行因为倾斜角度较大,通过垂直方向直方图没有办法很好区分开,其他全部正确。对于单个数字的切分基本正确,有个别数字因为两部分间隔较大被切分成了两个数字。
在数字识别的准确率上不太理想,单个字符的准确率在80%左右,没有能够实现一张图片完全识别正确。
81张图片
A4纸的矫正和角点的检测全部正确,但是部分图片的行分割出现了大于三行的情况,因为在二值化时,由于图片变化较大,有些图片还保留了一些除手写字符以外的黑色像素。还有一个原因是字符离边框较近,没有办法通过裁掉边框过滤一些无关的黑色像素。但是这些错误的行都出现在正确的行后面,在最后预测结果时只保留前面三列就可以了。
在数字的识别上面,由于这次的数字像素较小,resize后字迹更粗,与MNIST训练集更相似,所以识别率较之前更高,达到了90%左右,但是这样的准确率对于整张A4纸的识别来说准确率还是较低。
adaBoost
算法原理
具体说来,整个Adaboost 迭代算法就3步:
- 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
- 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
- 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
算法实现
使用Python sklearn包中的AdaBoostClassifier函数进行adaboost的训练和识别。
AdaBoostClassifier参数:
- base_estimator:弱分类器的类型,默认为CART决策树
- DecisionTreeClassifier algorithm: scikit-learn实现了两种Adaboost分类算法,SAMME和SAMME.R。两者的主要区别是弱学习器权重的度量,默认为SAMME.R
- n_estimators: 最大迭代次数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是50。
- learning_rate:每个弱学习器的权重缩减系数。对于同样的训练集拟合效果,较小的νν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。默认为1。
DecisionTreeClassifier参数:
- max_features: 划分时考虑的最大特征数。默认是"None",意味着划分时考虑所有的特征数
- max_depth:决策树最大深度。默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。
- min_samples_split:内部节点再划分所需最小样本数
- min_samples_leaf: 叶子节点最少样本数
t = time()model = AdaBoostClassifier(base_estimator=DecisionTreeClassifier(splitter='random', max_features=90, max_depth=50, min_samples_split=6,min_samples_leaf=3), n_estimators=1200, learning_rate=0.005)# 拟合训练数据集model.fit(train_X, train_Y)joblib.dump(model, 'save/adaboost.pkl')# 预测训练集train_Y_hat = model.predict(train_X[idx])print("训练集精确度: ", accuracy_score(train_Y[idx], train_Y_hat))# 预测测试集test_Y_hat = model.predict(test_X)print("测试集精确度: ", accuracy_score(test_Y, test_Y_hat))print("总耗时:", time() - t, "秒")# 绘制ROC曲线n_class = len(np.unique(train_Y))roc.drawROC(n_class, test_Y, test_Y_hat)
对MNIST数据集的测试结果
代码地址
Github
参考资料
https://blog.csdn.net/qq_33000225/article/details/73123880
https://github.com/haidawyl/Mnist
手写数字识别 [MNIST+CV+AdaBoost]相关推荐
- GAN变种ACGAN利用手写数字识别mnist生成手写数字
1.摘要 本文主要讲解:GAN变种ACGAN利用手写数字识别mnist数据集进行训练,最终生成手写数字图片 主要思路: Initialize generator and discriminator I ...
- Pytorch实战1:LeNet手写数字识别 (MNIST数据集)
版权说明:此文章为本人原创内容,转载请注明出处,谢谢合作! Pytorch实战1:LeNet手写数字识别 (MNIST数据集) 实验环境: Pytorch 0.4.0 torchvision 0.2. ...
- Keras搭建CNN(手写数字识别Mnist)
MNIST数据集是手写数字识别通用的数据集,其中的数据是以二进制的形式保存的,每个数字是由28*28的矩阵表示的. 我们使用卷积神经网络对这些手写数字进行识别,步骤大致为: 导入库和模块 我们导入Se ...
- Python 手写数字识别 MNIST数据集下载失败
目录 一.MNIST数据集下载失败 1 失败的解决办法(经验教训): 2 亲测有效的解决方法: 一.MNIST数据集下载失败 场景复现:想要pytorch+MINIST数据集来实现手写数字识别,首先就 ...
- 使用Pytorch实现手写数字识别(Mnist数据集)
目标 知道如何使用Pytorch完成神经网络的构建 知道Pytorch中激活函数的使用方法 知道Pytorch中torchvision.transforms中常见图形处理函数的使用 知道如何训练模型和 ...
- tensorflow实现手写数字识别(MNIST)
手写数字图片数字集 机器学习需要从数据中间学习,因此首先需要采集大量的真实样本数据.以手写的数字图片识别为例,我们需要收集大量的由真人书写的0-9的数字图片,为了便于存储和计算,一般把收集 ...
- keras库的安装及使用,以全连接层和手写数字识别MNIST为例
1.什么是keras 什么是keras? keras以TensorFlow和Theano作为后端封装,是一个专门用于深度学习的python模块. 包含了全连接层,卷积层,池化层,循环层,嵌入层等等等, ...
- 手写数字识别MNIST数据集下载百度网盘链接快速下载
介绍 MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片. 下载 官方链接:http://ya ...
- linux手写数字识别,mnist手写数字识别与图片预处理
用户mnist训练了一个模型,想用自己的图片进行测试,需要将自己的图片进行预处理为mnist需要的1*784的二维张量. 因为MNIST数据是28*28的黑底白字图像,而且输入时要将其拉直,也就是可以 ...
- 莫烦keras学习代码二(手写数字识别MNIST classifier CNN版)
知道了CNN的原理,同样是只要将之前用tensorflow写的几个建立网络的函数用keras的更简单的方法替换就行. 训练结果: 用Sequential().add()添加想要的层,添加卷积层就用Co ...
最新文章
- Mysql 中文乱码问题完美解决方案
- maven修改setting文件后重启_Maven项目构建
- 创业者应具备的基本商业知识
- 深度学习笔记-卷积神经网络CNN与循环神经网络RNN有什么区别?
- Swagger与Springboot集成restful进行接口测试
- c++ 写入文件_利用Python把数据存储在csv文件中
- 计算机组成原理 第七章 输入输出系统
- 电脑怎么进入linux系统,Linux操作系统进入家用电脑成为发展新前景
- arcgis裁剪失败
- 宏文件下载_新星邮件速递专家2021免费版-新星邮件速递专家2021正式版下载
- 软件企业出口退税计算机题,出口退税计算题解析
- 前端js实现文字自动转拼音方法
- ERP系统中的工作流和业务流
- android html footer 固定,HTML5+CSS把footer固定在底部
- PHP脚本中的两种换行符的区别
- 03 A股10个月争取翻10倍实盘操作记录(第1周-休养生息,守株待兔)
- Spring Kafka实战(3)—message listener创建方式探讨
- 谭宏川老师(Samuel Tan)专业化销售技术提升专家
- golang实现iris框架最小功能的mvc
- 51Sim-One V2X车联网标准与发展系列文章