opencv中也提供了一种类似于Keras的神经网络,即为ann,这种神经网络的使用方法与Keras的很接近。
关于mnist数据的解析,读者可以自己从网上下载相应压缩文件,用python自己编写解析代码,由于这里主要研究knn算法,为了图简单,直接使用Keras的mnist手写数字解析模块。
本次代码运行环境为:
python 3.6.8
opencv-python 4.4.0.46
opencv-contrib-python 4.4.0.46

下面的代码为使用ann进行模型的训练:

from keras.datasets import mnist
from keras import utils
import cv2
import numpy as np#opencv中ANN定义神经网络层
def create_ANN():ann=cv2.ml.ANN_MLP_create()#设置神经网络层的结构 输入层为784 隐藏层为80 输出层为10ann.setLayerSizes(np.array([784,64,10]))#设置网络参数为误差反向传播法ann.setTrainMethod(cv2.ml.ANN_MLP_BACKPROP)#设置激活函数为sigmoidann.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM)#设置训练迭代条件 #结束条件为训练30次或者误差小于0.00001ann.setTermCriteria((cv2.TermCriteria_EPS|cv2.TermCriteria_COUNT,100,0.0001))return ann#计算测试数据上的识别率
def evaluate_acc(ann,test_images,test_labels):#采用的sigmoid激活函数,需要对结果进行置信度处理 #对于大于0.99的可以确定为1 对于小于0.01的可以确信为0test_ret=ann.predict(test_images)#预测结果是一个元组test_pre=test_ret[1]#可以直接最大值的下标 (10000,)test_pre=test_pre.argmax(axis=1)true_sum=(test_pre==test_labels)return true_sum.mean()if __name__=='__main__':#直接使用Keras载入的训练数据(60000, 28, 28) (60000,)(train_images,train_labels),(test_images,test_labels)=mnist.load_data()#变换数据的形状并归一化train_images=train_images.reshape(train_images.shape[0],-1)#(60000, 784)train_images=train_images.astype('float32')/255test_images=test_images.reshape(test_images.shape[0],-1)test_images=test_images.astype('float32')/255#将标签变为one-hot形状 (60000, 10) float32train_labels=utils.to_categorical(train_labels)#测试数据标签不用变为one-hot (10000,)test_labels=test_labels.astype(np.int)#定义神经网络模型结构ann=create_ANN()#开始训练    ann.train(train_images,cv2.ml.ROW_SAMPLE,train_labels)#在测试数据上测试准确率print(evaluate_acc(ann,test_images,test_labels))#保存模型ann.save('mnist_ann.xml')#加载模型myann=cv2.ml.ANN_MLP_load('mnist_ann.xml')

训练100次得到的准确率为0.9376,可以接着增加训练次数或者提高神经网络的层次结构深度来提高准确率。
使用ann神经网络的模型结构非常小,因为只是保存了权重参数。

可以看到整个模型文件的大小才1M,而svm的大小为十多兆,knn的为几百兆,因此使用ann神经网络更加适合部署在客户端上。
接下来使用ann进行图片的测试识别:

import cv2
import numpy as npif __name__=='__main__':#读取图片img=cv2.imread('shuzi.jpg',0)img_sw=img.copy()#将数据类型由uint8转为float32img=img.astype(np.float32)#图片形状由(28,28)转为(784,)img=img.reshape(-1,)#增加一个维度变为(1,784)img=img.reshape(1,-1)#图片数据归一化img=img/255#载入ann模型ann=cv2.ml.ANN_MLP_load('minist_ann.xml')#进行预测img_pre=ann.predict(img)#因为激活函数sigmoid,因此要进行置信度处理ret=img_pre[1]ret[ret>0.9]=1ret[ret<0.1]=0print(ret)cv2.imshow('test',img_sw)cv2.waitKey(0)

运行程序,结果如下,可见该模型正确识别了数字0.

opencv(python)使用ann神经网络识别手写数字相关推荐

  1. opencv(python)使用svm算法识别手写数字

    svm算法是一种使用超平面将数据进行分类的算法. 关于mnist数据的解析,读者可以自己从网上下载相应压缩文件,用python自己编写解析代码,由于这里主要研究knn算法,为了图简单,直接使用Kera ...

  2. Python神经网络识别手写数字-MNIST数据集

    Python神经网络识别手写数字-MNIST数据集 一.手写数字集-MNIST 二.数据预处理 输入数据处理 输出数据处理 三.神经网络的结构选择 四.训练网络 测试网络 测试正确率的函数 五.完整的 ...

  3. 四、用简单神经网络识别手写数字(内含代码详解及订正)

    本博客主要内容为图书<神经网络与深度学习>和National Taiwan University (NTU)林轩田老师的<Machine Learning>的学习笔记,因此在全 ...

  4. 利用python实现简单的人工神经网络识别手写数字

    利用 Python 搭建起了一个简单的神经网络模型,并完成识别手写数字. 1.前置工作 1.1 环境配置 这里使用scikit-learn库内建的手写数字字符集作为本文的数据集.scikit-lear ...

  5. python手机代码识别数字_利用python构建神经网络识别手写数字(附源代码)

    一.运行环境配置 本次实验的运行环境win10(bit64),采用python环境为3.7.6,安装Python环境推荐使用Anaconda.Anaconda是一个免费开源的Python和R语言的发行 ...

  6. 第1章使用神经网络识别手写数字

    人类视觉系统是世界奇观之一.考虑以下手写数字序列: 大多数人毫不费力地将这些数字识别为504192.这很容易就是欺骗性的.在我们大脑的每个半球,人类有一个主要的视觉皮层,也被称为V1,包含1.4亿个神 ...

  7. BP神经网络识别手写数字项目解析及代码

    这两天在学习人工神经网络,用传统神经网络结构做了一个识别手写数字的小项目作为练手.点滴收获与思考,想跟大家分享一下,欢迎指教,共同进步. 平常说的BP神经网络指传统的人工神经网络,相比于卷积神经网络( ...

  8. 简单python代码实现三层神经网络识别手写数字

    准备 这个过程非常简单,就是用到了很多的矩阵运算. 训练数据集下载地址, 测试数据集下载地址, 数据格式 .csv格式数据的每一行都是一个28*28像素的手写数字图片,每一行的第一个像素是数字的值,从 ...

  9. 从零开始的神经网络构建历程(二,用全连接前馈神经网络识别手写数字mnist)

    本系列的上一篇博文最后提出了一个问题,是有关如何通过torch来实现给定的神经网络的,这里公布一下我自己的回答: class Net(nn.Module):def __init__(self):sup ...

最新文章

  1. ML之xgboost:绘制xgboost的二叉树graphviz的两种方法代码实现
  2. Sublime Text 3143 注册码
  3. JS 正则表达式(数字、正则)
  4. h5页面如何预览excel文件_移动端页面,如何解析预览 word/excel/PDF文件?
  5. hihocoder1033交错和
  6. LSJ_NHibernate第一章 NHibernate介绍
  7. Struct嵌套使用
  8. java基础题目的网站_Java基础题目
  9. 蚂蚁链发布BTN,有什么用?
  10. 【如何快速的开发一个完整的iOS直播app】(原理篇)
  11. mac多屏幕切换快捷键
  12. SQL笔试题目分享(一)
  13. 通过官网怎么查找联盟申请链接
  14. python学习之路08(正则表达式和网络)
  15. AD之Via尺寸和盖油规则设置
  16. FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇三
  17. 基于Android的便签设计(一)
  18. android防拆机方案,拆机狂人必备 iFixit Android客户端试用
  19. 用python把Excel表中不同货币的资金换算成人民币
  20. 这一篇TCP总结,请务必收下!

热门文章

  1. 通过码云来学习Git的进阶技能(文末附福利!)
  2. Linux 命令 | 常用命令之 cut
  3. 手把手教你用EZDML批量生成vue-element-admin前端页面代码
  4. 微星主板从u盘启动linux挖矿,三星905s3g BIOS 设置U盘启动
  5. 数据的聚合与分组运算
  6. 深入理解java虚拟机之——垃圾回收(垃圾判断,垃圾收集算法,垃圾收集器)
  7. 关于android各平台上架心得
  8. Mac 安装element-ui
  9. MATLAB基础编程(004-01)在不同初速度和重力加速度下的的动态抛物运动绘图
  10. 学员洒泪分享,中富金石投顾骗局?血本无归?