zoukankan      html  css  js  c++  java
  • [CV] Mnist手写数字分类

    数据集

    手写数字Mnist数据集Mnist(lecun.com)

    • 每张手写数字图片包含28*28个灰度像素点
    • 包含从0~9十个数字

    任务

    使用SVM对手写数字进行分类

    步骤

    1. 对图像提取特征
    2. 划分数据集,分为训练集和测试集7:3
    3. 使用SVM对图像进行分类
    4. 输出混淆矩阵和精确度

    方法

    1. 由于原图片只有28*28,直接使用像素作为特征送入SVM分类器

      # 直接对28*28像素进行svm分类
      from sklearn.metrics import accuracy_score, confusion_matrix
      import numpy as np
      from sklearn.model_selection import train_test_split
      from sklearn import svm
      import cv2
      from sklearn.datasets import fetch_openml
      # 获取数据集
      X, y = fetch_openml('mnist_784', data_home="./data",
                          as_frame=False, return_X_y=True)
      
      # 数据集的格式是每行是一张图片(一维数组numpy.dnarray总长度是28*28)
      print(X[0])
      assert X[0].shape[0] == 28*28
      
      
      X_train, X_test, y_train, y_test = train_test_split(
          X, y, test_size=0.3, random_state=0)
      
      svc = svm.SVC()
      svc.fit(X_train, y_train)
      
      predicts = svc.predict(X_test)
      
      # 打印出混淆矩阵
      
      print(confusion_matrix(predicts, y_test))
      
      print("accuracy : {}".format(accuracy_score(predicts, y_test)))
      

      运行结果:

      1.result

      P.S. 直接送入分类器进行分类准确度就已经可以达到0.976了

    2. 由之前学习的Sobel等梯度算子(边缘信息),同时为了旋转不变性就联想到数据增强——多角度提取边缘特征。基于梯度方向直方图(HOG)进行特征提取,再送入SVM分类器进行分类

      # 使用HOG特征提取
      from sklearn.metrics import accuracy_score, confusion_matrix
      import numpy as np
      from sklearn.model_selection import train_test_split
      from sklearn import svm
      import cv2
      from sklearn.datasets import fetch_openml
      # 获取数据集
      X, y = fetch_openml('mnist_784', data_home="./data",
                          as_frame=False, return_X_y=True)
      
      winSize = (4, 4)
      blockSize = (4, 4)
      blockStride = (8, 8)
      cellSize = (4, 4)
      nbins = 9
      derivAperture = 1
      winSigma = 4.
      histogramNormType = 0
      L2HysThreshold = 2.0000000000000001e-01
      gammaCorrection = 0
      nlevels = 64
      
      hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins, derivAperture,
                                  winSigma, histogramNormType, L2HysThreshold, gammaCorrection, nlevels)
      
      print(hog.compute(X[0].reshape(28,28).astype(np.uint8)).flatten().shape)
      
      # 计算提取HOG特征
      new_X = np.asarray([hog.compute(x.reshape(28,28).astype(np.uint8)).flatten() for x in X])
      
      X_train, X_test, y_train, y_test = train_test_split(
          new_X, y, test_size=0.3, random_state=0)
      
      svc = svm.SVC()
      svc.fit(X_train, y_train)
      
      predicts = svc.predict(X_test)
      
      # 打印出混淆矩阵
      
      print(confusion_matrix(predicts, y_test))
      
      print("accuracy : {}".format(accuracy_score(predicts, y_test)))
      

      2.result

      使用HOG提取特征后,特征由28*28维度降到441维度,同时准确率也提升接近0.01。

  • 相关阅读:
    年轻人如何去有效的学习(很好的鸡汤,一语惊醒梦中人)
    python基础07 函数
    python基础06 循环
    python基础05 缩进与选择
    python基础04 运算
    python基础03 序列
    python基础02 基本数据类型
    python基础01 Hello World
    CSS3(三)BFC、定位、浮动、7种垂直居中方法
    CSS3(二)Box Model、边距折叠、内联与块标签、CSSReset
  • 原文地址:https://www.cnblogs.com/minskiter/p/14781960.html
Copyright © 2011-2022 走看看