机器学习实战之基于svm的手写汉字识别代码
首先介绍一下我们用到的数据,我们有3000张关于10个汉字图片,每个字约300张。图片下载地址在下面。
具体过程
1、读取图像数据,统一尺寸为14*14,转化3通道的RGB图片为一通道的灰度图,并将8位256色的图片转化为4位16色的图片,再将二维14*14数组拉伸为一维196的。读取全部图片和标签放入数组中,打乱数组。
2、划分数据集,5/6为测试集,1/6为测试集。
3、构建模型,kernel参数选’rbf’,c取1,gamma取0.001,传入数据训练,查看模型效果。
4、保存模型。
以上参数都是我经过测试的最佳参数,像为什么尺寸取14*14,为什么要把255色转为16色,模型的参数选择等等。
最终结果为:训练数据上的准确率:0.9975855130784709
测试数据上的准确率:0.9235412474849095
下面是数据下载地址,以及完整代码。
链接:https://pan.baidu.com/s/1tYtqAYpOWM0GZN4iWvuNBw
提取码:59hd
# 导入模块
import numpy as np
import glob
from PIL import Image
import random
from sklearn.externals import joblib
from sklearn.svm import SVC
# 读取数据
path_ = 'E:\\中文字符识别\\'
classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
all = []
for index, name in enumerate(classes):
path = path_ + name + '\\'
path_all = glob.glob(path + '*.png')
for img_name in path_all:
print(img_name, index)
img = Image.open(img_name)
img = img.convert('L')
img = img.resize((14, 14))
img = img.point(lambda i: (255-i)//16)
data_i = [np.array(img).flatten().tolist(), index]
all.append(data_i)
# 打乱数据
random.shuffle(all)
# 获取X,Y
all = np.array(all)
img = all[:, 0]
label = all[:, 1]
img = img.tolist()
label = label.tolist()
print(img)
print(label)
X = img
Y = label
# 数据划分
split_index = 5 * len(Y) // 6
x_train, x_test = X[:split_index], X[split_index:]
y_train, y_test = Y[:split_index], Y[split_index:]
print(type(x_train), type(y_train))
print("训练数据格式:{}".format(np.shape(x_train)))
print("测试数据格式:{}".format(np.shape(x_test)))
# 构建模型
algo = SVC(kernel='rbf', C=1.0, gamma=0.001)
algo.fit(x_train, y_train)
# 模型效果查看
print("训练数据上的效果:{}".format(algo.score(x_train, y_train)))
print("测试数据上的效果:{}".format(algo.score(x_test, y_test)))
# 模型持久化
joblib.dump(algo, './svm_digits.pkl')