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. jenkins无法显示html样式问题解决

    利用jenkins的以下两个插件可以巧妙解决这个问题 Startup Trigger: 可实现在Jenkins节点(master/slave)启动时触发构建: Groovy plugin: 可实现直接 ...

  2. java_第一年_JDBC(5)

    事务概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功: 开始事务:start transaction 提交事务:commit 回滚事务:rollback 事务的四大特 ...

  3. Codeforces 840C 题解(DP+组合数学)

    题面 传送门:http://codeforces.com/problemset/problem/840/C C. On the Bench time limit per test2 seconds m ...

  4. Java JDK在Mac下的配置方法

    Java JDK在Mac.Windows下的配置方法 Mac 第一步:下载JDK 官网下载地址 第二步:安装JDK 安装步骤很简单,一直点击下一步即可. 第三步:配置环境变量 打开terminal(终 ...

  5. char 指针如何判断字符串需要输出长度

    先上代码: #include <stdio.h> #include <string.h> ] = "; int func1(const char *ip) { pri ...

  6. 获取Http请求IP的工具类

    public class IpAddressUtil { public static String getIpAddr(HttpServletRequest request){ String ipAd ...

  7. python常用函数 Y

    yield有点像return,但他会在下一次执行的时候从上次结束点继续执行,带有 yield 的函数在 Python 中被称之为 generator(生成器),生成器无法通过索引获取数据,同时也承诺使 ...

  8. simrank python实现

    1.数据 pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp ...

  9. frugally-deep: Header-only library for using Keras models in C++

    // Convenience wrapper around predict for models with // single tensor outputs of shape (1, 1, 1), / ...

  10. 简单的使用redis

    心不慌手不抖我们跟着大哥走 https://blog.csdn.net/zhangcongyi420/article/details/82686702