生活随笔
收集整理的這篇文章主要介紹了
机器学习之KNN结合微信机器人实现手写数字识别终极API
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
機(jī)器學(xué)習(xí)之KNN結(jié)合微信機(jī)器人實(shí)現(xiàn)手寫(xiě)數(shù)字識(shí)別終極API
- 手寫(xiě)數(shù)字識(shí)別
- 功能概述
- 實(shí)現(xiàn)步驟
- 結(jié)果展示
- 改進(jìn)之處和TIPS
手寫(xiě)數(shù)字識(shí)別
功能概述
微信機(jī)器人接收到的手寫(xiě)數(shù)字圖片,傳送給已經(jīng)經(jīng)過(guò)機(jī)器學(xué)習(xí)訓(xùn)練過(guò)的knn分類(lèi)器,進(jìn)行預(yù)測(cè),輸出數(shù)字結(jié)果。
實(shí)現(xiàn)步驟
- 將手寫(xiě)數(shù)字圖片轉(zhuǎn)變?yōu)?2*32的矩陣
因?yàn)闄C(jī)器學(xué)習(xí)的訓(xùn)練數(shù)據(jù)集是DBRHD數(shù)據(jù)集(訓(xùn)練數(shù)據(jù)集已上傳到我的資料可以自行下載),圖片均歸一化為以數(shù)字為中心的32*32規(guī)格的矩陣:空白區(qū)域用0表示,字跡部分用1表示。所以首先就需要將手寫(xiě)數(shù)字圖片轉(zhuǎn)換成文本形式。
ps:DBRHD數(shù)據(jù)集我已上傳到我的資源
from PIL
import Image
import matplotlib
.pylab
as plt
import numpy
as np
def picTo01(filename
):"""將圖片轉(zhuǎn)化為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')
- 手寫(xiě)數(shù)字識(shí)別代碼編寫(xiě)
KNN的輸入是圖片矩陣展開(kāi)的1024維向量;輸出是一個(gè)數(shù)字。
KNN手寫(xiě)數(shù)字識(shí)別實(shí)體構(gòu)建
1.建立工程并導(dǎo)入sklearn包
2.加載訓(xùn)練數(shù)據(jù)
3.構(gòu)建knn分類(lèi)器
4.測(cè)試集評(píng)價(jià)
5.進(jìn)行預(yù)測(cè)
6.將預(yù)測(cè)結(jié)果寫(xiě)入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
))
- 微信機(jī)器人的實(shí)現(xiàn)
此處又用到了強(qiáng)大的wxpy
官方說(shuō)明書(shū):點(diǎn)此進(jìn)入
from wxpy
import *bot
= Bot
(cache_path
=True)
client
= bot
.friends
().search
('friend')[0]
client
.send
("輸入‘功能’,查看微信機(jī)器人功能")@bot
.register
()
def response_function(msg
):
if(msg
.text
=='功能'):client
.send
("手寫(xiě)數(shù)字識(shí)別,請(qǐng)發(fā)送一張手寫(xiě)數(shù)字圖片")@bot
.register
(client
,msg_types
=PICTURE
)
def handdigit_recongnition(msg
):client
.send
("手寫(xiě)數(shù)字識(shí)別中。。。")msg
.get_file
(save_path
='D:\Python\digit.jpg')'''此時(shí)執(zhí)行圖片轉(zhuǎn)換成矩陣的代碼還要進(jìn)行knn.predict()將預(yù)測(cè)結(jié)果寫(xiě)到文件digit.txt中'''with open("D:\\Python\\digit.txt",'r') as f
:f
.seek
(0)b
=f
.read
()f
.close
()client
.send
(b
)embed
()
結(jié)果展示
改進(jìn)之處和TIPS
- 設(shè)置鄰居數(shù)量可以對(duì)比預(yù)測(cè)準(zhǔn)確率
- 設(shè)置交叉驗(yàn)證可以檢測(cè)分類(lèi)器的準(zhǔn)確率
- KNN算法只是方法之一,還可以利用神經(jīng)網(wǎng)絡(luò)進(jìn)行識(shí)別,添加不同個(gè)數(shù)的神經(jīng)元進(jìn)行訓(xùn)練,最后預(yù)測(cè)。
- 由于神經(jīng)網(wǎng)絡(luò)對(duì)于小數(shù)據(jù)容易過(guò)擬合沒(méi)所以準(zhǔn)確率上面KNN大于MLP(多層感知機(jī)),MLP對(duì)于參數(shù)調(diào)整比較敏感,若參數(shù)不合理容易得到較差的分類(lèi)結(jié)果,所以參數(shù)設(shè)計(jì)對(duì)于MLP至關(guān)重要。
- 微信機(jī)器人還可以進(jìn)行其他有趣的功能,除了我之前寫(xiě)的微信實(shí)現(xiàn)遠(yuǎn)程控制,我后續(xù)還會(huì)發(fā)一些有趣的實(shí)例
- 代碼分開(kāi)了所以有的銜接我沒(méi)放,給大家想象的空間,自己繼續(xù)探索吧!
總結(jié)
以上是生活随笔為你收集整理的机器学习之KNN结合微信机器人实现手写数字识别终极API的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。