将自己数据转化为cifar10支持的lmdb
首先,看一下cafferoot/data/cifar10(cafferoot指的是自己caffe安装的根目录)下面的get_cifar10.sh
可见其下载的是bin格式的图片,然后通过cafferoot/examples/cifar10/create_cifar10.sh将bin文件转化为lmdb格式。
那么这样的问题来了,由于,cifar10由官网提供了2进制的bin文件,如果我们想训练自己的模型呢?如果我们想加进自己的图片呢。所以,一个保持和官网cifar10同步的将传统的jpg、png等格式转为bin格式的程序应用而生。
进入正题
1,cifar10的bin数据格式
image 的大小为32*32,flag为0-9,共10类,使用的是cifar-10数据集
二进制数据格式为flag,R(1024),G(1024),B(1024),每个通道按行排列
2,读取cifar10的bin文件,将bin文件中数据转化为图片并显示
- void read_cifar_bin(string file_address,vector<Mat>& image,vector<int>& flag)
- {
- int width = 32, height = 32;//注意这个数值,根据自己样本的大小进行修改,重要的事情说三遍
- ifstream fin(file_address, ios::binary);
- while (!fin.eof())
- {
- char flag_tmp;
- unsigned char tmp;
- Mat image_tmp(width, height, CV_8UC3);
- fin.read((char *)&flag_tmp, sizeof(flag_tmp));
- for (int j = 2; j >=0; j--)
- {
- for (int r = 0; r < image_tmp.rows; r++)
- for (int c = 0; c < image_tmp.cols; c++)
- {
- fin.read((char *)&tmp, sizeof(tmp));
- image_tmp.at<Vec3b>(r, c)[j] = tmp;
- }
- }
- image.push_back(image_tmp);
- flag.push_back(flag_tmp);
- }
- }
3,将自己的jpg,png等传统格式转化为cifar10支持的bin文件
- void write_cifar_bin(string file_address, vector<string>& image_address, vector<int>& flag)
- {
- ofstream fout(file_address, ios::binary);
- for (size_t i = 0; i < image_address.size(); i++)
- {
- Mat image_tmp = imread(image_address[i], 1);
- resize(image_tmp, image_tmp, Size(32, 32));
- int pix[1024];
- char flag_tmp = flag[i];
- fout.write((char *)&flag_tmp, sizeof(flag_tmp));
- for (int j = 2; j >= 0; j--)
- {
- for (int r = 0; r < image_tmp.rows; r++)
- for (int c = 0; c < image_tmp.cols; c++)
- {
- unsigned char tmp = image_tmp.at<Vec3b>(r, c)[j];
- fout.write((char *)&tmp, sizeof(tmp));
- }
- }
- }
- }
- int main()
- {
- string file_address = "data_batch_1.bin";
- vector<Mat> image;
- vector<int>flag;
- read_cifar_bin(file_address, image, flag);
- imshow("test", image[5000]);//随便需要显示的图像。可以跟改[]中数据进行验证
- waitKey();
- return 0;
- }
5,将bin转为图片的测试,并保存为jpg,并且保存相应的flag
- int main()
- {
- string file_address = "data_batch_1.bin";
- vector<Mat> image;
- vector<int>flag;
- read_cifar_bin(file_address, image, flag);
- ofstream mydata_batch_1("mydata_batch_1.txt");
- for (int i = 0; i < image.size(); i++)
- {
- char buffer[50];
- char address[100] = ".\\data_batch_1\\";
- _itoa(i, buffer, 10);
- imwrite(strcat(address, strcat(buffer, ".jpg")), image[i]);
- mydata_batch_1 << address << buffer <<".jpg"<< " " << flag[i] << endl;
- cout << i << endl;
- waitKey(1);
- }
- return 0;
- }
6,将图像转为bin
- int main()
- {
- string file_address = "mydata_batch_1.bin";
- vector<string> image_address;
- vector<int> flag;
- ifstream finSample("mydata_batch_1.txt");
- char buf[100], buftmp[50], flagtmp[10];
- while (!finSample.eof())
- {
- finSample.getline(buf, sizeof(buf));
- sscanf(buf, "%s %s", buftmp, flagtmp);
- int tmp=atoi(flagtmp);
- image_address.push_back(buftmp);
- flag.push_back(tmp);
- }
- write_cifar_bin(file_address, image_address, flag);
- return 0;
- }
7,实验测试
(1)【步骤4】将cifar10的data_batch_1.bin转化为图像的测试,从左到右依次为image[0],image[5000],image[9999](cifar10每个batch有10000个图像,所以是0-9999)
(2) 【步骤5】将cifar10的data_batch_1.bin转化为图像,并保存在jpg格式的测试。
(3)【步骤6】将第二步生成的jpg转化为bin文件, 程序运行后将生成mydata_batch_1.bin,可以看到和原始的data_batch_1.bin有着同样的大小。
那么到底这个和原始的一样不一样呢?我们还是使用步骤4的程序进行测试,同样的还是测试image[0],image[5000],image[9999],从下图可以看出和原始的bin的数据是一样的。
有了上面的2个转化程序,就可以转化自己的图像了,then let's make some noise!
将自己数据转化为cifar10支持的lmdb的更多相关文章
- C# Json数据反序列化为Dictionary并根据关键字获取指定值1
Json数据: { "dataSet": { "header": { "returnCode": "0", " ...
- C# Json数据反序列化为Dictionary并根据关键字获取指定值
Json数据: { "dataSet": { "header": { "returnCode": "0", " ...
- 将Dictionary序列化为json数据 、json数据反序列化为Dictionary
需要引用System.Web.Extensions dll类库 /// <summary> /// 将json数据反序列化为Dictionary /// </summary> ...
- Excel数据转化为sql脚本
在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...
- C#:Json数据反序列化为Dictionary并根据关键字获取指定的值
转自曾是土木人原文 C#:Json数据反序列化为Dictionary并根据关键字获取指定的值 Json数据: { "dataSet": { "header": ...
- [转]Excel数据转化为sql脚本
在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...
- 记一次深刻的教训-----将mat数据转化为SequenceFile
深刻的体会就是,“java.lang.NullPointer.Exception”就是空指针异常可能是由于数组部分元素未被初始化引起的. 1)使用jmatio将mat数据转化为SequenceFile ...
- 把数据转化为JSON格式用ajax进行前后端交互
接着在https://www.cnblogs.com/dong973711/p/10907733.html的基础上做验证. 从前端提交数据 前端页面,submit.html <!DOCTYPE ...
- MySQL随机获取数据的方法,支持大数据量
最近做项目,需要做一个从mysql数据库中随机取几条数据出来. 总所周知,order by rand 会死人的..因为本人对大数据量方面的只是了解的很少,无解,去找百度老师..搜索结果千篇一律.特发到 ...
随机推荐
- js `` 手机不支持
- IOS开发Block详细用法
Block简介: ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数 ...
- [IC]Lithograph(2)光刻技术的分辨率与分辨率增强技术
接上一篇介绍IC制造的基本过程,光刻的基本过程.这篇文章继续介绍光刻过程中的一些概念. 该系列文章的目录如下: [IC]Lithograph(0)半导体制造的基本过程 [IC]Lithograph(1 ...
- 【剑指offer】二叉树的镜像,C++实现(先序遍历)
原创博文,转载请注明出处!github地址 博客文章索引地址 1.题目 输入一颗二叉树,将二叉树变换为原二叉树的镜像,如下图所示: 2.思路 二叉树有0个节点 二叉树有1个节点 二叉树有 ...
- 【排序】插入排序,C++实现
# 基本思想 每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止. # C++代码 #include<iostream> #include<vecto ...
- cocos2d-x 3.17 jsb android运行报错
编译成功,运行失败,提示如下: 2018-11-15 19:09:56.343 2820-2852/net.jd85.test D/cocos2d-x debug info: cocos2d: ful ...
- silverlight——获取控件相对位置
事出有因:页面中存在滚动条,然后点击页面按钮时会进行正确性检查,如果出错在控件的位置会出现提示信息,但由于滚动条的出现,有可能在非可视区域内的控件出了问题,但目前是看不见的,因此,考虑获得出问题控件的 ...
- BZOJ1098 POI2007 办公楼biu 【链表+bfs】
Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决 ...
- 20179223《Linux内核原理与分析》第五周学习笔记
视频内容知识学习 一.用户态.内核态和中断 1.内核态:处于高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态 2.用户态:处于低的执行级别下,代码只能在级别允许的特定 ...
- javaScript之函数(基础篇)
函数定义 定义一: function a(x,y......){if(x>y){return x;}else{return y;}} 详细讲解:function是定义函数的关键字: a(x,y. ...