JobPlus知识库 IT 工业智能4.0 文章
OPENCV3.1 对手写数据集MNIST实现SVM

1.开发环境

-Win10
-Visual Studio 2015 64位

-OpenCV3.1

2.MNIST手写数据库
MNIST数据集分为以下四部分: 
(1) 
train-images-idx3-ubyte 
训练图像的集合,共有60000张,大小是28×28 
(2) 
train-labels-idx1-ubyte 
对应于训练图像的标签集,为0~9 
(3) 
t10k-images-idx3-ubyte 
测试图像的集合,共有10000张,大小是28×28 
(4) 
t10k-labels-idx1-ubyte 

对应于测试图像的标签集,为0~9



TRAINING SET LABEL FILE (train-labels-idx1-ubyte):

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000801(2049) magic number (MSB first) 
0004     32 bit integer  60000            number of items 
0008     unsigned byte   ??               label 
0009     unsigned byte   ??               label 
........ 
xxxx     unsigned byte   ??               label

The labels values are 0 to 9.

注:前四位二进制码代表魔数 4-8位代表标签总数 第9位才开始有标签


TRAINING SET IMAGE FILE (train-images-idx3-ubyte):

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000803(2051) magic number 
0004     32 bit integer  60000            number of images 
0008     32 bit integer  28               number of rows 
0012     32 bit integer  28               number of columns 
0016     unsigned byte   ??               pixel 
0017     unsigned byte   ??               pixel 
........ 
xxxx     unsigned byte   ??               pixel

Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

TEST SET LABEL FILE (t10k-labels-idx1-ubyte):

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000801(2049) magic number (MSB first) 
0004     32 bit integer  10000            number of items 
0008     unsigned byte   ??               label 
0009     unsigned byte   ??               label 
........ 
xxxx     unsigned byte   ??               label

The labels values are 0 to 9.

TEST SET IMAGE FILE (t10k-images-idx3-ubyte):

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000803(2051) magic number 
0004     32 bit integer  10000            number of images 
0008     32 bit integer  28               number of rows 
0012     32 bit integer  28               number of columns 
0016     unsigned byte   ??               pixel 
0017     unsigned byte   ??               pixel 
........ 
xxxx     unsigned byte   ??               pixel

Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black). 


3.代码


注意MNIST的描述中有这样一句话,所有32bit的整数是按照MSB在前(大端模式)进行存储的。在Intel及其他小端处理器上,需要对这些整数进行大小端翻转。

[cpp] 

  1. //大端转小端  
  2. int reverseInt(int i)  
  3. {  
  4.     unsigned char c1, c2, c3, c4;  
  5.   
  6.     c1 = i & 255;  
  7.     c2 = (i >> 8) & 255;  
  8.     c3 = (i >> 16) & 255;  
  9.     c4 = (i >> 24) & 255;  
  10.   
  11.     return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4;  
  12. }  

利用C++中fstream的子类ifstream进行二进制文件的读取,请注意在打开文件时需要设置ios::binary

[cpp] 

  1. ifstream if_testImags("t10k-images-idx3-ubyte", ios::binary);  
  2.     //读取失败  
  3.     if (true == if_testImags.fail())  
  4.     {  
  5.         cout << "Please check the path of file t10k-images-idx3-ubyte" << endl;  
  6.         return;  
  7.     }  

按照下面的代码创建一个SVM的分类器,并初始化参数 
(1)type 
这里我们选择了 SVM::C_SVC 类型,该类型可以用于n-类分类问题 (n>2)。 
(2)kernal 
CvSVM::RBF : 基于径向的函数,对于大多数情况都是一个较好的选择。 
(3)Gamma&C 
经验值选择 
在训练结束之后我们把SVM分类模型保存在xml文件里。

(运行SVM_MNIST项目生成)

4 实验结果


可以测试自己的图片,放在文件目录下。



如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
174人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序