基于opencv的svm方法手写数字识别(python)

环境配置

语言:python
平台:pycharm
库: cv2
numpy
keras(这个需要先安装fensorflow库)

写在前面:

手写数字识别,是很多深度学习教程里的入门第一例,但是这些教程往往只告诉了你怎么去构造神经网络,训练模型,最后得出一个准确率,但是很少有教程告诉如何运用这个你训练好模型去识别你自己手写的数字。所以本文会介绍如何对你拍下来的手写数字进行预处理,然后用训练好的模型去识别这个手写数字。

本文运用的方法是svm支持向量机的方式,是一种机器学习,而非深度学习,这种方法的优点是训练模型时的计算量小,60000张的数据集用cpu跑也可以2分钟左右结束。后期博主也将出一篇深度学习方法的手写数字识别。

不管用哪种方法,对于手写数字的图片的预处理都是一样的,所以本文着重介绍图片的预处理。

三个程序

1.训练(我也不是很能讲解清楚,网上有教程)
2.图像预处理(我主要介绍这部分)
3.测试

第一个程序:训练

这部分可以参考https://keras-lx.blog.csdn.net/article/details/111693750

import cv2
import numpy as np
from keras.datasets import mnist
from keras import utils

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

    # 将标签数据转为int32 并且形状为(60000,1)
    train_labels = train_labels.astype(np.int32)
    test_labels = test_labels.astype(np.int32)
    train_labels = train_labels.reshape(-1, 1)
    test_labels = test_labels.reshape(-1, 1)

    # 创建svm模型
    svm = cv2.ml.SVM_create()
    # 设置类型为SVM_C_SVC代表分类
    svm.setType(cv2.ml.SVM_C_SVC)
    # 设置核函数
    svm.setKernel(cv2.ml.SVM_POLY)
    # 设置其它属性
    svm.setGamma(3)
    svm.setDegree(3)
    # 设置迭代终止条件
    svm.setTermCriteria((cv2.TermCriteria_MAX_ITER, 300, 1e-3))
    # 训练
    svm.train(train_images, cv2.ml.ROW_SAMPLE, train_labels)
    svm.save('m
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值