写这篇文章的主要目的,是关于Python Opencv的相关知识,包括ann神经网络识别手写数字功能,教给大家怎么去使用这种功能,接下来请大家仔细的进行阅读哦。
opencv会给大家提供一种神经网络的功能,即为ann,这种神经的网络功能与Keras的很接近。
关于mnist数据怎么去进行解析,读者人员可以自己从网上downland软件,用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输出层为10 ann.setLayerSizes(np.array([784,64,10])) #设置网络参数为误差反向传播法 ann.setTrainMethod(cv2.ml.ANN_MLP_BACKPROP) #设置激活函数为sigmoid ann.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM) #设置训练迭代条件 #结束条件为训练30次或者误差小于0.00001 ann.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的可以确信为0 test_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')/255 test_images=test_images.reshape(test_images.shape[0],-1) test_images=test_images.astype('float32')/255 #将标签变为one-hot形状(60000,10)float32 train_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 np if __name__=='__main__': #读取图片 img=cv2.imread('shuzi.jpg',0) img_sw=img.copy() #将数据类型由uint8转为float32 img=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]=1 ret[ret<0.1]=0 print(ret) cv2.imshow('test',img_sw) cv2.waitKey(0)
运行程序,结果如下,可见该模型正确识别了数字0.
小编就为大家介绍到这里了,希望可以为大家带来更多的帮助。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/127978.html
摘要:本报告面向的读者是想要进入机器学习领域的学生和正在寻找新框架的专家。其输入需要重塑为包含个元素的一维向量以满足神经网络。卷积神经网络目前代表着用于图像分类任务的较先进算法,并构成了深度学习中的主要架构。 初学者在学习神经网络的时候往往会有不知道从何处入手的困难,甚至可能不知道选择什么工具入手才合适。近日,来自意大利的四位研究者发布了一篇题为《神经网络初学者:在 MATLAB、Torch 和 ...
摘要:我们的目标是构建一个可以读取手写数字的应用程序为此,我们需要一些和附带一个在文件夹中,它有个手写数字每个数字个每个数字是图像所以首先要将图片切割成个不同图片每个数字变成一个单行像素前面的个数字作为训练数据,后个作为测试数据输出进一步 OCR of Hand-written Data using kNN OCR of Hand-written Digits 我们的目标是构建一个可以读取...
摘要:最后,与前一种情况一样,我们首先将大数据集拆分为单个单元格,对于每个数字,保留个单元用于训练数据,剩余的个数据保留用于测试。 OCR of Hand-written Data using SVM 在kNN中,我们直接使用像素强度作为特征向量。 这次我们将使用方向梯度直方图(HOG)作为特征向量。在计算HOG之前,使用其二阶矩来校正图像: def deskew(img): m ...
摘要:纳入深度学习模型来进一步提升准确率只是时间问题,事实上,这个时间已经到来。最新版本支持基于深度学习的,准确率显著提高。该函数使用基于深度学习的文本检测器来检测不是识别图像中的文本区域。高效使用概率最高的文本区域,删除其他重叠区域。 By Adrian Rosebrock on September 17, 2018 in Deep Learning, Optical Character ...
摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...
阅读 909·2023-01-14 11:38
阅读 876·2023-01-14 11:04
阅读 739·2023-01-14 10:48
阅读 1980·2023-01-14 10:34
阅读 941·2023-01-14 10:24
阅读 818·2023-01-14 10:18
阅读 498·2023-01-14 10:09
阅读 571·2023-01-14 10:02