python数字识别_利用Python进行数字识别
思路
通过Python实现KNN算法。而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。详情可在上一篇文章开头有介绍:
https://www.jianshu.com/p/bddf84a60efc
转载请注明出处:Michael孟良
准备
在Java项目里写了一个RGBUtils的class,将32x32像素的图片全部数字化输出:
package com.yml.common;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class RGBUtils {
public static void main(String[]args){
try {
BufferedImage bi = ImageIO.read(new File("D:\\workspace\\Utils\\src\\com\\yml\\common\\9_1.png"));
String picString = "";
for (int i = 0; i < 32; i++) {
for (int j = 0; j < 32; j++) {
picString += getRGB(bi, j, i);
}
picString += "\r\r\n";
}
System.out.println(picString);
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getRGB(BufferedImage image, int x, int y) {
int[] rgb = null;
if (image != null && x < image.getWidth() && y < image.getHeight()) {
rgb = new int[3];
int pixel = image.getRGB(x, y);
rgb[0] = (pixel & 0xff0000) >> 16;
rgb[1] = (pixel & 0xff00) >> 8;
rgb[2] = (pixel & 0xff);
}
if(null!=rgb&&255==rgb[0]&&255==rgb[1]&&255==rgb[2]){
return 0;
}else{
return 1;
}
}
}
这是我在PS新建的32x32像素的数字9:
数字9
黑色是1白色是0,执行上述java类后得到
数字9
JAVA代码:https://github.com/MichaelYipInGitHub/PythonTest/blob/master/com/test/knn/JavaUtils/RGBUtils.java
要放到java项目里跑
如此这般我写了三个字一个5两个9,将他们变成TXT文件再TestData文件夹下
代码(Python)
# coding:utf-8
import os
import numpy as np
# 此方法将每个文件中32*32的矩阵数据,转换到1*1024一行中
from com.test.knn.KNNArcheyTest import classify
def img2vector(filename):
# 创建一个1行1024列的矩阵
returnVect = np.zeros((1, 1024))
# 打开当前的文件
fr = open(filename, "rb")
# 每个文件中有32行,每行有32列数据,遍历32个行,将32个列数据放入1024的列中
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVect[0, 32 * i + j] = int(lineStr[j])
return returnVect
def IdentifImg():
labels = []
# 读取训练集 TrainData目录下所有的文件和文件夹
trainingFileList = os.listdir('TrainData')
m = len(trainingFileList)
# zeros((m,1024)) 返回一个m行 ,1024列的矩阵,默认是浮点型的
trainingMat = np.zeros((m, 1024))
for i in range(m):
# 获取文件名称 0_0.txt
fileNameStr = trainingFileList[i]
# 获取文件除了后缀的名称
fileStr = fileNameStr.split('.')[0]
# 获取文件"数字"的类别
classNumStr = int(fileStr.split('_')[0])
labels.append(classNumStr)
# 构建训练集, img2vector 每个文件返回一行数据 1024列
trainingMat[i, :] = img2vector('TrainData/%s' % fileNameStr)
# 读取测试集数据
testFileList = os.listdir('TestData')
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i] #0_0.txt
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('TestData/%s' % fileNameStr)
classifierResult = classify(vectorUnderTest, trainingMat, labels, 5)
print("识别出的数字是: %d, 真实数字是: %d" % (classifierResult, classNumStr))
if (classifierResult != classNumStr):
errorCount += 1.0
print("\n识别错误次数 %d" % errorCount)
errorRate = errorCount / float(mTest)
print("\n正确率: %f" % (1 - errorRate))
if __name__ == '__main__':
IdentifImg()
思路
首先将32x32像素的图片转变成一行1024(=32x32)空间坐标,其实就相当于一个1024维的空间。TainData 里面有两千条数据就相当于有两千个点。
我们新建一个方法叫classify,就是把我们要测试的点放到训练数据空间里,看离他最近的k个点是什么值,这里我们K设置为5
# normData 测试数据集的某行, dataSet 训练数据集 ,labels 训练数据集的类别,k k的值
def classify(normData, dataSet, labels, k):
# 计算行数
dataSetSize = dataSet.shape[0]
# print ('dataSetSize 长度 =%d'%dataSetSi ; vzvz ze)
# 当前点到所有点的坐标差值 ,np.tile(x,(y,1)) 复制x 共y行 1列
diffMat = np.tile(normData, (dataSetSize, 1)) - dataSet
# 对每个坐标差值平方
sqDiffMat = diffMat ** 2
# 对于二维数组 sqDiffMat.sum(axis=0)指 对向量每列求和,sqDiffMat.sum(axis=1)是对向量每行求和,返回一个长度为行数的数组
# 例如:narr = array([[ 1., 4., 6.],
# [ 2., 5., 3.]])
# narr.sum(axis=1) = array([ 11., 10.])
# narr.sum(axis=0) = array([ 3., 9., 9.])
sqDistances = sqDiffMat.sum(axis=1)
# 欧式距离 最后开方
distance = sqDistances ** 0.5
# x.argsort() 将x中的元素从小到大排序,提取其对应的index 索引,返回数组
# 例: tsum = array([ 11., 10.]) ---- tsum.argsort() = array([1, 0])
sortedDistIndicies = distance.argsort()
# classCount保存的K是魅力类型 V:在K个近邻中某一个类型的次数
classCount = {}
for i in range(k):
# 获取对应的下标的类别
voteLabel = labels[sortedDistIndicies[i]]
# 给相同的类别次数计数
classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
# sorted 排序 返回新的list
# sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True)
return sortedClassCount[0][0]
我之前写的3的数字也变成1024维空间的点,选择最近的五个点进行判断。
输出结果
原来图片
代码
总结
1.Python没用封装KNN 算法, 因为太简单,可以直接手写。
2.从图片上看, 我用粗笔写的数字能识别到,细笔写的就识别不到,这可能与我的训练数据多为粗笔字体。
3.数字识别可以引申到动物识别,人物识别,不过他们用的像素不只是0和1,数据会更加庞大, 算法更加复杂。
python数字识别_利用Python进行数字识别相关推荐
- python中颜色介意用数字表示_利用Python实现颜色色值转换的小工具
先看看Zeplin 的颜色色值显示示例 原有处理方式 因为我会 Python (仅限于终端输入 python 然后当做计算器算,或者用 hex() 函数把十进制转换成十六进制),所以遇到这样的问题我当 ...
- python文字验证码识别_利用python进行验证码识别(预处理部分)
# -*- coding: utf-8 -*- """Created on Thu Feb 1 15:52:05 2018@author: Administrator&q ...
- python实现图像识别_利用Python进行简单的图像识别(验证码)
这是一个最简单的图像识别,将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract.image_to_string(image)识别后将结果存入到本地的txt ...
- python扫雷脚本_利用 Python 实现 自动扫雷 小脚本
原标题:利用 Python 实现 自动扫雷 小脚本 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式.一.准备工作1.扫雷游戏 我是 ...
- python自动扫雷_利用Python实现自动扫雷
自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: w ...
- 利用python进行数据分析_利用python进行数据分析复现(1)
一直以来,都想学习python数据分析相关的知识,总是拖拖拉拉,包括这次这个分享也是.<利用python进行数据分析 第2版>是一次无意之间在简书上看到的一个分享,我决定将很详细.一直都 ...
- python计算信息增益_利用Python提取ABAQUS的计算结果(ODB)信息、体积、应变等变化(一)...
00 实例模型 一个金属长方体,我们需要对其做拉伸的加载约束示意图如图1,并在完成后采用Python命令流读取参考点的位移.体积.应变随加载时间的变化情况. 图1 金属长方体约束加载示意图 01 Py ...
- python计算器程序_利用Python代码编写计算器小程序
1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 def __init__(self):8 #创建主界面 9 ...
- 日语python怎么说_利用python进行日语汉字-假名转换
一.前言 最近在学日语,五十音图已会,进入到日语汉字的学习部分.目前遇到的最大困哪是日语进行训读的汉字记不住它的发音,或者记了就忘记,例如'山口-やまくち 本田-ほんだ'. 于是想到了用python进 ...
- python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密
原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...
最新文章
- Solaris 10 x86 上折腾Mono
- 此blog已经迁移~~~
- NanoHttpd源码分析
- 虚拟主机时代:美国主机如何在国内显神通
- springboot上传文件及文件上传限制大小异常捕获
- 带有JBoss工具的OpenShift 3上的Java EE 7应用程序
- MVC与三层架构区别
- 【转】2015-新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序
- 冷凝器换热效果变差后果
- css 设置背景图片透明
- 服务器被黑客入侵了怎么办?
- armbian开启ssh_Armbian Ubuntu启用netplan配置网络
- 浅谈人脸识别在公共安全领域的应用
- 皮卡丘pikachu
- 看完这篇文章你还敢说不知道多线程是什么?
- BZOJ_3238_[Ahoi2013]差异_后缀自动机
- 2021年中国吉他和低音放大器市场趋势报告、技术动态创新及2027年市场预测
- 对称密钥算法和公钥算法的优缺点
- 程序员要注重沟通能力的提升
- OC基础 Block