本系列文章由 @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):

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

仿照CIFAR-10数据集格式,制作自己的数据集的更多相关文章

  1. 自动化工具制作PASCAL VOC 数据集

    自动化工具制作PASCAL VOC 数据集   1. VOC的格式 VOC主要有三个重要的文件夹:Annotations.ImageSets和JPEGImages JPEGImages 文件夹 该文件 ...

  2. SSD-tensorflow-2 制作自己的数据集

    VOC2007数据集格式: VOC2007详细介绍在这里,提供给大家有兴趣作了解.而制作自己的数据集只需用到前三个文件夹,所以请事先建好这三个文件夹放入同一文件夹内,同时ImageSets文件夹内包含 ...

  3. Windows10+YOLOv3实现检测自己的数据集(1)——制作自己的数据集

    本文将从以下三个方面介绍如何制作自己的数据集 数据标注 数据扩增 将数据转化为COCO的json格式 参考资料 一.数据标注 在深度学习的目标检测任务中,首先要使用训练集进行模型训练.训练的数据集好坏 ...

  4. 【Detection】物体识别-制作PASCAL VOC数据集

    PASCAL VOC数据集 PASCAL VOC为图像识别和分类提供了一整套标准化的优秀的数据集,从2005年到2012年每年都会举行一场图像识别challenge 默认为20类物体 1 数据集结构 ...

  5. 【翻译】TensorFlow卷积神经网络识别CIFAR 10Convolutional Neural Network (CNN)| CIFAR 10 TensorFlow

    原网址:https://data-flair.training/blogs/cnn-tensorflow-cifar-10/ by DataFlair Team · Published May 21, ...

  6. 支持10种格式的 HTML 表格导出 jQuery 插件

    HTML 表格导出 jQuery 插件可以帮助用户导出 HTML 表格到 JSON.XML.PNG.CSV.TXT.SQL.MS-Word.MS-Excel.MS-PowerPoint 和 PDF 格 ...

  7. C# 将XML格式字符串,写入数据集的表中 XML解析

    将XML格式字符串,写入数据集的表1中   命名空间:using System.Xml;               string strRead;//strRead为以下xml值           ...

  8. matlab遍历文件制作自己的数据集 .mat文件

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9115788.html 看到深度学习里面的教学动不动就是拿MNIST数据集,或者是IMGPACK ...

  9. Pandas将中文数据集转换为数值类别型数据集

    一个机器学习竞赛中,题目大意如下,本文主要记录数据处理过程,为了模型训练,第一步需要将中文数据集处理为数值类别数据集保存. 基于大数据的运营商投诉与故障关联分析 目标:原始数据集是含大量中文的xls格 ...

随机推荐

  1. scala并发编程原生线程Actor、Case Class下的消息传递和偏函数实战

    參考代码: import scala.actors._ case class Person(name:String,age:Int) class HelloActor extends Actor{ d ...

  2. 推送_即时推送_即时通讯_在线Demo

    [伊尚]美容店(万达店)找创业合伙人(限女生) 点击查看Demo 线上预览 运行Demo截图如下: 线上预览

  3. Java读源代码学设计模式:适配器Adapter

    适配器模式相关源代码:slf4j-1.6.1.hibernate-3.6.7 大家都知道.log4j是一个广泛使用的日志工具,除此之外.sun公司在JDK中也有自己的日志工具,也就是java.util ...

  4. 求int型数据在内存中存储时1的个数

    1.求int型数据在内存中存储时1的个数 输入一个int型数据,计算出该int型数据在内存中存储时1的个数. 我们非常easy想到例如以下方法: #include <iostream> u ...

  5. 使用RabbitMQ放置自己定义对象(不借助序列化工具,比如protobuffer)V2.0

    怎样使用RabbitMQ盛放自己定义的对象呢?一般都会使用序列化工具在投放之前转换一次.从MQ取回的时候再逆序列化还原为本地对象.这里使用C++自带的强制类型装换,将本地对象的内存模型当做自然的序列化 ...

  6. [BZOJ 3387] Fence Obstacle Course

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3387 [算法] f[i][0]表示从第i个栅栏的左端点走到原点的最少移动步数 f[i ...

  7. js 随机生成信用卡号

    本文实例讲述了JavaScript随机生成信用卡卡号的方法.分享给大家供大家参考.具体分析如下: 这段JS代码根据信用卡卡号产生规则随机生成信用卡卡号,是可以通过验证的,仅供学习参考,请不要用于非法用 ...

  8. Tomcat安全设置与优化详解(非原创)

    一.Tomcat简介二.Tomcat安全设置三.Tomcat优化四.参考文章   一.Tomcat简介 Tomcat 是 Apache软件基金会下的一个免费.开源的WEB应用服务器,它可以运行在 Li ...

  9. 使用Micrisoft.net设计方案 第一章 企业解决方案中构建设计模式

    第一章企业解决方案中构建设计模式 我们知道的系统总是由简单到复杂,而不是直接去设计一个复杂系统.如果直接去设计一个复杂系统,结果最终会导致失败.在设计系统的时候,先设计一个能够正常工作的系统,然后在此 ...

  10. RedHat/CentOS 大文件拆分及合并与md5验证

    [root@tdh55 mnt]# cd /opt/[root@tdh55 opt]# ll -h-rw-r--r--. 1 root root 7.5G May 12 11:19 TDH-Image ...