如何根据CIFAR-10的格式制作自己的数据集(C/C++版)
来源:互联网 发布:ac尼尔森中国奶粉数据 编辑:程序博客网 时间:2024/06/05 05:49
首先特别感谢博主 @yhl_leo
关于CIFER-10数据集可查看官方介绍,存储信息介绍如下:
不啰嗦,直接上代码实例,图片如何存储为二进制格式的三个代码文件如下:
相应的代码及备注依次如下:
#include "BinaryDataset.h"void BinaDataset::images2BinaryFile( std::string filefolder, std::vector<std::string>& img_list, std::vector<int>& 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 <size_list; ++idx ){std::string currentPath = filefolder + "\\";currentPath += img_list[idx];mat2Binary( currentPath, img_labels[idx], fp );#if 1std::cout << "image " << idx+1 << " saved." << std::endl;#endif}fclose(fp);}void BinaDataset::mat2Binary( std::string& image_file, int label, FILE*& fp ){cv::Mat image = cv::imread( image_file, IMREAD_UNCHANGED );if ( !image.data ){std::cout << "Image " << getFileName(image_file) << " load failed!"<< std::endl;}else{if ( image.channels() == 1 ){cv::cvtColor(image, image, CV_GRAY2RGB );}else{cv::cvtColor(image, image, CV_BGR2RGB );}cv::Mat image_reshaped;cv::resize( image, image_reshaped, cv::Size(_iWidth, _iHeight), CV_INTER_LINEAR );convertMat2Bin(image_reshaped, label, fp);}}/*** 将图片转化为矩阵并将每个元素写入二进制文件* @param image* @param label* @param fp*/void BinaDataset::convertMat2Bin( cv::Mat& image, int label, FILE*& fp ){fwrite(&label, sizeof(char), 1, fp);int pixelCount = image.rows * image.cols;char* pData = (char*)image.data;for ( int i=0; i<pixelCount; i++ )fwrite(&pData[i*3], sizeof(char), 1, fp); // Rfor ( int i=0; i<pixelCount; i++ )fwrite(&pData[i*3+1], sizeof(char), 1, fp); // Gfor ( int i=0; i<pixelCount; i++ )fwrite(&pData[i*3+2], sizeof(char), 1, fp); // B//delete pData;}std::string BinaDataset::getFileName( std::string & filename ){int iBeginIndex = filename.find_last_of("\\")+1;int iEndIndex = filename.length();return filename.substr( iBeginIndex, iEndIndex - iBeginIndex );}std::vector<std::string> BinaDataset::getFileLists( std::string file_folder ){file_folder += "/*.*";const char * mystr=file_folder.c_str();std::vector<std::string> flist;std::string lineStr;std::vector<std::string> 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 imagesfor (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 <iostream>#include <vector>#include <stdio.h>#include <stdlib.h>#include <Windows.h>#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<std::string>& img_list, std::vector<int>& 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<std::string> 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<std::string> fileLists = binData.getFileLists(filefolder); // load file nameconst int size_list = fileLists.size();std::cout << "image count: " << size_list << std::endl;std::vector<int> image_labels(size_list, 0); // generate lables, here are all 0std::string binfile = "C:\\Samples\\train.bin";binData.images2BinaryFile( filefolder, fileLists, image_labels, binfile );}本人转换后的结果如下:
最后,将数据放入CIFAR-10模型中,并修改一下部分参数,效果还不错!
阅读全文
1 0
- 如何根据CIFAR-10的格式制作自己的数据集(C/C++版)
- 仿照CIFAR-10数据集格式,制作自己的数据集
- 模仿CIFAR-10数据集制作自己的数据集(亲测有效)
- tensorflow官网Cifar-10改为自己的TFRecords数据集
- 制作自己的数据集tfrecord格式
- Windows Caffe 学习笔记 CIFAR-10数据的格式转换
- tensorflow如何制作自己的数据集
- 如何制作自己的数据集
- Windows Caffe 学习笔记(零)CIFAR-10数据的格式转换
- 制作自己的图片数据集(VOC2007格式)
- 将自己的数据集制作成TFRecord格式
- TFRecord格式数据和类似cifar的bin格式文件
- Keras基于Cifar-10数据集的CNN实现
- 第四篇:对cifar-10数据集的读取
- Cifar-10数据集的训练与测试
- 数据集(benchmark)、常用数据集的解析(cifar-10、)
- [c#]自己制作类似winrar的打包程序(1)
- 制作一个属于自己的BHO吧!(C#)
- 第03讲 mysql创建数据库
- C#Winform程序前景无限
- 《数据库SQL实战》查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
- Windows Socket 非阻塞模式开发
- 自动释放资源的模板类
- 如何根据CIFAR-10的格式制作自己的数据集(C/C++版)
- Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed with multiple
- 用javascript实现base64编码器
- scrollview嵌套listview 滑动事件冲突的解决方法
- 编写Java程序,制作万年历。
- 树莓派3b入门指南
- 小知识 大智慧
- [转]通过jstack日志分析和问题排查
- C语言strcpy()函数:复制字符串