模仿mnist数据集制作自己的数据集
最近看深度学习,用TensorFlow跑教程里的模型,发现教程里大多都是用mnist和cifar这两个数据集来演示的。想测试自己的数据集看看初步效果,于是就想套用现有的模型,将自己的数据集做成和mnist或cifar数据集格式一模一样的格式。然后就发现Tensorflow里没有现成的方法可以将图片转换成类似于mnist和cifar数据集格式的方法。于是就百度,发现网上几乎同样没有这样的代码,于是就各种查资料,最后自己终于实现了,也是心累啊~~~
好了废话不多说,直接进入主题:
1、关于mnist数据集的介绍,可以去官网查看mnist数据集,也可以看我的另一篇文章(超详细)mnist数据集介绍、读取、保存成图片
这里就不详细介绍了,直接上代码:
代码一共分三个文件:
Image_to_BinaryData.h
Image_to_BinaryData.cpp
Main.cpp
其中:
Image_to_BinaryData.h和Image_to_BinaryData.cpp里面封装了相关的类和函数。
Main.cpp中有相关的参数设置,只需要在Main.cpp中设置好相应的图片大小、文件输入路径和输出路径,编译运行即可。(注意:所有的图片大小必须一致,而且必须是灰度图像,图片命名规则:0_00001.jpg:0表示对应图片的内容,即标签;00001表示标签为0的图片中第1张图片,00002为第2张图片,以此类推........,此代码适合类别数少于等于10的数据集,如果类别数多于10种,可自行修改代码中相应部分)。
下面给出Main.cpp的代码:
#include "Image_to_BinaryData.h"
int main()
{
Image2BinaryData IBD(28,28); //设置图片大小(Height,Width)
/*------------生成训练集文件--------------------------*/
printf("----------生成训练集文件-------------\n");
string trainfilefolder = "C:\\Users\\lyf\\Desktop\\mnist\\train_images"; //训练图片文件路径
vector<string> trainfileLists = IBD.getFileLists(trainfilefolder); //获得文件名列表
const int train_size_list = trainfileLists.size();
cout << "Images Number: " << train_size_list << endl; //输出文件个数
string trainimagebinfilepath = "C:\\Users\\lyf\\Desktop\\train-images-idx3-ubyte"; //训练图片转换保存路径
string trainlabelbinfilepath = "C:\\Users\\lyf\\Desktop\\train-labels-idx1-ubyte"; //训练标签转换保存路径
vector<cv::Mat> TrainImagesMat; //用来存储训练图片像素值
vector<int> train_image_labels(train_size_list); //用来存储训练类标签列表
IBD.ReadImage(trainfilefolder, trainfileLists, train_image_labels, TrainImagesMat); //读取训练图片
IBD.Image2BinaryFile(trainimagebinfilepath, TrainImagesMat, train_image_labels); //训练图片转二进制文件
IBD.Label2BinaryFile(trainlabelbinfilepath, train_image_labels); //训练标签转二进制文件
/*------------生成测试集文件--------------------------*/
printf("\n\n----------生成测试集文件-------------\n");
string testfilefolder = "C:\\Users\\lyf\\Desktop\\mnist\\test_images"; //测试图片文件路径
vector<string> testfileLists = IBD.getFileLists(testfilefolder); //获得文件名列表
const int test_size_list = testfileLists.size();
cout << "Images Number: " << test_size_list << endl; //输出文件个数
string testimagebinfilepath = "C:\\Users\\lyf\\Desktop\\t10k-images-idx3-ubyte"; //测试图片转换保存路径
string testlabelbinfilepath = "C:\\Users\\lyf\\Desktop\\t10k-labels-idx1-ubyte"; //测试标签转换保存路径
vector<cv::Mat> TestImagesMat; //用来存储测试图片像素值
vector<int> test_image_labels(test_size_list); //用来存储测试类标签列表
IBD.ReadImage(testfilefolder, testfileLists, test_image_labels, TestImagesMat); //读取测试图片
IBD.Image2BinaryFile(testimagebinfilepath, TestImagesMat, test_image_labels); //测试图片转二进制文件
IBD.Label2BinaryFile(testlabelbinfilepath, test_image_labels); //测试标签转二进制文件
return 0;
}
代码运行效果如下:
最后生成四个的文件
所有代码下载地址:模仿mnist数据集制作自己的数据集代码
注意:运行代码前请先看代码文件里的Readme.txt文件内容,确保不必要的错误出现。
文件转换检验方法:
如果文件生成成功,这里提供一个检验格式转换是否正确的方法,可以用这篇文章里的代码将生成的文件内容保存成图片,若和之前的图片一致,则证明格式转换没有问题,否则格式转换失败.....那就检查一下哪里出了问题吧!
补充:====================================================
如何用TensorFlow中的mnist代码测试自己的数据集
(1)生成后的数据集要转换为.gz格式,可以使用命令gzip filename
(2)下载input_data.py和mnist.py这两个文件,放入自己训练代码的同一个文件夹下,并修改mnist.py中相应位置,要根据中文注释修改(input_data.py链接已失效,请自行到自己的TensorFlow中寻找,目录为tensorflow.examples.tutorials.mnist import input_data)
(3)在自己训练的代码中导入input_data.py这个文件,一般将语句from tensorflow.examples.tutorials.mnist import input_data 改为 import input_data
(4)修改自己训练代码的相应位置,比如图片大小,batch_size等等。。。
然后运行就可以了.......
注意:如果你用的是pycharm等编译器,有可能会出现import导入语句失败或者数据集读取不对等等各种不知道的问题,此时建议你直接在Linux系统下用命令运行一下,如果没问题,就是编译器的问题,如果同样有问题,那就继续找原因吧!
温馨提示:各位有问题咨询的话直接评论,不要私信我,我是没法回复私信的,找了半天也没找到如何回复私信,望见谅~~~