机器学习之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)

    # 设置为32*32的大小
    img = img.resize((32, 32), Image.LANCZOS)

    # 进行保存,方便查看
    img.save('test.png')

    # 得到像素数组,为(32,32,4)
    array = plt.array(img)

    # 按照公式将其转为01, 公式: 0.299 * R + 0.587 * G + 0.114 * B

    gray_array = np.zeros((32, 32))

    # 行数
    for x in range(array.shape[0]):
        # 列数
        for y in range(array.shape[1]):
            # 计算灰度,若为255则白色,数值越小越接近黑色
            gary = 0.299 * array[x][y][0] + 0.587 * array[x][y][1] + 0.114 * array[x][y][2]

            # 设置一个阙值,记为0
            if gary == 255:
                gray_array[x][y] = 0
            else:
                # 否则认为是黑色,记为1
                gray_array[x][y] = 1

    # 得到对应名称的txt文件
    name01 = 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文件
# -*- 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的图片转换为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

#加载训练数据
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] = digit
        dataSet[i] = img2vector(path+'/'+filePath)
    return dataSet,hwLabels

train_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至关重要。
  • 微信机器人还可以进行其他有趣的功能,除了我之前写的微信实现远程控制,我后续还会发一些有趣的实例
  • 代码分开了所以有的衔接我没放,给大家想象的空间,自己继续探索吧!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值