python开发构建基于机器学习模型的手写数字识别系统

手写数字识别相比都不是什么新鲜的事情,以往这个问题绝大多数的方法都是基于CNN开发的深度学习的模型,后面又基于LSTM系列的模型也有开发过,但是基本上都是基于深度学习模型实现的识别,那么不禁就在想:如果纯粹基于基础的机器学习模型是否能够实现高效的识别呢?虽然在之前的时候已经基于机器学习的方式做过人脸识别、表情识别,但是在复杂环境下效果总是差强人意,手写数字识别mnist的数据集相对更加纯净,理论上来讲,只要特征提取的好,简单的机器学习模型应该也有不错的识别效果的,而且机器学习模型的推理速度有优势,如果精度ok,本身就是一个不错的选择。

话不多说,首先看下效果图:

完整项目截图如下所示:

简单看下数据集:

简单看几个类别:

【0】

【5】

【9】

可以看到:这里的数据不再是直接从第三方模块导入的形式,因为为了直观操作,我这里将模块内置的mnist数据集进行了解析转化存储处理,关于详细的操作可以参考我以前的文章,如下:

《Python实现将tensorflow内置的二进制格式的mnist数据集转化为图像进行存储》

《Python实现将Keras内置的mnist数据集转化为图像进行存储》

《Python实现将scikit-learn内置的mnist数据集转化为图像进行存储》

非常详细的讲解都在上面的博文中,感兴趣的话可以自行移步阅读即可。这里就不再赘述了。

特征提取这里一般使用的较多的就是HOG和LBP了,LBP提取出来的向量维度较高计算量也相对更大,与之带来的精度也更高一点,HOG相对LBP而言更为轻量级一些,这里我采用的是HOG方法,整体建模流程如下:

这里我采用的是支持向量机SVM作为手写数字分类的模型,建模实现如下:

#随机划分
X_train, X_test, y_train, y_test = splitData(x_list, y_list, ratio=0.3)
#模型初始化
model = LinearSVC()
#训练拟合
model.fit(X_train, y_train)
#预测
y_predict = model.predict(X_test)
y_pred = y_predict.tolist()
#计算准确率
accuracy = model.score(X_test, y_test)
print("SVM model accuracy: ", accuracy)
Precision,Recall,F1=calThree(y_test,y_pred)
saveModel(model,save_path=model_path)
result={}
result['accuracy'],result['F_value']=accuracy,F1
result['precision'],result['recall']=Precision,Recall
print('type: ', type(y_test), type(y_pred))
result['y_true'],result['y_pred']=y_test,y_pred
plotConfusionMatrix(y_test, y_pred, save_path = saveDir + 'ConfusionMatrix.png')

运行输出如下:

可以看到:SVM的识别效果已经非常好了,简单看下混淆矩阵:

为了直观简洁实用,这里开发了专用的可视化界面,如下:

猜你喜欢

转载自blog.csdn.net/Together_CZ/article/details/129702663