步骤一:收集数据集

数据集来自于Character Recognition in Natural Images网站。
具体的文件链接为:link 中的EnglishHnd.tgz文件。
在该文件夹中,Img文件内含有Sample001—Sample062等62个文件,每个文件中含有55张900*1200像素的图片。其中Sample001—Sample010文件中是0-9数字的图像;其中Sample011—Sample036文件中是26个大写英文字母的图像;Sample037—Sample062文件中是26个小写英文字母的图像。
本文中,只使用Sample011—Sample036文件,处理大写英文字母图像。

步骤二:批量处理图像

1.由于每一幅图像像素点都为900 * 1200,每一个文件夹中含有55幅图片,26个英文字母有26个文件夹,则最终训练的0,1数据量将要达到
z=900∗1200∗55∗26=1544400000z = 900*1200*55*26=1544400000\, z=900∗1200∗55∗26=1544400000
处理这么大的数据量,在pycharm环境中,用python处理这些数据时,如果不用GPU加速,可能会提示memory error错误。
因此,需要把文件夹中的图片像素按比例处理到大小为75*100。

2.用Photoshop批量处理图像(CS5.1版本)的具体步骤如下:
① 在ps中打开Sample011文件夹中的图像img011-001.png。
② 按下‘Alt+F9’,出现动作栏:

③ 新建动作,并点击记录(动作名称自取)。


④ 点击:图像——图像大小——修改像素点大小,并约束比例——确定

⑤ 点击:文件——储存——文件——关闭
⑥点击下图所示按钮停止动作:

⑦动作录入结束。之后可以点击文件——自动——批处理来处理文件夹中的所有图像,但是我一打开PS批处理就会自动弹出,不知道什么原因。因此,我使用另外一种方法,打开到Sample011文件夹,把所有的图像都一起拖到PS面板中:

⑧拖到PS面板后,对每一副图像都点击如下按钮。记得光标要让移动到自己命名的动作上。就可以对每一副图像进行处理。(笨办法,但是很有效,每2分钟大约能处理55张图片)

这样,就可以依次处理Sample011—Sample036等26个文件中的图像。处理后,这些文件夹中图片的像素大小都变为了75*100。

步骤三:批量处理图像,转化为二进制‘txt’文件

用MATLAB处理,把这26个文件夹中的每一副图像处理为一个1*7500的数组并保存在另一个文件夹中,转换为相应的txt文件。
此时,我的Sample文件路径在:

E:\Machinelearning\MachineLearninginAction\DEMO\machinelearninginaction\Ch02\EnglishHnd\Img

转换后的TXT文件名称为’0_0’到’0_54’,再到’25_54’。’ _ ‘之前的数为26个英文字母的序列,如0对应A,1对应B,以此类推;’_'之后的数为55张照片转换成的对应的文件。
批量转换为相应txt文件的MATLAB代码为:

%识别26个大写字母
for i=11:36      %i为文件夹Sample011—Sample036,如果需要识别小写字母的,则改成i=37:62Jia_numble=int2str(i);   %i转化为字符串形式Wenjianjia_name=strcat('Sample0',strcat(Jia_numble,'\'));   %把两字符串结合在一起file_pathshort =  'E:\Machine learning\MachineLearninginAction\DEMO\machinelearninginaction\Ch02\EnglishHnd\Img\';  %存储图像的文件夹路径file_path=strcat(file_pathshort,Wenjianjia_name)img_path_list = dir(strcat(file_path,'*.png'));   %获取该文件夹中所有'png'格式的图像名称img_num = length(img_path_list);                  %获取图像总数量Matrix=zeros(55,7500);                            %55幅图片,像素点为75*100if img_num > 0                                    %有满足条件的图像for j = 1:img_num                             %逐一读取图像image_name = img_path_list(j).name;       % 图像名,如‘img011-041.png’I = imread(strcat(file_path,image_name));fprintf('%d %d %s\n',j,img_num,strcat(file_path,image_name))   % 显示正在处理的图像名i1=rgb2gray(I);           %i1灰度图像i2=im2bw(i1);             % i2是二值图像,不需要求阈值%图像处理过程N=size(i2)                %求图像维数%转换为一维数组re=reshape(i2,1,prod(N)); % prod是累乘,prod(N)=75*100=7500re=~re;        %数组取反%放在矩阵里Matrix(j,:)=re;           %Matrix每一行中为文件中图像的endendstr1=int2str(i-11)                %str1是从0开始,一直到26的整数,为txt文件夹的名字str2=strcat(str1,'_')for N = 1:img_numchr = int2str(N-1)               %N转化为字符串形式file_retrit='E:\Machine learning\MachineLearninginAction\DEMO\machinelearninginaction\Ch02\EnglishHnd\txt\';str=strcat(file_retrit,strcat(strcat(str2,chr),'.txt'))    fid=fopen(str,'wt');             %写的方式打开文件(若不存在,建立文件);fprintf(fid,'%d',Matrix(N,:));   % d 表示以整数形式写入数据,这正是我想要的;fclose(fid);                     %关闭文件endend

代码运行结束后,可以在txt文件夹中找到各种txt文件,如下图:

为了便于理解,把该文件夹改名为:training_A_TO_Z(训练集数据文件)。

步骤四:用手机拍照并把二值化后的像素矩阵存为txt文件

①在纸上写一个大写的B,并用手机拍照:

②用手机自行剪辑的小一点:

③然后,用 link 中用PS处理数字2的方法,处理该图片,改成75*100像素大小。
再用MATLAB处理该图像,得到一组测试集文本文件:test_b_recognise.txt
MATLAB代码如下:

%单个图片转化为txt文件
i=imread('E:\Machine learning\MachineLearninginAction\DEMO\machinelearninginaction\Ch02\B.jpg'); %图片的存储路径
i1=rgb2gray(i);    %i1灰度图像
i2=im2bw(i1);      %i2是二值图像,不需要求阈值
for j=1:75for k=1:100if i2(j,k)==0i2(j,k)=1;elsei2(j,k)=0;endend
end
fid=fopen('E:\Machine learning\MachineLearninginAction\DEMO\machinelearninginaction\Ch02\test_b_recognise.txt','wt'); %写的方式打开文件(若不存在,建立文件);
fprintf(fid,'%d',i2);    %d 表示以整数形式写入数据,这正是我想要的;
fclose(fid);             %关闭文件

步骤五:用KNN算法识别大写字母

所用到的Python代码及其解释如下:

from numpy import *
import operator
from os import listdirdef classify0(inX, dataSet, labels, k):   #对于该函数的解释,见后面图中dataSetSize = dataSet.shape[0]diffMat = tile(inX, (dataSetSize,1)) - dataSetsqDiffMat = diffMat**2sqDistances = sqDiffMat.sum(axis=1)  #every hang add togetherdistances = sqDistances**0.5sortedDistIndicies = distances.argsort()classCount={}          for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]def img_myself_A_TO_Z(filename):   #该函数是针对文本中为1*7500的数组进行处理,返回一个1*7500的数组returnVect=zeros((1,7500))fr=open(filename)lineStr=fr.readline()          #读取一行,即1*7500个字符for i in range(7500):returnVect[0,i]=int(lineStr[i])return returnVectdef handwriting_A_TO_Z(filename):  #filename为待测试的txt文件,本例中为'test_b_recognise.txt'文件hwLabels = []trainingFileList = listdir('training_A_TO_Z')  #储存训练集'training_A_TO_Z'文件夹中所有的文件名到列表trainingFileList中m = len(trainingFileList)trainingMat = zeros((m, 7500))                #每行储存一个图像for i in range(m):fileNameStr = trainingFileList[i]         #第i个文件的文件名储存在fileNameStr中,如‘0_0.txt’fileStr = fileNameStr.split('.')[0]       #把文件名用‘.’分开成两部分,取第一部分,如把‘0_0.txt’分开成‘0_0’与‘txt’两部分,0代表取前一部分classNumStr = int(fileStr.split('_')[0])  #同理,取‘0_0’中前一部分0,并转换为int类型hwLabels.append(classNumStr)              #训练集的标签矩阵trainingMat[i, :] = img2vector('training_A_TO_Z/%s' % fileNameStr)   #打开training_A_TO_Z文件夹下的文件,读取并转化为1*7500的矩阵后,添加到trainingMat的对应行中,组成训练集的矩阵test_myself=img_myself(filename)              #读取filename文件并转化为1*7500的矩阵,组成测试集test_myself_label=classify0(test_myself,trainingMat,hwLabels,5)   #进行训练并测试,把结果放到test_myself_label中print("The test_myself_label is ",test_myself_label)List1=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'] #把结果转化为对应的字母print("The test_myself_label is ",List1[test_myself_label])

classify0()函数的解释如下图:

最后检验识别效果:

handwriting_A_TO_Z('test_b_recognise.txt')

得到运行结果:

识别正确!

机器学习实战:K-近邻(KNN)算法识别26个大写英文字母(A到Z)(含拍照检验步骤详解)相关推荐

  1. 机器学习实战之k-近邻算法识别手写数字(含拍照检验步骤详解)

    哈哈,这是我写的第一篇博客,就此拉开了我的程序员生涯的序幕.希望有缘人看见之后,能够解决你所遇见的问题.废话不多说,开始办正事. 本例中使用K-近邻算法识别手写数字,参考书目:Peter Harrin ...

  2. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  3. Python+OpenCV:理解k近邻(kNN)算法(k-Nearest Neighbour (kNN) algorithm)

    Python+OpenCV:理解k近邻(kNN)算法(k-Nearest Neighbour (kNN) algorithm) 理论 kNN is one of the simplest classi ...

  4. 使用循环把26个大写英文字母按照字…

    使用循环把26个大写英文字母按照字典顺序存入一维数组,然后再使其逆序存放(不得使用另外的数组),最后再根据处理后的字符数组创建一个字符串,输出此字符串.编程完成以上要求. public class T ...

  5. 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别

    文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...

  6. 机器学习实战第二章——KNN算法(源码解析)

    机器学习实战中的内容讲的都比较清楚,一般都能看懂,这里就不再讲述了,这里主要是对代码进行解析,如果你很熟悉python,这个可以不用看. #coding=utf-8 ''' Created on 20 ...

  7. JAVA--第七周实验--输出24个希腊字母与26个大写英文字母--运用类的继承

    第7周实验 1.封装一类对象English,该类对象具有一种功能printEnglish输出英文字母表.再封装一类对象Greek,该类必须是English的子类,该类对象不仅可以调用方法printEn ...

  8. k近邻算法_K近邻(knn)算法是如何完成分类的?

    摘要:K近邻算法是机器学习中的一个非常基础的算法.本文通过自生成数据,通过绘图的方式演示KNN算法的思路,让你不看数学公式就看了解什么是KNN算法. 关键词:KNN算法 1 生成一个二分类的数据集 本 ...

  9. 【OpenCV/C++】KNN算法识别数字的实现原理与代码详解

    KNN算法识别数字 一.KNN原理 1.1 KNN原理介绍 1.2 KNN的关键参数 二.KNN算法识别手写数字 2.1 训练过程代码详解 2.2 预测分类的实现过程 三.KNN算法识别印刷数字 2. ...

最新文章

  1. 手机版本高于xcode,xcode的快速升级
  2. hust sci列表
  3. 给书配代码-电力经济调度(2):计及动态约束及节能环保要求的经济调度
  4. 鸿蒙系统可以替代安卓吗,华为今天发布的鸿蒙系统,到底能不能替代安卓?
  5. 工作394-注册页面学习
  6. 怎样在MySQL中显示中文,而不出现乱码?
  7. python numpy中数组.min()
  8. python-turtle库-01
  9. python商品会员打折_Python微项目分享之双十一优惠计算器
  10. BIND配置文件详解(二)
  11. 如何修复MySQL配置文件?
  12. “实时SPC软件”的“实时”性指什么?一探究竟!
  13. 防治计算机病毒教案,小学信息技术教案:《防治计算机病毒-计算机病毒》
  14. linux rarp命令,通过源码理解Rarp协议(基于linux1.2.13)
  15. 打乱魔方软件_魔方打乱程序思路
  16. python_split()函数使用方法
  17. iOS 调整图片尺寸,告诉你的UI,别问我尺寸!我要最大的
  18. 你知道如何健康饮水吗
  19. DataGrid固定表头,实现滑动效果
  20. java swing jtable分页_Swing之JTable的详细介绍

热门文章

  1. 狼和羊的故事(安徒生新篇)
  2. 2020年程序员技能展望:平均年薪5.4万美元,JavaScript与Python最受欢迎
  3. java架构知识点-大数据与高并发(学习笔记)
  4. 如何解决word文档损坏打不开呢?
  5. 【一罐寡言】你的时间真的是不够用吗?
  6. IIS 应用程序池自动停止处理
  7. 服装ERP应用(21):服装零售的出路 ERP与电子商务里应外合
  8. SpringBoot实现人脸识别功能,亲测可用!
  9. Windows_COM编程
  10. python +pygame 制作五子连珠小游戏