日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习之KNN结合微信机器人实现手写数字识别终极API

發(fā)布時(shí)間:2024/3/26 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习之KNN结合微信机器人实现手写数字识别终极API 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

機(jī)器學(xué)習(xí)之KNN結(jié)合微信機(jī)器人實(shí)現(xiàn)手寫數(shù)字識(shí)別終極API

  • 手寫數(shù)字識(shí)別
    • 功能概述
    • 實(shí)現(xiàn)步驟
    • 結(jié)果展示
    • 改進(jìn)之處和TIPS

手寫數(shù)字識(shí)別

功能概述

微信機(jī)器人接收到的手寫數(shù)字圖片,傳送給已經(jīng)經(jīng)過機(jī)器學(xué)習(xí)訓(xùn)練過的knn分類器,進(jìn)行預(yù)測(cè),輸出數(shù)字結(jié)果。

實(shí)現(xiàn)步驟

  • 將手寫數(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表示。所以首先就需要將手寫數(shù)字圖片轉(zhuǎn)換成文本形式。
    ps:DBRHD數(shù)據(jù)集我已上傳到我的資源
from PIL import Image import matplotlib.pylab as plt import numpy as npdef picTo01(filename):"""將圖片轉(zhuǎn)化為32*32像素的文件,用0 1表示:param filename::return:"""# 打開圖片img = Image.open(filename).convert('RGBA')# 得到圖片的像素值raw_data = img.load()# 將其降噪并轉(zhuǎn)化為黑白兩色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)# 設(shè)置為32*32的大小img = img.resize((32, 32), Image.LANCZOS)# 進(jìn)行保存,方便查看img.save('test.png')# 得到像素?cái)?shù)組,為(32,32,4)array = plt.array(img)# 按照公式將其轉(zhuǎn)為01, 公式: 0.299 * R + 0.587 * G + 0.114 * Bgray_array = np.zeros((32, 32))# 行數(shù)for x in range(array.shape[0]):# 列數(shù)for y in range(array.shape[1]):# 計(jì)算灰度,若為255則白色,數(shù)值越小越接近黑色gary = 0.299 * array[x][y][0] + 0.587 * array[x][y][1] + 0.114 * array[x][y][2]# 設(shè)置一個(gè)闕值,記為0if gary == 255:gray_array[x][y] = 0else:# 否則認(rèn)為是黑色,記為1gray_array[x][y] = 1# 得到對(duì)應(yīng)名稱的txt文件name01 = filename.split('.')[0]name01 = name01 + '.txt'# 保存到文件中np.savetxt(name01, gray_array, fmt='%d', delimiter='')if __name__ == '__main__':picTo01('picture.jpg')
  • 手寫數(shù)字識(shí)別代碼編寫
    KNN的輸入是圖片矩陣展開的1024維向量;輸出是一個(gè)數(shù)字。
    KNN手寫數(shù)字識(shí)別實(shí)體構(gòu)建
    1.建立工程并導(dǎo)入sklearn包
    2.加載訓(xùn)練數(shù)據(jù)
    3.構(gòu)建knn分類器
    4.測(cè)試集評(píng)價(jià)
    5.進(jìn)行預(yù)測(cè)
    6.將預(yù)測(cè)結(jié)果寫入txt文件
# -*- coding: utf-8 -*- """ Created on Sat Aug 3 16:24:13 2019@author: 53592 """import numpy as np from os import listdir from sklearn import neighbors#將32*32的圖片轉(zhuǎn)換為1*1024的向量 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#加載訓(xùn)練數(shù)據(jù) 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
    官方說明書:點(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): #機(jī)器人的功能介紹(待完善。。。)if(msg.text=='功能'):client.send("手寫數(shù)字識(shí)別,請(qǐng)發(fā)送一張手寫數(shù)字圖片")@bot.register(client,msg_types=PICTURE) def handdigit_recongnition(msg):client.send("手寫數(shù)字識(shí)別中。。。")msg.get_file(save_path='D:\Python\digit.jpg')'''此時(shí)執(zhí)行圖片轉(zhuǎn)換成矩陣的代碼還要進(jìn)行knn.predict()將預(yù)測(cè)結(jié)果寫到文件digit.txt中'''with open("D:\\Python\\digit.txt",'r') as f:f.seek(0)b=f.read()f.close()#機(jī)器人回復(fù)預(yù)測(cè)結(jié)果client.send(b)embed()

結(jié)果展示

  • 與微信機(jī)器人的對(duì)話

改進(jìn)之處和TIPS

  • 設(shè)置鄰居數(shù)量可以對(duì)比預(yù)測(cè)準(zhǔn)確率
  • 設(shè)置交叉驗(yàn)證可以檢測(cè)分類器的準(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ù)容易過擬合沒所以準(zhǔn)確率上面KNN大于MLP(多層感知機(jī)),MLP對(duì)于參數(shù)調(diào)整比較敏感,若參數(shù)不合理容易得到較差的分類結(jié)果,所以參數(shù)設(shè)計(jì)對(duì)于MLP至關(guān)重要。
  • 微信機(jī)器人還可以進(jìn)行其他有趣的功能,除了我之前寫的微信實(shí)現(xiàn)遠(yuǎn)程控制,我后續(xù)還會(huì)發(fā)一些有趣的實(shí)例
  • 代碼分開了所以有的銜接我沒放,給大家想象的空間,自己繼續(xù)探索吧!

總結(jié)

以上是生活随笔為你收集整理的机器学习之KNN结合微信机器人实现手写数字识别终极API的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。