生活随笔
收集整理的这篇文章主要介绍了
机器学习之KNN结合微信机器人实现手写数字识别终极API
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
机器学习之KNN结合微信机器人实现手写数字识别终极API
手写数字识别
功能概述
微信机器人接收到的手写数字图片,传送给已经经过机器学习训练过的knn分类器,进行预测,输出数字结果。
实现步骤
- 将手写数字图片转变为32*32的矩阵
因为机器学习的训练数据集是DBRHD数据集(训练数据集已上传到我的资料可以自行下载),图片均归一化为以数字为中心的32*32规格的矩阵:空白区域用0表示,字迹部分用1表示。所以首先就需要将手写数字图片转换成文本形式。
ps:DBRHD数据集我已上传到我的资源
from PIL
import Image
import matplotlib
.pylab
as plt
import numpy
as np
def picTo01(filename
):"""将图片转化为32*32像素的文件,用0 1表示:param filename::return:"""img
= Image
.open(filename
).convert
('RGBA')raw_data
= img
.load
()for y
in range(img
.size
[1]):for x
in range(img
.size
[0]):if raw_data
[x
, y
][0] < 90:raw_data
[x
, y
] = (0, 0, 0, 255)for y
in range(img
.size
[1]):for x
in range(img
.size
[0]):if raw_data
[x
, y
][1] < 136:raw_data
[x
, y
] = (0, 0, 0, 255)for y
in range(img
.size
[1]):for x
in range(img
.size
[0]):if raw_data
[x
, y
][2] > 0:raw_data
[x
, y
] = (255, 255, 255, 255)img
= img
.resize
((32, 32), Image
.LANCZOS
)img
.save
('test.png')array
= plt
.array
(img
)gray_array
= np
.zeros
((32, 32))for x
in range(array
.shape
[0]):for y
in range(array
.shape
[1]):gary
= 0.299 * array
[x
][y
][0] + 0.587 * array
[x
][y
][1] + 0.114 * array
[x
][y
][2]if gary
== 255:gray_array
[x
][y
] = 0else:gray_array
[x
][y
] = 1name01
= filename
.split
('.')[0]name01
= name01
+ '.txt'np
.savetxt
(name01
, gray_array
, fmt
='%d', delimiter
='')if __name__
== '__main__':picTo01
('picture.jpg')
- 手写数字识别代码编写
KNN的输入是图片矩阵展开的1024维向量;输出是一个数字。
KNN手写数字识别实体构建
1.建立工程并导入sklearn包
2.加载训练数据
3.构建knn分类器
4.测试集评价
5.进行预测
6.将预测结果写入txt文件
"""
Created on Sat Aug 3 16:24:13 2019@author: 53592
"""import numpy
as np
from os
import listdir
from sklearn
import neighbors
def img2vector(filename
):retMat
= np
.zeros
([1024],int)fr
= open(filename
)lines
= fr
.readlines
()for i
in range(32):for j
in range(32):retMat
[32*i
+j
] = lines
[i
][j
]return retMat
def readDataSet(path
):fileList
= listdir
(path
)numFiles
= len(fileList
)dataSet
= np
.zeros
([numFiles
,1024],int)hwLabels
= np
.zeros
([numFiles
])for i
in range(numFiles
):filePath
= fileList
[i
]digit
= int(filePath
.split
('_')[0])hwLabels
[i
] = digitdataSet
[i
] = img2vector
(path
+'/'+filePath
)return dataSet
,hwLabelstrain_dataSet
,train_hwLabels
= readDataSet
('trainingDigits')
test_dataSet
,test_hwLabels
= readDataSet
('testDigits')knn
= neighbors
.KNeighborsClassifier
(algorithm
='kd_tree',n_neighbors
=3)
knn
.fit
(train_dataSet
,train_hwLabels
)
res
= knn
.predict
(test_dataSet
)
num
= len(test_dataSet
)
error_num
= np
.sum(res
!= test_hwLabels
)
correct_num
= np
.sum(res
== test_hwLabels
)
print("Total num:",num
,"Wrong num:",error_num
,"WrongRate:",error_num
/float(num
),'correct_num:',correct_num
,'CorrectRate:',correct_num
/float(num
))
- 微信机器人的实现
此处又用到了强大的wxpy
官方说明书:点此进入
from wxpy
import *bot
= Bot
(cache_path
=True)
client
= bot
.friends
().search
('friend')[0]
client
.send
("输入‘功能’,查看微信机器人功能")@bot
.register
()
def response_function(msg
):
if(msg
.text
=='功能'):client
.send
("手写数字识别,请发送一张手写数字图片")@bot
.register
(client
,msg_types
=PICTURE
)
def handdigit_recongnition(msg
):client
.send
("手写数字识别中。。。")msg
.get_file
(save_path
='D:\Python\digit.jpg')'''此时执行图片转换成矩阵的代码还要进行knn.predict()将预测结果写到文件digit.txt中'''with open("D:\\Python\\digit.txt",'r') as f
:f
.seek
(0)b
=f
.read
()f
.close
()client
.send
(b
)embed
()
结果展示
改进之处和TIPS
- 设置邻居数量可以对比预测准确率
- 设置交叉验证可以检测分类器的准确率
- KNN算法只是方法之一,还可以利用神经网络进行识别,添加不同个数的神经元进行训练,最后预测。
- 由于神经网络对于小数据容易过拟合没所以准确率上面KNN大于MLP(多层感知机),MLP对于参数调整比较敏感,若参数不合理容易得到较差的分类结果,所以参数设计对于MLP至关重要。
- 微信机器人还可以进行其他有趣的功能,除了我之前写的微信实现远程控制,我后续还会发一些有趣的实例
- 代码分开了所以有的衔接我没放,给大家想象的空间,自己继续探索吧!
总结
以上是生活随笔为你收集整理的机器学习之KNN结合微信机器人实现手写数字识别终极API的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。