本系列文章由 @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解压后内容:

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

看,这是我的数据集:

是不是很迷你~

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

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

<script type="math/tex" id="MathJax-Element-15"> </script>
训练了两天,跑完后,评估精度为:0.896。


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

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

  1. VOC数据集格式转化成COCO数据集格式

    VOC数据集格式转化成COCO数据集格式 一.唠叨      之前写过一篇关于coco数据集转化成VOC格式的博客COCO2VOC,最近读到CenterNet的官方代码,实现上则是将voc转化成coc ...

  2. 【舰船数据集格式转换】HRSID数据集VOC转COCO

    系列文章目录 [舰船数据集格式转换]AIR-SARShip-1.0数据集VOC转COCO [舰船数据集格式转换]AIR-SARShip-2.0数据集VOC转COCO 文章目录 系列文章目录 前言 一. ...

  3. 医学图像分割数据集与制作自己的数据集

    在网上下载到LPBA40的数据集,这个是做配准用的,不过用来说明分割数据集格式也可以. 原始数据: 标签 不同的颜色代表不同的类别.注意其实标签颜色都是灰度值,不是彩色的,之所以看到彩色是因为 3d ...

  4. 建立自己的voc数据集_制作自己的数据集(VOC2007格式)用于Faster-RCNN训练

    一.数据集文件夹 新建一个文件夹,用来存放整个数据集,或者和voc2007一样的名字:VOC2007 然后在文件夹里面新建如下文件夹: 二.将训练图片放到JPEGImages 将所有的训练图片放到该文 ...

  5. TuSimple数据集格式标注自己的数据集

    目录 1.视频数据提取图像帧 2.labelme标注车道线 3.运行脚本,生成标注数据 ​​​​​​​ 由于需要使用自己的数据制作TuSimple格式的数据集,但是未找到合适的标注工具,只好自己写一个 ...

  6. caffe lmdb数据集的制作

    我也参考了别人的文章,其实也算不上原创,只是自我感觉能从头到尾的走一遍挺好的. lmdb数据集的制作 以imagenet数据集为例,我们只制作label范围为[0-10)的数据集,这个只是为了演示如何 ...

  7. WPI交通信号灯数据集格式转换成VOC2007

    WPI交通信号灯数据集格式转换成VOC2007 1.简述 初学交通信号灯目标检测时,总是苦于找不到合适的交通灯数据集.即使找到了数据集,也往往因为格式不同而无法直接使用.因为大部分目标检测代码都只支持 ...

  8. yolo图像检测数据集格式转换:xml 与 txt格式相互转换

    格式介绍 一图流介绍的比较详细,一般图像检测数据集格式为txt或者xml格式,在使用labelimg进行标注的时候,可以设置获得不同格式的数据集,以满足不同算法训练格式要求: 一般建议使用pascal ...

  9. 基于 Labelme 制作手部关键点数据集 并转 COCO 格式

    Labelme 制作手部21个关键点数据 1:环境准备 1.1 基础环境 1.2 安装 Labelme 1.2.1:创建anaconda虚拟环境 1.2.2:激活虚拟环境 1.2.3:安装labelm ...

  10. 利用matlab将自己的数据制作为标准VOC数据集格式

    在使用各种深度网络的时候,需要根据自己的需求,自己的数据fine-tuning自己的模型,首要的一步就是讲自己的数据制作成标准VOC数据集,本文记录自己利用matlab制作标准VOC数据集的方法. 1 ...

最新文章

  1. J360-cloud SpringCloud系列二:服务发现Discovery Service
  2. 专题:固体力学中应力与应变分析详解(6.莫尔应力圆)
  3. laravel框架安装(奶妈式手把手一步步操作)
  4. 数组作为方法返回值_返回地址
  5. mysql查询优化之一:mysql查询优化常用方式
  6. gc日志怎么看_你应该怎么监控Kafka?
  7. Mybatis-Plus 使用自定义注入器后,查询条件中不再添加逻辑删除字段限定条件
  8. 计算机设备管理程序在哪,怎么打开设备管理器
  9. java servlet init方法_Java HttpServlet.init方法代码示例
  10. 行星齿轮设计_3D打印用于制造刚度平衡的行星架
  11. 莫比乌斯反演(bzoj 2301: [HAOI2011]Problem b)
  12. 云表中表单使用导入excel到明细
  13. 太极计算机logo,太极图:最古最美最富有涵义的标志
  14. JQuery中$(document)、$(document).ready()是什么意思?
  15. glassfish java环境_CentOS安装JDK和安装Glassfish
  16. Sphinx 基础教程
  17. exiftool 删除和添加图片旋转信息
  18. 鸿蒙与北斗星云手机,为何其他国产手机不接入鸿蒙?王成录一语道出真谛
  19. php gd图片验证,php笔记之GD库图片创建/简单验证码
  20. 【优化求解】基于多策略黑猩猩优化算法求解单目标优化问题附matlab代码

热门文章

  1. java事务_Java 事务详解
  2. 推荐Ubuntu使用UML工具-Drawio
  3. 2022-03-02 组建raft集群实战及日志复制与主从切换调研
  4. 三角测量计算三维坐标的代码_BIM+GIS——无人机倾斜摄影三维建模方法详解
  5. 如何将STVP的option bytes的配置移植到另外的电脑
  6. 树莓派4B安装配置LibreELEC并连接到三星电视
  7. 机器学习-kmeans(k均值聚类算法)
  8. 利尔达芯智行智能BMS系统方案,让电池的“大脑”更聪明
  9. laravel实战项目之管理员表设计
  10. 1寸、小2寸、2寸证件照片是多大尺寸?