当前位置: 首页>編程日記>正文

Python SVM手写数字识别

Python SVM手写数字识别

Python 基于sklearn - svm实现MNIST手写数字识别

一、数据集:MNIST

数据地址:http://yann.lecun.com/exdb/mnist/

训练数据:MNIST中的60000张图像,0-9的手写数字

测试数据:MNIST中的10000张图像,0-9的手写数字

注意:训练和测试代码直接使用了ubyte格式数据,即只对原数据进行了解压,没有先转换为png/jpg,但也附上png数据转换代码。

数据格式转换:从ubyte转换到png格式,存储格式:mnist_train>label>.png,代码如下:

提示:PIL不再支持新版本,要额外安装Pillow库

import numpy as np
import structfrom PIL import Image
import osdata_file = 'train-images.idx3-ubyte'
# It's 47040016B, but we should set to 47040000B
data_file_size = 47040016
data_file_size = str(data_file_size - 16) + 'B'data_buf = open(data_file, 'rb').read()magic, numImages, numRows, numColumns = struct.unpack_from('>IIII', data_buf, 0)
datas = struct.unpack_from('>' + data_file_size, data_buf, struct.calcsize('>IIII'))
datas = np.array(datas).astype(np.uint8).reshape(numImages, 1, numRows, numColumns)label_file = 'train-labels.idx1-ubyte'# It's 60008B, but we should set to 60000B
label_file_size = 60008
label_file_size = str(label_file_size - 8) + 'B'label_buf = open(label_file, 'rb').read()magic, numLabels = struct.unpack_from('>II', label_buf, 0)
labels = struct.unpack_from('>' + label_file_size, label_buf, struct.calcsize('>II'))
labels = np.array(labels).astype(np.int64)datas_root = 'mnist_train'
if not os.path.exists(datas_root):os.mkdir(datas_root)for i in range(10):file_name = datas_root + os.sep + str(i)if not os.path.exists(file_name):os.mkdir(file_name)count = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
for ii in range(numLabels):img = Image.fromarray(datas[ii, 0, 0:28, 0:28])label = labels[ii]file_name = datas_root + os.sep + str(label) + os.sep + \str(label) + '_' + str(count[label]) + '.png'count[label] = count[label] + 1# file_name = datas_root + os.sep + str(label) + os.sep + \#             'mnist_train_' + str(ii) + '.png'img.save(file_name)data_file = 't10k-images.idx3-ubyte'
# It's 7840016B, but we should set to 7840000B
data_file_size = 7840016
data_file_size = str(data_file_size - 16) + 'B'data_buf = open(data_file, 'rb').read()magic, numImages, numRows, numColumns = struct.unpack_from('>IIII', data_buf, 0)
datas = struct.unpack_from('>' + data_file_size, data_buf, struct.calcsize('>IIII'))
datas = np.array(datas).astype(np.uint8).reshape(numImages, 1, numRows, numColumns)label_file = 't10k-labels.idx1-ubyte'# It's 10008B, but we should set to 10000B
label_file_size = 10008
label_file_size = str(label_file_size - 8) + 'B'label_buf = open(label_file, 'rb').read()magic, numLabels = struct.unpack_from('>II', label_buf, 0)
labels = struct.unpack_from('>' + label_file_size, label_buf, struct.calcsize('>II'))
labels = np.array(labels).astype(np.int64)datas_root = 'mnist_test'
if not os.path.exists(datas_root):os.mkdir(datas_root)for i in range(10):file_name = datas_root + os.sep + str(i)if not os.path.exists(file_name):os.mkdir(file_name)count = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
for ii in range(numLabels):img = Image.fromarray(datas[ii, 0, 0:28, 0:28])label = labels[ii]file_name = datas_root + os.sep + str(label) + os.sep + \str(label) + '_' + str(count[label]) + '.png'count[label] = count[label] + 1# file_name = datas_root + os.sep + str(label) + os.sep + \#             'mnist_test_' + str(ii) + '.png'img.save(file_name)

转换后的数据如下图

302e354b3b2348ccaa0aa7a4b9064b42.png

二、训练模型

import numpy as np
import struct
import pickle
from sklearn import svm
###用于做数据预处理
from sklearn import preprocessing##读取数据集
def load_mnist_train(labels_path, images_path):with open(labels_path, 'rb') as lbpath:magic, n = struct.unpack('>II', lbpath.read(8))labels = np.fromfile(lbpath, dtype=np.uint8)with open(images_path, 'rb') as imgpath:magic, num, rows, cols = struct.unpack('>IIII', imgpath.read(16))images = np.fromfile(imgpath, dtype=np.uint8).reshape(len(labels), 784)return images, labelsif __name__ == '__main__':##读取训练数据labels_path = "train-labels.idx1-ubyte"images_path = "train-images.idx3-ubyte"train_images, train_labels = load_mnist_train(labels_path, images_path)##标准化X = preprocessing.StandardScaler().fit_transform(train_images)X_train = X[0:60000]y_train = train_labels[0:60000]##定义并训练模型model_svc = svm.SVC()model_svc.fit(X_train, y_train)file = open("model.pickle", "wb")##保存模型pickle.dump(model_svc, file)file.close()

三、测试模型

import numpy as np
import struct
import pickle
###用于做数据预处理
from sklearn import preprocessingdef test(images_path, labels_path, modelPath):# 读取测试图像with open(labels_path, 'rb') as lbpath:magic, n = struct.unpack('>II', lbpath.read(8))test_labels = np.fromfile(lbpath, dtype=np.uint8)with open(images_path, 'rb') as imgpath:magic, num, rows, cols = struct.unpack('>IIII', imgpath.read(16))test_images = np.fromfile(imgpath, dtype=np.uint8).reshape(len(test_labels), 784)##读取模型file = open(modelPath, "rb")model_svc = pickle.load(file)file.close()##评分并预测x = preprocessing.StandardScaler().fit_transform(test_images)x_test = x[0:10000]y_test = test_labels[0:10000]num = model_svc.predict(x_test)for i in range(10000):print("Real:", y_test[i], "Predict:", num[i])print("Accuracy:", model_svc.score(x_test, y_test))return numif __name__ == '__main__':images_path = "t10k-images.idx3-ubyte"labels_path = "t10k-labels.idx1-ubyte"modelPath = "model.pickle"num = test(images_path, labels_path, modelPath)

 四、参考资料

图片格式转换: MNIST数据集格式ubyte转png_haoji007的博客-CSDN博客_ubyte

模型训练及测试:图像处理基本库的学习笔记2--SVM,MATLAB,Tensorflow下分别对mnist数据集进行训练,并且进行预测 - 灰信网(软件开发博客聚合)

sklearn-svm模型参数设置:机器学习笔记(3)-sklearn支持向量机SVM - 简书

模型保存和调用: 基于sklearn的SVM模型保存与调用_hellosonny的博客-CSDN博客_svm保存模型

单个图片测试:基于svm机器学习的手写数字识别_Brinshy的博客-CSDN博客_基于svm的手写数字识别


https://www.fengoutiyan.com/post/14862.html

相关文章:

  • 手写数字识别优化
  • 手写数字1
  • 识别表格手写数字的软件
  • python数字转换
  • python 数字转字符
  • 手写数字识别代码
  • 手写数字识别算法
  • 手写数字
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機