手写数字识别相比都不是什么新鲜的事情,以往这个问题绝大多数的方法都是基于CNN开发的深度学习的模型,后面又基于LSTM系列的模型也有开发过,但是基本上都是基于深度学习模型实现的识别,那么不禁就在想:如果纯粹基于基础的机器学习模型是否能够实现高效的识别呢?虽然在之前的时候已经基于机器学习的方式做过人脸识别、表情识别,但是在复杂环境下效果总是差强人意,手写数字识别mnist的数据集相对更加纯净,理论上来讲,只要特征提取的好,简单的机器学习模型应该也有不错的识别效果的,而且机器学习模型的推理速度有优势,如果精度ok,本身就是一个不错的选择。
话不多说,首先看下效果图:
![](https://img-blog.csdnimg.cn/img_convert/395ff6dd7d7afb8ef1d2b6d8747f4f57.gif)
完整项目截图如下所示:
![](https://img-blog.csdnimg.cn/img_convert/9de2045022bf4ad1905b3d98422e8299.png)
简单看下数据集:
![](https://img-blog.csdnimg.cn/img_convert/4bc581bd2809401aa178e3f8ee558427.png)
简单看几个类别:
【0】
![](https://img-blog.csdnimg.cn/img_convert/c95cecbf591748679023ca2200e7125c.png)
【5】
![](https://img-blog.csdnimg.cn/img_convert/eb5c65df42e04bfdb0ee8058bf7089b0.png)
【9】
![](https://img-blog.csdnimg.cn/img_convert/9aef8828c9fe47abbc4273163424c037.png)
可以看到:这里的数据不再是直接从第三方模块导入的形式,因为为了直观操作,我这里将模块内置的mnist数据集进行了解析转化存储处理,关于详细的操作可以参考我以前的文章,如下:
《Python实现将tensorflow内置的二进制格式的mnist数据集转化为图像进行存储》
《Python实现将Keras内置的mnist数据集转化为图像进行存储》
《Python实现将scikit-learn内置的mnist数据集转化为图像进行存储》
非常详细的讲解都在上面的博文中,感兴趣的话可以自行移步阅读即可。这里就不再赘述了。
特征提取这里一般使用的较多的就是HOG和LBP了,LBP提取出来的向量维度较高计算量也相对更大,与之带来的精度也更高一点,HOG相对LBP而言更为轻量级一些,这里我采用的是HOG方法,整体建模流程如下:
![](https://img-blog.csdnimg.cn/img_convert/61513a0afb47439ba2f357f469c60540.png)
这里我采用的是支持向量机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')
运行输出如下:
![](https://img-blog.csdnimg.cn/img_convert/50431b77e9214e0c914293b8b198aec5.png)
可以看到:SVM的识别效果已经非常好了,简单看下混淆矩阵:
![](https://img-blog.csdnimg.cn/img_convert/d129b366589a4613b9b3084d89b3f817.png)
为了直观简洁实用,这里开发了专用的可视化界面,如下:
![](https://img-blog.csdnimg.cn/img_convert/75e1ab4acd5b4dc8ac9a10f8ed5f4ed0.png)
![](https://img-blog.csdnimg.cn/img_convert/76a613f2e51e4f2b91062d1bb55c3547.png)