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]
- //大端转小端
- 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
[cpp]
- 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 实验结果
可以测试自己的图片,放在文件目录下。
登录 | 立即注册