实验内容

输入图像:普通A4纸,上面有手写的如下信息:

  1. 学号
  2. 手机号
  3. 身份证号

所有输入格式一致,数字号码不粘连,但是拍照时可能角度不正。

输出:

  1. 根据标准流程输出每一个主要步骤的结果,包括A4纸张的矫正结果,行数据的切割,单个字符的切割结果。
  2. 对A4纸的四个角、学号、手机号、身份证号进行识别,识别结果保存到Excel表格。

实验步骤

  1. 边缘检测

    在之前的学习中采用了canny算子或者是图像分割来获得边缘。由于A4纸的边缘比较明显,这里可以采用更简单的prewitt算子,只计算像素上下和左右的梯度,加快运算速度。可以看到效果还是很好。

  2. 角点检测

    采用之前霍夫变换的代码,将图像变换到霍夫空间,检测出直线,再计算交点的坐标,输出到文件point.txt中。

  3. A4纸矫正

    获得角点坐标后,利用透视变换的公式对每个像素进行处理。最后结果保存在result/fixed文件夹中。

  4. 二值化

    由于图像的文字和背景的灰度值并没有很好的区分开,所以使用全局阈值是不行的。这里采用了wellner自适应二值化算法。 算法基本的细想就是遍历图像,计算一个移动的平均值。如果某个像素明显的低于这个平均值,则设置为黑色,否则设置为白色。

  5. 行分割

    基于垂直方向的直方图,把原图分割为多个子图,每个子图包含一行数字。计算每一行黑色像素的数量,会出现峰和谷,谷的地方就是分割线的地方。结果保存在result/divideY文件夹中。

  6. 列分割

    同样的方法,基于水平方向的直方图,把行子图分割为多个子图,每个子图包含一个数字。结果保存在divide文件夹中。

  7. 膨胀

    在二值化的时候,有可能出现字符断裂的情况,使用滤波器进行膨胀操作来扩张字符。

  8. 对每张子图,用连通区域标记的方法从左到右分割数字。同时还需要把图片取反,因为mnist训练集的数据是黑底白字的。结果保存在result/number文件夹中。每一行数字存在了一个文件夹中。

  9. 预测

    使用MNIST数据集进行测试,尝试了adaBoost和svm两种模型,发现还是adaBoost对自己的数据集的识别准确率高一点,而且训练速度较快。结果保存在number.xlsx中。

结果分析

10张图片

A4纸矫正和角点的检测全部正确,在行分割时对于倾斜的文字,如图9,有两行因为倾斜角度较大,通过垂直方向直方图没有办法很好区分开,其他全部正确。对于单个数字的切分基本正确,有个别数字因为两部分间隔较大被切分成了两个数字。

在数字识别的准确率上不太理想,单个字符的准确率在80%左右,没有能够实现一张图片完全识别正确。

81张图片

A4纸的矫正和角点的检测全部正确,但是部分图片的行分割出现了大于三行的情况,因为在二值化时,由于图片变化较大,有些图片还保留了一些除手写字符以外的黑色像素。还有一个原因是字符离边框较近,没有办法通过裁掉边框过滤一些无关的黑色像素。但是这些错误的行都出现在正确的行后面,在最后预测结果时只保留前面三列就可以了。

在数字的识别上面,由于这次的数字像素较小,resize后字迹更粗,与MNIST训练集更相似,所以识别率较之前更高,达到了90%左右,但是这样的准确率对于整张A4纸的识别来说准确率还是较低。

adaBoost

算法原理

具体说来,整个Adaboost 迭代算法就3步:

  1. 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
  2. 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
  3. 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。

算法实现

使用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]相关推荐

  1. GAN变种ACGAN利用手写数字识别mnist生成手写数字

    1.摘要 本文主要讲解:GAN变种ACGAN利用手写数字识别mnist数据集进行训练,最终生成手写数字图片 主要思路: Initialize generator and discriminator I ...

  2. Pytorch实战1:LeNet手写数字识别 (MNIST数据集)

    版权说明:此文章为本人原创内容,转载请注明出处,谢谢合作! Pytorch实战1:LeNet手写数字识别 (MNIST数据集) 实验环境: Pytorch 0.4.0 torchvision 0.2. ...

  3. Keras搭建CNN(手写数字识别Mnist)

    MNIST数据集是手写数字识别通用的数据集,其中的数据是以二进制的形式保存的,每个数字是由28*28的矩阵表示的. 我们使用卷积神经网络对这些手写数字进行识别,步骤大致为: 导入库和模块 我们导入Se ...

  4. Python 手写数字识别 MNIST数据集下载失败

    目录 一.MNIST数据集下载失败 1 失败的解决办法(经验教训): 2 亲测有效的解决方法: 一.MNIST数据集下载失败 场景复现:想要pytorch+MINIST数据集来实现手写数字识别,首先就 ...

  5. 使用Pytorch实现手写数字识别(Mnist数据集)

    目标 知道如何使用Pytorch完成神经网络的构建 知道Pytorch中激活函数的使用方法 知道Pytorch中torchvision.transforms中常见图形处理函数的使用 知道如何训练模型和 ...

  6. tensorflow实现手写数字识别(MNIST)

    手写数字图片数字集       机器学习需要从数据中间学习,因此首先需要采集大量的真实样本数据.以手写的数字图片识别为例,我们需要收集大量的由真人书写的0-9的数字图片,为了便于存储和计算,一般把收集 ...

  7. keras库的安装及使用,以全连接层和手写数字识别MNIST为例

    1.什么是keras 什么是keras? keras以TensorFlow和Theano作为后端封装,是一个专门用于深度学习的python模块. 包含了全连接层,卷积层,池化层,循环层,嵌入层等等等, ...

  8. 手写数字识别MNIST数据集下载百度网盘链接快速下载

    介绍 MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片. 下载 官方链接:http://ya ...

  9. linux手写数字识别,mnist手写数字识别与图片预处理

    用户mnist训练了一个模型,想用自己的图片进行测试,需要将自己的图片进行预处理为mnist需要的1*784的二维张量. 因为MNIST数据是28*28的黑底白字图像,而且输入时要将其拉直,也就是可以 ...

  10. 莫烦keras学习代码二(手写数字识别MNIST classifier CNN版)

    知道了CNN的原理,同样是只要将之前用tensorflow写的几个建立网络的函数用keras的更简单的方法替换就行. 训练结果: 用Sequential().add()添加想要的层,添加卷积层就用Co ...

最新文章

  1. Mysql 中文乱码问题完美解决方案
  2. maven修改setting文件后重启_Maven项目构建
  3. 创业者应具备的基本商业知识
  4. 深度学习笔记-卷积神经网络CNN与循环神经网络RNN有什么区别?
  5. Swagger与Springboot集成restful进行接口测试
  6. c++ 写入文件_利用Python把数据存储在csv文件中
  7. 计算机组成原理 第七章 输入输出系统
  8. 电脑怎么进入linux系统,Linux操作系统进入家用电脑成为发展新前景
  9. arcgis裁剪失败
  10. 宏文件下载_新星邮件速递专家2021免费版-新星邮件速递专家2021正式版下载
  11. 软件企业出口退税计算机题,出口退税计算题解析
  12. 前端js实现文字自动转拼音方法
  13. ERP系统中的工作流和业务流
  14. android html footer 固定,HTML5+CSS把footer固定在底部
  15. PHP脚本中的两种换行符的区别
  16. 03 A股10个月争取翻10倍实盘操作记录(第1周-休养生息,守株待兔)
  17. Spring Kafka实战(3)—message listener创建方式探讨
  18. 谭宏川老师(Samuel Tan)专业化销售技术提升专家
  19. golang实现iris框架最小功能的mvc
  20. 51Sim-One V2X车联网标准与发展系列文章

热门文章

  1. excel数据透视表_标准化Excel数据透视表的数据
  2. Spring+Mybatis项目:人员管理系统
  3. 图片转pdf格式怎么弄?
  4. 广西大学计算机与学院许嘉,许嘉:十二载职业成长,CCF伴我同行
  5. matlab 厂商,MATLAB
  6. 亚马逊类目修改之关于换小类拿BSR!
  7. 程序员的“墨菲定理”
  8. 车道图新方案!LaneGAP:基于路径的在线车道图构建(华科地平线)
  9. Spring Boot 系列学习教程
  10. YOLOv5 gpu 训练自定义模型 训练