手写体数字识别(三) 制作训练集

版权声明: https://blog.csdn.net/zeroice7/article/details/77996766

环境:Win10 64bit +VS2015(推荐VS2013OpenCV 2.4.9兼容性好) +OpenCV 2.4.9

参考网页:http://www.cnblogs.com/xuanyuyt/p/6405944.html

特征提取方式:HOG(方向梯度直方图,Histogram of Oriented Gradient)

学习模型:SVM(支持向量机,Support Vector Machine)

 

本文目的:通过上一章获取的训练图片,制作训练集。


1. 准备数据训练集

MNIST数据集地址:http://yann.lecun.com/exdb/mnist/

  1. 用Matlab将数据集转化为.bmp格式

(该图片在名称中包含标签,需要处理较长时间)

  1. 将生成以下图片文件

【如需添加训练样本,可在此时添加分辨率为28*28的数字,以提高识别精度】

进入cmd指令生成图片名称文本;

【笔者图片根目录为“C:\Users\Liont\Desktop\Matlab\M_Project”】

  1. 进入cmd指令 
  1. 输入"cd 图片根目录"  在cmd命令中进入文件目录下

如->“ cd C:\Users\Liont\Desktop\Matlab\M_Project ”

【图片若存储在其他盘,需转到其他盘后操作(如D盘),先输入"D:"再做cd操作】

 

  1. 输出".bmp"文件根目录

通过命令 " dir /b/s *.bmp > numTXT.txt"输出名为“numTXT”的txt文本

文本中内容为该训练集图片的路径名

 

  1. 打乱训练样本顺序

对已生成文件名txt文档“numTXT.txt”操作:

2. 为数据集添加标签

      a. 有上一步得出txt文件格式所示

如“C:\Users\Liont\Desktop\Matlab\M_Project\0_0001.bmp”中第40位为标签名称即将第四十位提出作为标签

  1. 利用C++编写程序,生成名为“Num.txt”的文本

第一行为数字图片所在文件根目录,第二行为该数字图片对应标签

#include <fstream>  
#include <string>  
#include <iostream>  
#define StartNum40                        //定义字符开始位数需根据具体目录调整标签位置
using namespace std;
int main()
{
ifstream in("Num.txt");
ofstream out("Result Num.txt");
string filename;
string line;
if (in) //有该文件 
{
while (getline(in, line))        //line中不包括每行的换行符 
{
//复制并输出Txt文件
cout << line << " " <<line[StartNum] << endl;
out << line << endl;
out << line[StartNum]<< endl;         // 输入到Result Num.txt中 
}
}
else // 没有该文件 
{cout << "no such file" <<endl;}
 
return 0;
}

  1. 得到名为“Result Num.txt”的txt文本

 


3. 训练数据集

   利用参考网站的C++程序训练训练集

       a. 利用参考网站的C++程序训练训练集

 

  1. 遇到 ?野指针&内存溢出? 问题

【程序在OpenCV 3.2.0下测试可以通过,产生.xml文件】

【存在3.2.0的训练集无法在2.4.9下无法使用的问题】

解决方法:debug后发现问题存在于以下两句话:

vector<float>descriptors;//存放结果

hog->compute(trainImg,descriptors,Size(1,1), Size(0,0)); //Hog特征计算

?变量指针存在越位? 做以下操作解决问题

将“vector<float>descriptors;”改变定义位置,做为全局变量或放在该调用函数前声明。

  1. 产生.xml训练文件,参考文档(四)【60000个训练数据大约20M】

训练数据时尽量做好监视器输出,方便查看文档进度,笔者电脑配置较差,60000个文件训练了一个多小时。

【结束时仍然出现内存溢出,问题未解决,但不影响输出.xml文件输出】

  1. 测试识别效果(2017.07.08)

运行识别程序:

【未运用试卷手写体训练,初步测试,识别有部分失败】

分析失败原因:

  1. 未经图像预处理;
  2. 图片像素较低;
  3. 书写习惯不同,训练样本未包含书写者手写样本;
  4. 识别所有数字为1,因未经过预处理,笔画太细,在cvResize时像素灰度被平均,因此对一张白色图片进行Hog特征识别,无法显示图片。

【问题:具体程序文档怎样书写???】

/**********************************华丽的分割线************************************/



【内容待添加......】

猜你喜欢

转载自blog.csdn.net/zeroice7/article/details/77996766
今日推荐