模仿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;
}

代码运行效果如下:


最后生成四个的文件



注意:运行代码前请先看代码文件里的Readme.txt文件内容,确保不必要的错误出现。

文件转换检验方法:
       如果文件生成成功,这里提供一个检验格式转换是否正确的方法,可以用这篇文章里的代码将生成的文件内容保存成图片,若和之前的图片一致,则证明格式转换没有问题,否则格式转换失败.....那就检查一下哪里出了问题吧!

补充:====================================================
如何用TensorFlow中的mnist代码测试自己的数据集
(1)生成后的数据集要转换为.gz格式,可以使用命令gzip filename
(2)下载input_data.pymnist.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系统下用命令运行一下,如果没问题,就是编译器的问题,如果同样有问题,那就继续找原因吧!

温馨提示:各位有问题咨询的话直接评论,不要私信我,我是没法回复私信的,找了半天也没找到如何回复私信,望见谅~~~
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐