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. Git-第一篇认识git,核心对象,常用命令

    1.git一般使用流程 4大核心对象:工作区.暂存区.本地库.远端库. 2.常用命令 1>git init:初始化本地仓库 2>git clone:克隆仓库到指定地方 3>git a ...

  2. 从头到尾说一次 Java 垃圾回收,写得非常好!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:聂晓龙(花名:率鸽),阿里巴巴高级开发工程 ⬆️ 图片来源于网络 之前上学的时候有这个一个梗,说在食堂里吃饭,吃完把餐 ...

  3. day16 django 笔记

    一 jQuery是什么? [1]   jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. [2]   jQuery是继prototy ...

  4. Appium+Python之批量执行测试用例

    思考:当存在多个脚本,每个脚本中有多条测试用例时,我们该如何批量执行呢?分析:首先创建2个测试用例脚本(.py文件),每个脚本有2条测试用例,然后批量执行全部测试用例 #Test_01.py # co ...

  5. 【CF321E】+【bzoj5311】贞鱼

    决策单调性 + WQS二分 我们首先列出转移式: \(f[i]=Min(f[j]+Sum[j+1 , i])\) 首先我们考虑如果让一段区间的小鱼在一起的代价怎么预处理,我们可以对于一个上三角矩阵求个 ...

  6. python学习第四十九天XML模块的用法

    xml是实现不通语言或程序之间进行数据交换的协议,跟json差不多,但是json用起来简单,还没诞生json,以前都是用xml,下面讲述XML模块的用法. 1,导入xml模块 import xml 2 ...

  7. 如何设置移动端的tab栏

    这是添加tab栏的代码: {                     "id": "tabBar1",                     "st ...

  8. Linux 实操(root密码重置 无法上网 安装xrdp)

    一个是显示器显示不咋地,一个是想远程连接Linux,这样就可以放到下面机房去了.所以想安装一个远程桌面链接.从网上搜了搜,好多.安装的时候需要root权限,但是密码忘了.好吧,开始捣鼓root密码 按 ...

  9. codeforces Summer Earnings(bieset)

    Summer Earnings time limit per test 9 seconds memory limit per test 256 megabytes input standard inp ...

  10. Ubuntu16.04 重新安装误删的某个*.so文件

    在使用Ubuntu系统时,如果不小心将某个*.so文件删除,该如何重新安装呢? 如果直接使用命令:sudo  apt-get  install  *.so 可能会报错或者找不到这个*.so文件. 正确 ...