如何根据CIFAR-10的格式制作自己的数据集(C/C++版)

首先特别感谢博主 @yhl_leo

关于CIFER-10数据集可查看官方介绍,存储信息介绍如下:

如何根据CIFAR-10的格式制作自己的数据集(C/C++版)_第1张图片

不啰嗦,直接上代码实例,图片如何存储为二进制格式的三个代码文件如下:


相应的代码及备注依次如下:

#include "BinaryDataset.h"

void BinaDataset::images2BinaryFile( 
	std::string filefolder, std::vector& img_list, 
	std::vector& img_labels, std::string filename )
{
	const int size_list = img_list.size();

	FILE *fp = fopen( filename.c_str(), "wb" );
	if ( fp == NULL )
	{
		std::cout << "Open error!" << std::endl;
		fclose(fp);
		return;
	}

	for ( int idx = 0; idx  BinaDataset::getFileLists( std::string file_folder )
{
	file_folder += "/*.*";
	const char * mystr=file_folder.c_str();
	std::vector flist;
	std::string lineStr;
	std::vector extendName;
	extendName.push_back("jpg");
	extendName.push_back("JPG");
	extendName.push_back("bmp");
	extendName.push_back("png");
	extendName.push_back("gif");

	HANDLE file;
	WIN32_FIND_DATA fileData;
	char line[1024];
	wchar_t fn[1000];
	mbstowcs( fn, mystr, 999 );
	file = FindFirstFile( fn, &fileData );
	FindNextFile( file, &fileData );
	while(FindNextFile( file, &fileData ))
    {
		wcstombs( line, (const wchar_t*)fileData.cFileName, 259);
		lineStr = line;
        // remove the files which are not images
		for (int i = 0; i < 4; i ++)
		{
			if (lineStr.find(extendName[i]) < 999)
			{
				flist.push_back(lineStr);
				break;
			}
		}	
	}
	return flist;
}
#ifndef BINARY_DATASET_H
#define BINARY_DATASET_H
#pragma once

#include 
#include 
#include 
#include 
#include 

#include "cv.h"
#include "highgui.h"

using namespace std;
using namespace cv;

class BinaDataset
{
public:
	BinaDataset()
	{
		_iHeight = 32;
		_iWidth  = 32;
	}
	~CrackBinaDataset(){}

public:
	void images2BinaryFile( std::string filefolder, std::vector& img_list, 
		std::vector& img_labels, std::string filename );
	
	void mat2Binary( std::string& image_file, int label, FILE*& fp );

	void convertMat2Bin( cv::Mat& image, int label, FILE*& fp );

//	cv::Mat imageReshape( cv::Mat& input );

	std::string getFileName( std::string & filename );

	std::vector getFileLists( std::string file_folder );

public:
	int _iHeight;
	int _iWidth;
};
#endif // BINARY_DATASET_H

#include "BinaryDataset.h"

void main()
{
	std::string filefolder = "train\\"; //图片所在的文件夹
	BinaDataset binData;
	std::vector fileLists = binData.getFileLists(filefolder); // load file name
	
	const int size_list = fileLists.size();
	std::cout << "image count: " << size_list << std::endl;
	
	std::vector image_labels(size_list, 0);  // generate lables, here are all 0
	
	std::string binfile = "C:\\Samples\\train.bin";
	binData.images2BinaryFile( filefolder, fileLists, image_labels, binfile );
}
本人转换后的结果如下:

如何根据CIFAR-10的格式制作自己的数据集(C/C++版)_第2张图片如何根据CIFAR-10的格式制作自己的数据集(C/C++版)_第3张图片

最后,将数据放入CIFAR-10模型中,并修改一下部分参数,效果还不错!




你可能感兴趣的:(如何根据CIFAR-10的格式制作自己的数据集(C/C++版))