机器学习之KNN结合微信机器人实现手写数字识别终极API
机器学习之KNN结合微信机器人实现手写数字识别终极API
- 手写数字识别
- 功能概述
- 实现步骤
- 结果展示
- 改进之处和TIPS
手写数字识别
功能概述
微信机器人接收到的手写数字图片,传送给已经经过机器学习训练过的knn分类器,进行预测,输出数字结果。
实现步骤
- 将手写数字图片转变为32*32的矩阵
因为机器学习的训练数据集是DBRHD数据集(训练数据集已上传到我的资料可以自行下载),图片均归一化为以数字为中心的32*32规格的矩阵:空白区域用0表示,字迹部分用1表示。所以首先就需要将手写数字图片转换成文本形式。
ps:DBRHD数据集我已上传到我的资源
from PIL import Image
import matplotlib.pylab as plt
import numpy as npdef 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 * Bgray_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]# 设置一个阙值,记为0if gary == 255:gray_array[x][y] = 0else:# 否则认为是黑色,记为1gray_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] = 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相关推荐
- tensorflow saver_机器学习入门(6):Tensorflow项目Mnist手写数字识别-分析详解
本文主要内容:Ubuntu下基于Tensorflow的Mnist手写数字识别的实现 训练数据和测试数据资料:http://yann.lecun.com/exdb/mnist/ 前面环境都搭建好了,直接 ...
- 在OpenCV里使用机器学习库sklearn 实现手写数字识别1
前面学习过KNN的方式来实现手写数字识别,不过效果一般,那么有没有别的方法来试一试,或许可以改进一点呢.在本文里将要介绍使用SVM和HOG的方式来实现手写数字识别,比如最终结果如下图: 在这个例子里与 ...
- 机器学习入门-kNN算法实现手写数字识别
实验环境 Python:3.7.0 Anconda:3-5.3.1 64位 操作系统:win10 开发工具:sublime text(非必要) 简介 本次实验中的重点为采用kNN算法进行手写数字识别, ...
- 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)
机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...
- 【python】机器学习算法(KNN)入门——手写数字识别
前言 嗨喽~大家好呀,这里是魔王呐 ! 最近邻 (k Nearest Neighbors, KNN)算法是一种分类算法 1968年由Cover和Hart提出,应用场景有宁符识别.文本分类. 图像识别等 ...
- 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别
文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...
- 2 机器学习 K近邻算法(KNN) 学习曲线 交叉验证 手写数字识别
机器学习 1 K-近邻算法介绍 1.1 分类问题 分类问题:根据已知样本的某些特征,判断一个未知样本属于哪种样本类别. 与回归问题相比,分类问题的输出结果是离散值,用于指定输入的样本数据属于哪个类别. ...
- kNN算法实现手写数字识别(机器学习)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.实验步骤 二.实验过程 1.收集数据:提供文本文件 2.准备数据:将图像转换为测试向量 3.测试算法:使用k-近邻 ...
- linux手写数字识别opencv,opencv实现KNN手写数字的识别
人工智能是当下很热门的话题,手写识别是一个典型的应用.为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务. 预处理一张图片: 首 ...
最新文章
- nodejs 根据坐标 标记图片上的姓名列
- CSS之布局(轮廓和圆角)
- java union方法参数_Java Geometry.union方法代碼示例
- mysql8 安装_mysql 8.x 安装向导
- ISO时间转化时间戳
- Java servlet一个最简单的例子
- 利用Java进行MySql数据库的导入和导出
- java数组转换成string_java面试复习重点:类的管理及常用工具,教你抓住面试重点
- 多个定时器相互干扰的问题_相互问题
- JavaScript——根据数组中的某个值进行排序
- 数据加载约定表模型变更_08
- linux怎么删web应用程序错误,Ubuntu 20.04将删除Amazon Web应用程序,但用户可另行安装...
- (王道408考研操作系统)第四章文件管理-第一节4:文件物理结构(文件分配方式)
- MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验...
- 【极客思考】计算机网络:Wireshark抓包分析TCP中的三次握手与四次挥手
- nodejs koa2 mysql_springboot动态加载sigar - SegmentFault 思否
- 美制电线标准AWG与公制、英制单位对照 AWG线规对照表
- 最大子段和问题-蛮力法、分治法、动态规划法
- 正高、正常高和大地高的区别
- 少有人走的路--心智成熟的旅程
热门文章
- 中考计算机填空题技巧,中考英语语法填空解题技巧 非常实用
- 店宝宝:拥抱变化,坦然应对职场中年危机
- 教你编译调试Elasticsearch 6.3.2源码
- 问题描述:office打开加载配置
- 计算机硬盘被配置成动态磁盘,Win7系统分区提示会把选定的基本磁盘转化为动态磁盘怎么办...
- 【机器学习】方差为何除以n-1
- 别再说学生党坑了,你知道我们为了玩吃鸡有多努力吗?
- 防汛救灾应急通信系统
- android手机摄像头传输,以TCP Socket方式实现安卓摄像头数据的传输
- 【物理应用】基于Matlab模拟井筒多相流附matlab代码