http://wenku.baidu.com/link?url=HQ-5tZCXBQ3uwPZQECHkMCtursKIpglboBHq416N-q2WZupkNNH3Gv4vtEHyPULezDb50ZcKor41PEikwv5TfTqwrsQ4-9wmH06L7bYD04u

用BP人工神经网络识别手写数字

yzw20091201上传于2013-01-31|暂无评价|356人阅读|13次下载|暂无简介|举报文档

   在手机打开
 

赖勇浩(

 

http://laiyonghao.com

这是我读工程硕士的时候完成课程作业时做的,

放在

 

dropbox

的角落中生尘已经有若干年

头了,

最近

 

@shugelee

同学突然来了兴致搞验证码识别,

问到我的时候我记起自己做过一

点点东西,特发上来给他参考,并趁机补充了一下《

Python

也可以》系列。

图像预处理

使用下图(后方称为

SAMPLE_BMP

)作为训练和测试数据来源,

下文将讲述如何将图像转换为训练数据。

 

灰度化和二值化

在字符识别的过程中,

识别算法不需要关心图像的彩色信息。

因此,

需要将彩色图像转化为

灰度图像。

经过灰度化处理后的图像中还包含有背景信息。

因此,我们还得进一步处理,

背景噪声屏蔽掉,

突显出字符轮廓信息。

二值化处理就能够将其中的字符显现出来,

并将背

景去除掉。在一个

[0

255]

灰度级的灰度图像中,我们取

196

为该灰度图像的归一化值,

代码如下:

[python]

view plaincopy

1.

def

convert_to_bw(im):

2.

im = im.convert("L")

3.

im.save("sample_L.bmp")

4.

im = im.point(

lambda

x: WHITE

if

x > 196

else

BLACK)

5.

im = im.convert('1')

6.

im.save("sample_1.bmp")

7.

return

im

下图是灰度化的图像,可以看到背景仍然比较明显,有一层淡灰色:

 

下图是二值化的图像,可以看到背景已经完全去除:

 

图片的分割和规范化:

通过二值化图像,

我们可以分割出每一个字符为一个单独的图片,

然后再计算相应的特征值,

如下图所示:

 

这些图片是由程序自动进行分割而成,其中用到的代码片段如下:

[python]

view plaincopy

1.

def

split(im):

2.

assert

im.mode == '1'

3.

result = []

4.

w, h = im.size

5.

data = im.load()

6.

xs = [0, 23, 57, 77, 106, 135, 159, 179, 205, 228, w]

7.

ys = [0, 22, 60, 97, 150, h]

8.

for

i, x

in

enumerate(xs):

9.

if

i + 1 >= len(xs):

10.

break

11.

for

j, y

in

enumerate(ys):

12.

if

j + 1 >= len(ys):

13.

break

14.

box = (x, y, xs[i+1], ys[j+1])

15.

t = im.crop(box).copy()

16.

box = box + ((i + 1) % 10, )

17.

#           save_32_32(t, 'num_%d_%d_%d_%d_%d'%box)

18.

result.append((normalize_32_32(t, 'num_%d_%d_%d_%d_%d'%box), (i + 1) % 10)

)

19.

return

result

其中的

xs

ys

分别是横向和竖向切割的分界点,由手工测试后指定,

t =

im.crop(box).copy()

代码行是从指定的区域中

“抠”

出图片,

然后通过

normalize_32_32

进行规范化。

进行规范化是为了产生规则的训练和测试数据集,

也是为了更容易地地计算出

特征码。

产生训练数据集和测试数据集

为简单起见,我们使用了最简单的图像特征——黑色像素在图像中的分布来进行训练和测

试。

首先,

我们把图像规范化为

32*32

像素的图片,

然后按

2*2

分切成

16*16

256

子区域,

然后统计这

4

个像素中黑色像素的个数,

组成

256

维的特征矢量,

如下是数字

2

的一个特征矢量:

0 0 4 4 4 2 0 0 0 0 0 0 0 0 2 4 0 0 4 4 4 2 0 0 0 0 0 0 0 0 2 4 2 2 4 4 2 1 0 0 0 0 0 0 1 2

3 4 4 4 4 4 0 0 0 0 0 0 0 0 2 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0

2 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4

4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 4 2 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 4 4 4 2 2 2 2 4 3 2 2

2 2 2 0 2 4 4 4 0 0 0 0 4 2 0 0 0 0 0 0 2 4 4 4 0 0 0 0 4 2 0 0 0 0 0 0 2 4 4 4 0 0 0 0 0 0

0 0 0 0 0 0 2 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 2 4 4 4

相应地,因为我们只需要识别

0~9

10

个数字,所以创建一个

10

维的矢量作为结果,

数字相应的维置为

1

值,其它值为

0

。数字

2

的结果如下:

0 0 1 0 0 0 0 0 0 0

我们特征矢量和结果矢量通过以下代码计算出来后,按

FANN

的格式把它们存到

train.data

中去:

[python]

view plaincopy

1.

f = open('train.data', 'wt')

2.

print

>>f, len(result), 256, 10

3.

for

input, output

in

result:

4.

print

>>f, input

5.

print

>>f, output

BP

神经网络

利用神经网络识别字符是本文的另外一个关键阶段,良好的网络

性能是识别结果可靠性的重要保证。

这里就介绍如何利用

BP

神经网络来识别字符。

反向传

播网络(即:

Back-Propagation Networks ,

简称:

BP

网络)是对非线性可微分函数进行

权值训练的多层前向网络。在人工神经网络的实际应用中,

80%

90%

的模型采用

BP

络。它主要用在函数逼近,模式识别,分类,数据压缩等几个方面,体现了人工神经网络的

核心部分。

网络结构

网络结构的设计是根据输入结点和输出结点的个数和网络性能来决定的,

如下图。

本实验中

的标准待识别字符的大小为

32*32

的二值图像,即将

1024

个像素点的图像转化为一个

256

维的列向量作为输入。由于本实验要识别出

10

个字符,可以将目标输出的值设定为

一个

10

维的列向量,其中与字符相对应那个位为

1

,其他的全为

0

。根据实际经验和试

验确定,本文中的网络隐含层结点数目为

64

。因此,本文中的

BP

网络的结构为

256-64-10

 
 
 

用BP人工神经网络识别手写数字的更多相关文章

  1. Numpy实现简单BP神经网络识别手写数字

    本文将用Numpy实现简单BP神经网络完成对手写数字图片的识别,数据集为42000张带标签的28x28像素手写数字图像.在计算机完成对手写数字图片的识别过程中,代表图片的28x28=764个像素的特征 ...

  2. PyTorch基础——使用卷积神经网络识别手写数字

    一.介绍 实验内容 内容包括用 PyTorch 来实现一个卷积神经网络,从而实现手写数字识别任务. 除此之外,还对卷积神经网络的卷积核.特征图等进行了分析,引出了过滤器的概念,并简单示了卷积神经网络的 ...

  3. 使用TensorFlow的卷积神经网络识别手写数字(2)-训练篇

    import numpy as np import tensorflow as tf import matplotlib import matplotlib.pyplot as plt import ...

  4. 使用TensorFlow的卷积神经网络识别手写数字(3)-识别篇

    from PIL import Image import numpy as np import tensorflow as tf import time bShowAccuracy = True # ...

  5. 使用TensorFlow的卷积神经网络识别手写数字(1)-预处理篇

    功能: 将文件夹下的20*20像素黑白图片,根据重心位置绘制到28*28图片上,然后保存.经过预处理的图片有利于数字的准确识别.参见MNIST对图片的要求. 此处可下载已处理好的图片: https:/ ...

  6. 使用神经网络识别手写数字Using neural nets to recognize handwritten digits

    The human visual system is one of the wonders of the world. Consider the following sequence of handw ...

  7. BP神经网络的手写数字识别

    BP神经网络的手写数字识别 ANN 人工神经网络算法在实践中往往给人难以琢磨的印象,有句老话叫“出来混总是要还的”,大概是由于具有很强的非线性模拟和处理能力,因此作为代价上帝让它“黑盒”化了.作为一种 ...

  8. 利用c++编写bp神经网络实现手写数字识别详解

    利用c++编写bp神经网络实现手写数字识别 写在前面 从大一入学开始,本菜菜就一直想学习一下神经网络算法,但由于时间和资源所限,一直未展开比较透彻的学习.大二下人工智能课的修习,给了我一个学习的契机. ...

  9. 使用神经网络来识别手写数字【译】(三)- 用Python代码实现

    实现我们分类数字的网络 好,让我们使用随机梯度下降和 MNIST训练数据来写一个程序来学习怎样识别手写数字. 我们用Python (2.7) 来实现.只有 74 行代码!我们需要的第一个东西是 MNI ...

随机推荐

  1. Spring MVC-学习笔记(1)认识spring mvc

    1.基于XML Schema.Controller接口的spring mvc简单例子 1>创建一个动态Web项目,选择同时创建web.xml文件 2>在WEB-INF/lib中粘贴spri ...

  2. 五分钟搞懂 Linux 重点知识,傻瓜都能学会!

    来源:无痴迷,不成功 www.cnblogs.com/justmine/p/9053419.html 写在前面 我们都知道Linux是一个支持多用户.多任务的系统,这也是它最优秀的特性,即可能同时有很 ...

  3. impala删表,而hdfs上文件却还在异常处理

    Impala/hive删除表,drop后,hdfs上文件却还在处理方法: 问题原因分析,如下如可以看出一个属组是hive,一个是impala,keberas账号登录hive用户无法删除impala用户 ...

  4. 使用OFBIZ的理由和不使用OFBIZ的理由

    1 使用OFBIZ的理由 1.1 什么是OFBIZ OFBIZ是由Sourceforge维护的一个最著名的开源项目之一,提供创建基于最新J2EE/XML规范和技术标准,构建大型企业级.跨平台.跨数据库 ...

  5. SQL SERVER 数据库跨服务器备份

    原文:https://www.cnblogs.com/jaday/p/6088200.html 需求介绍:每天备份线上正式库并且把备份文件复制到测试服务器,测试服务器自动把数据库备份文件还原. 方案介 ...

  6. 2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板

    基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板 综合图像处理硬件平台包括图像信号处理板2块,视频处理板1块,主控板1块,电源板1块,VPX背 ...

  7. 编译安装github上的kafka_exporter项目

    本文介绍的kafka_exporter是prometheus监控系统中针对kafka的一款监控插件,要使用这个监控插件,kafka的版本需要满足 0.10.1.0 及以上. 项目的github地址:h ...

  8. flask之显示当地时间

    一:在网页上显示时间 flask-moment 程序扩展可以实现 pip install flask-moment # 未完待续

  9. python 中的getattr(),setattr(),hasattr()的方法

    hasattr(object,name) 判断一个对象中是否有name属性或者name方法返回BOOL值,如果有这个属性的话,就返回TRUE,反之,返回FALSE 需要注意的是name要用括号括起来 ...

  10. vue的keep-alive组件

    keep-alive是Vue提供的一个抽象组件,用来对组件进行缓存,从而节省性能,由于是一个抽象组件,所以在v页面渲染完毕后不会被渲染成一个DOM元素 <keep-alive> <l ...