模仿mnist数据集制作自己的数据集

来源:互联网 发布:java边界布局 编辑:程序博客网 时间:2024/06/05 04:21

模仿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.hImage_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中相应位置,要根据中文注释修改
(3)在自己训练的代码中导入input_data.py这个文件,一般将语句from tensorflow.examples.tutorials.mnist import input_data 改为 import input_data
(4)修改自己训练代码的相应位置,比如图片大小,batch_size等等。。。
然后运行就可以了.......
原创粉丝点击