寫這篇文章的主要目的,是關于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.
小編就為大家介紹到這里了,希望可以為大家帶來更多的幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/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 ...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
閱讀 926·2023-01-14 11:38
閱讀 899·2023-01-14 11:04
閱讀 758·2023-01-14 10:48
閱讀 2063·2023-01-14 10:34
閱讀 965·2023-01-14 10:24
閱讀 844·2023-01-14 10:18
閱讀 512·2023-01-14 10:09
閱讀 590·2023-01-14 10:02