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

下载地址http://yann.lecun.com/exdb/mnist/

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及其他小端处理器上,需要对这些整数进行大小端翻转。

//大端转小端
int reverseInt(int i)
{
    unsigned char c1, c2, c3, c4;

    c1 = i & 255;
    c2 = (i >> 8) & 255;
    c3 = (i >> 16) & 255;
    c4 = (i >> 24) & 255;

    return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4;
}

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

ifstream if_testImags("t10k-images-idx3-ubyte", ios::binary);
	//读取失败
	if (true == if_testImags.fail())
	{
		cout << "Please check the path of file t10k-images-idx3-ubyte" << endl;
		return;
	}
按照下面的代码创建一个SVM的分类器,并初始化参数 
(1)type 
这里我们选择了 SVM::C_SVC 类型,该类型可以用于n-类分类问题 (n>2)。 
(2)kernal 
CvSVM::RBF : 基于径向的函数,对于大多数情况都是一个较好的选择。 
(3)Gamma&C 
经验值选择 
在训练结束之后我们把SVM分类模型保存在xml文件里。

(运行SVM_MNIST项目生成)

4 实验结果



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




完整代码下载链接点击打开链接

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值