项目名称:手写数字识别
### 需求概述
-----
该项目是MNIST数据集实现的手写数字图片识别工具,基于tensorflow的框架,通过建立卷积神经网络实现的模型结构,使用选择优化器进行模型训练,将需要好的变量进行保存,在识别手写数字图片的过程中使用原本已经保存好的数据,实现识别手写数字图片的效果。
通过opencv库来处理图片,进行灰度处理,二值化,降噪,以及剪裁图片,完成我们对图片要求的处理。
最终将项目进行封装,封装成库ImgProcess,提供简单易用的验证码识别API,从而方便调用。
### 项目运行环境及技术相关
----
语言:`python2.7`
运行环境: `ubuntu16.04`
深度学习框架: `Tensorflow1.4.0`
图片处理技术: `python-opencv3.4.0`
代码封装: `setuptools(Python2.7.9后自带setuptools无须另外安装)`
图片显示: `Image`
### 项目功能描述
-----
> * 识别手写数字图片
>
> 下载该文件,通过安装ImgProcess库,只需调用该模块,输入手写数字图片的地址信息,即可识别该图片
### 安装和卸载
-----------
将项目克隆
`sudo python setup.py install`
使用pip卸载
`sudo pip uninstall ImgProcess`
### API使用
---
```python
from ImgProcess import process_img
result = process_img('./img/red4.jpg')
print(result)
```
### 注意事项
----
训练集使用MNIST手写数字的图片,介于东西方手写数字风格可能存在差异,模型在数字5和6上可能会识别错误,该问题在识别机器生成的图片上同样存在
### 相关技术
----
> 1.建立卷积神经网络层并进行训练模型
* 导入MNIST数据集,定义变量x和y,并进行设置形状,控制图片大小为28*28
```python
mnist = input_data.read_data_sets('./MNIST_data/', one_hot=True)
sess = tf.InteractiveSession()
#训练数据
x = tf.placeholder("float", shape=[None, 784])
#训练标签数据
y_ = tf.placeholder("float", shape=[None, 10])
#把x更改为4维张量,第1维代表样本数量,第2维和第3维代表图像长宽, 第4维代表图像通道数, 1表示黑白
x_image = tf.reshape(x, [-1,28,28,1])
```
* 第一层:开始建立卷积层,定义Weights和Biases,建立过滤器大小为5*5,当前深度为1,过滤器深度为32,并建立卷积函数,再通过relu进行一次激活函数,其作用是去线性化
```python
#第一层:卷积层
conv1_weights = tf.get_variable("conv1_weights", [5, 5, 1, 32], initializer=tf.truncated_normal_initializer(stddev=0.1)) #过滤器大小为5*5, 当前层深度为1, 过滤器的深度为32
conv1_biases = tf.get_variable("conv1_biases", [32], initializer=tf.constant_initializer(0.0))
conv1 = tf.nn.conv2d(x_image, conv1_weights, strides=[1, 1, 1, 1], padding='SAME') #移动步长为1, 使用全0填充
relu1 = tf.nn.relu( tf.nn.bias_add(conv1, conv1_biases) ) #激励函数Relu去线性化
```
![](http://imgsrc.baidu.com/forum/pic/item/5164b9014a90f6038a3b8cba3412b31bb251edaf.jpg)
提取特征值
* 第二层:建立最大池化层
```python
#第二层:最大池化层
#池化层过滤器的大小为2*2, 移动步长为2,使用全0填充
pool1 = tf.nn.max_pool(relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
```
![](http://imgsrc.baidu.com/forum/pic/item/ce2836d3d539b60075581f4ae450352ac45cb79b.jpg)
max_pool的作用:
1. invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)
2. 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力
* 第三层;再一次建立卷积层进行收集数据集
```python
#第三层:卷积层
conv2_weights = tf.get_variable("conv2_weights", [5, 5, 32, 64], initializer=tf.truncated_normal_initializer(stddev=0.1)) #过滤器大小为5*5, 当前层深度为32, 过滤器的深度为64
conv2_biases = tf.get_variable("conv2_biases", [64], initializer=tf.constant_initializer(0.0))
conv2 = tf.nn.conv2d(pool1, conv2_weights, strides=[1, 1, 1, 1], padding='SAME') #移动步长为1, 使用全0填充
relu2 = tf.nn.relu( tf.nn.bias_add(conv2, conv2_biases) )
```
* 第四层:再次建立最大池化层
```python
#第四层:最大池化层
#池化层过滤器的大小为2*2, 移动步长为2,使用全0填充
pool2 = tf.nn.max_pool(relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
```
* Dropout层处理
```python
#为了减少过拟合,加入Dropout层
keep_prob = tf.placeholder(tf.float32)
fc1_dropout = tf.nn.dropout(fc1, keep_prob)
```
* 第五层:建立全连接层,把前一层的输出变成特征向量
```python
#第五层:全连接层
fc1_weights = tf.get_variable("fc1_weights", [7 * 7 * 64, 1024], initializer=tf.truncated_normal_initializer(stddev=0.1)) #7*7*64=3136把前一层的输出变成特征向量
fc1_baises = tf.get_variable("fc1_baises", [1024], initializer=tf.constant_initializer(0.1))
pool2_vector = tf.reshape(pool2, [-1, 7 * 7 * 64])
fc1 = tf.nn.relu(tf.matmul(pool2_vector, fc1_weights) + fc1_baises)
```
* 第六层:搭建全连接层
```python
#第六层:全连接层
fc2_weights = tf.get_variable("fc2_weights", [1024, 10], initializer=tf.truncated_normal_initializer(stddev=0.1)) #神经元节点数1024, 分类节点10
fc2_biases = tf.get_variable("fc2_biases", [10], initializer=tf.constant_initializer(0.1))
fc2 = tf.matmul(fc1_dropout, fc2_weights) + fc2_biases
```
* 第七层:输出层,对网络最后一层的输出做一个softmax,这一步通常是求取输出属于某一类的概率,reduce_mean函数用来降低损失值
```python
#第七层:输出层
# softmax
y_conv = tf.nn.softmax(fc2)
#定义交叉熵损失函数
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))
```
* 再使用选择优化器进行梯度计算并进行训练
```python
#选择优化器,并让优化器最小化损失函数/收敛, 反向传播
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# tf.argmax()返回的是某一维度上其数据最大所在的索引值,在这里即代表预测值和真实值
# 判断预测值y和真实值y_中最大数的索引是否一致,y的值为1-10概率
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
# 用平均值来统计测试准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
```
* 将训练好的数据集存储在文件中
```python
saver_path = saver.save(sess, "/home/cris/AI/MNIST/save/model.ckpt") # 将模型保存到save/model.ckpt文件
print("Model saved in file:", saver_path)
```
------
> 2.安装opencv第三方库,依次将图片进行灰度处理,降噪,二值化,最后进行剪裁图片,在建立神经网络模型的时候我们已控制图片的大小为28*28,通过opencv的剪裁功能进行控制图片的大小,,并进行保存
* 原图片:
![](http://imgsrc.baidu.com/forum/pic/item/5a2d39dbb6fd52666fd33fe9a618972bd60736bd.jpg)
```python
#灰度处理
def cvt_Color(img):
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
return img
# 中值滤波,降噪
def median_Blur(img, m=3):
blur = cv2.medianBlur(img, m) #模板大小3*3
return blur
# 二值化处理
def thresh_old(img, l=100, h=255):
ret,im_fixed=cv2.threshold(img,l,h,cv2.THRESH_BINARY)
return im_fixed
```
进行剪裁图片,并通过opencv库的findContours()函数自动检测物体的轮廓
```python
# 裁剪字符
def cut(img):
# 查找检测物体的轮廓
image, contours, hierarchy = cv2.findContours(img, 2, 2)
#cv2.imshow('image',image)
# 计数器
flag = 1
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Python期末大作业基于CNN卷积神经网络的手写数字识别源码+文档说明.zip,个人大三的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。 Python期末大作业基于CNN卷积神经网络的手写数字识别源码+文档说明.zipPython期末大作业基于CNN卷积神经网络的手写数字识别源码+文档说明.zipPython期末大作业基于CNN卷积神经网络的手写数字识别源码+文档说明zipPython期末大作业基于CNN卷积神经网络的手写数字识别源码+文档说明.zipPython期末大作业基于CNN卷积神经网络的手写数字识别源码+文档说明.zipPython期末大作业基于CNN卷积神经网络的手写数字识别源码+文档说明.zipPython期末大作业基于CNN卷积神经网络的手写数字识别源码+文档说明.zipPython期末大作业基于CNN卷积神经网络的手写数字识别源码+文档说明.zipPython期末大作业基于CNN卷积神经网络的手写数字识别
资源推荐
资源详情
资源评论
收起资源包目录
基于CNN神经网络的手写数字识别源码+文档说明.zip (68个子文件)
-master
getNumber
ImgProcess
__init__.py 6KB
img
green3.jpg 7KB
green0.jpg 7KB
white5.jpg 7KB
zgreen0.jpg 8KB
zgreen4.jpg 10KB
CZWED.png 7KB
zgreen1.jpg 8KB
zgreen2.jpg 8KB
white8.jpg 8KB
green6.jpg 7KB
red8.jpg 9KB
white6.jpg 8KB
white0.jpg 7KB
white1.jpg 7KB
green8.jpg 7KB
red6.jpg 9KB
zgreen7.jpg 11KB
green9.jpg 7KB
green1.jpg 3KB
white7.jpg 7KB
1kxw2.jpg 3KB
red0.jpg 9KB
zgreen9.jpg 8KB
white2.jpg 7KB
red2.jpg 9KB
red9.jpg 9KB
zgreen5.jpg 9KB
red7.jpg 9KB
code.png 37KB
red4.jpg 9KB
white9.jpg 3KB
1ezx8.jpg 4KB
green7.jpg 7KB
zgreen6.jpg 10KB
white3.jpg 7KB
zgreen3.jpg 8KB
green5.jpg 7KB
red1.jpg 5KB
green4.jpg 7KB
red3.jpg 9KB
zgreen8.jpg 10KB
red5.jpg 9KB
green2.jpg 7KB
white4.jpg 7KB
model
model.ckpt.data-00000-of-00001 37.48MB
checkpoint 115B
model.ckpt.meta 78KB
model.ckpt.index 953B
setup.py 323B
image
thresh.png 1KB
gary.png 8KB
img.png 15KB
char.png 379B
resize.png 202B
dist
ImgProcess-0.0.1-py2.7.egg 34.99MB
ImgProcess.egg-info
SOURCES.txt 210B
top_level.txt 11B
PKG-INFO 180B
requires.txt 49B
dependency_links.txt 1B
build
lib.linux-x86_64-2.7
ImgProcess
__init__.py 6KB
model
model.ckpt.data-00000-of-00001 37.48MB
checkpoint 115B
model.ckpt.meta 78KB
model.ckpt.index 953B
README.md 8KB
README.md 11KB
共 68 条
- 1
资源评论
猰貐的新时代
- 粉丝: 1w+
- 资源: 3016
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2025海洋知识竞赛题库及答案(通用版).docx
- 【新增】-004 -餐厅薪酬制度.doc
- 【新增】-007 -餐饮管理公司薪酬管理体系设计.doc
- 【新增】-001 -(完整版)生产型企业薪酬管理制度.doc
- 【新增】-009 -超市门店薪酬结构方案.doc
- 【新增】-010 -超市薪酬管理制度.doc
- 【新增】-008 -测绘公司薪酬方案.doc
- 【新增】-013 -代理记账公司绩效工资考核方案.doc
- 【新增】-011 -超市薪酬管理制度的副本.doc
- 【新增】-015 -电器公司薪酬方案.doc
- 【新增】-020 -店面销售人员薪酬方案制定.doc
- 【新增】-018 -电子科技公司薪酬体系设计方案.doc
- 【新增】-016 -电器公司薪酬设计方案.doc
- 【新增】-025 -房地产开发公司薪酬福利管理制度.doc
- 【新增】-030 -服装店提成办法.doc
- 【新增】-031 -服装店行业薪资方案.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功