仿照CIFAR-10数据集格式,制作自己的数据集

原创 2016年03月04日 12:42:14


本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/50801226


前一篇博客:C/C++ 图像二进制存储与读取中,已经讲解了如何利用C/C++的方法存储与读取二进制图像文件,本文继续讲述如何根据CIFAR-10的格式制作自己的数据集。

所述博文与代码均已同步至GitHub:yhlleo/imageBinaryDataset

主要代码文件有三个:

  • BinaryDataset.h
  • BinaryDataset.cpp
  • main.cpp

main.cpp给出的一个小demo为例,首先指定一个原数据图片所在的文件夹:

std::string filefolder = "C:\\Samples\\train";

然后,自动获得该文件下的所有图片文件名:

std::vector<std::string> fileLists = binData.getFileLists(filefolder); // load file name

这里有一点需要说明一下,getFileLists()是按照文件名升序顺序读取(大家都知道,文件名为字符串,comparable),文件命名最好不要以1, 2, ..., 11, ...这种方式存储,因为这么存,你就会发现1之后的文件可能不是你想的2, 3, 4, ...,而是11, 12, 13, ...

如果你想按照顺序的某一堆数据是一种类别(我是这么做的,因为便于产生对应的labels),建议使用等宽零位补齐的方式命名,例如:00001, 0002, ..., 0011, ...,那么文件读取的顺序就会如我们所设定。

总结一下实现方法(仅供参考):

  • 采集样本的时候可以先类别存于不同的文件夹,命名就随意吧,如果是使用一些抠图软件,也不用纠结一个一个手工修改成自己想要的命名(这么做工作量很大,真的很蛋疼。。。);
  • 每一类数据整理好后,依次将每一类的数据,用程序读取并另存一份(读取使用getFileLists(),反正是一类的,也无所谓先后顺序):
    for ( int i=0; i<fileLists.size(); i++ )
    {
        char* curfile = new char[128];
        sprintf(curfile, "C:\\Samples\\class-1\\%04d.jpg", i);
        string fileName = filefolder + "\\";
        fileName += fileLists[i];
        cv::Mat image = cv::imread(fileName);
        cv::imwrite(curfile, image);
        delete[] curfile;
    }
  • 后面的其他类别也可以这样,为了按照顺序区分,依次进行其他类别的时候,只需要在改动文件夹后,将sprintf(curfile, "C:\\Samples\\class-1\\%04d.jpg", i);中的第三个参数i改为i+k,这里k是前面一类或几类的样本总数。
  • 最后,将重新命名的文件,存在一个文件夹里,记清楚类别对应的区间范围,以便生成labels

读取上述最终文件内的所有文件,接下来,生成labelslabels一般用[0, 9]组成的整数字):

std::vector<int> image_labels(size_list, 0);  // generate lables, here are all 0

当然,你也可以用image_labels.push_back()把所有的labels设置,但是熟悉vector的话,就会明白使用初始化长度,比那种做法更加高效(可以阅读本人的博客: C++ 容器(一):顺序容器简介)。然后就相应地修改某些索引区间内的label值:

for ( int i=0; i<count_class_k; i++ )
    image_labels[i] = 1;

都准备好后,就可以开始生成想要的二进制文件了:

    std::string binfile = "C:\\Samples\\train.bin";
    binData.images2BinaryFile( filefolder, fileLists, image_labels, binfile );

到这里,已经制作好了二进制数据集,我很懒,想直接基于tensorflow/models/image/cifar10模块的源码跑我定义的数据集,想想只要跟cifar10数据集类似,那肯定没什么问题,下面是官网上下载的cifar-10-binary.tar解压后内容:

cifar.rar

这份数据集比较大,训练样本有50000,测试样本10000(我的数据集并没有这么大,但是又有什么关系呢!)。

看,这是我的数据集:

cifar2

是不是很迷你~

然后,将tensorflow/models/image/cifar10模块的拷贝中的部分参数修改成为适合自己数据集的,就OK了~

献上运行截图(训练测试集有5196张样本,所以5196*0.4 = 2078):

run


训练了两天,跑完后,评估精度为:0.896。


另见python 版本: 制作自己的python版本的类CIFAR10数据集

版权声明:本文为博主原创文章,未经博主允许不得转载。

制作自己的python版本的类CIFAR10数据集

之前发布的仿照CIFAR10数据集格式,制作自己的数据集 (C++版本),得到一些网友的关注,并且不断有网友在评论区或者私信里询问,怎样制作python版本的。趁着下午有点闲时间,把制作方法整理发布在...
  • YhL_Leo
  • YhL_Leo
  • 2017年05月07日 19:32
  • 2990

用自己的数据制作python版本cifar10数据集

  • 2017年05月03日 17:25
  • 4KB
  • 下载

Numpy学习(4):自己动手制作类似于cifar10这样的图像数据集

前言大名鼎鼎的cifar10数据集想必大家已经都已经见识过了,如果对cifar10比较陌生,其详解可以参见本人博客:点击查看博客。其在机器学习和深度学习领域地位很重,一般写一个新网络,都要在这个数据集...
  • qq_32166627
  • qq_32166627
  • 2017年04月01日 17:51
  • 1782

【神经网络与深度学习】CIFAR-10数据集介绍

CIFAR-10数据集含有6万个32*32的彩色图像,共分为10种类型,由 Alex Krizhevsky, Vinod Nair和 Geoffrey Hinton收集而来。包含50000张训练图片,...
  • LG1259156776
  • LG1259156776
  • 2016年09月20日 14:08
  • 4184

The CIFAR-10 dataset 数据集

The CIFAR-10 and CIFAR-100 are labeled subsets of the 80 million tiny images dataset. They were co...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年05月23日 12:59
  • 13298

深度学习之图像分类模型Cifar10数据集解读

CIFAR-10数据集含有6万个32*32的彩色图像,共分为10种类型,由 Alex Krizhevsky, Vinod Nair和 Geoffrey Hinton收集而来。包含50000张训练图片,...
  • u010025211
  • u010025211
  • 2016年04月21日 15:03
  • 4305

TensorFlow CNN 测试CIFAR-10数据集

Tensorflow 卷积神经网络测试图像识别数据集CIFAR-10。
  • YhL_Leo
  • YhL_Leo
  • 2016年02月26日 16:43
  • 39371

tensorflow如何制作自己的数据集

用了这么久的tensorflow,例子跑了N多便,基本流程是清楚了。但是自己独立做一个小例子各种问题都来了。如自己图片数据集怎么做?说句老实话,tensorflow真是烦,管方文档教程上老拿MNIST...
  • u012986684
  • u012986684
  • 2017年08月19日 23:42
  • 2578

【CNTK】CNTK学习笔记之制作自己的数据集(以MNIST手写数字数据集为例)

CNTK所使用的数据集格式是这种的:所以我们自己的数据集要做的和这个一样。 MNIST手写数字图片库下载:http://download.csdn.net/detail/bless2015/9610...
  • bless2015
  • bless2015
  • 2016年08月22日 23:28
  • 5727

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

模仿mnist数据集制作自己的数据集 最近看深度学习,用TensorFlow跑教程里的模型,发现教程里大多都是用mnist和cifar这两个数据集来演示的。想测试自己的数据集看看初步效果,于是就想套用...
  • YF_Li123
  • YF_Li123
  • 2017年08月05日 20:18
  • 2921
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:仿照CIFAR-10数据集格式,制作自己的数据集
举报原因:
原因补充:

(最多只允许输入30个字)