大家都知道,在caffe里面,要运行cifar10的例子就得先由cifar10的数据库。由于caffe为了提高运行效率,减少磁盘寻道时间等,统一了数据接口(lmdb,leveldb)。

首先,看一下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文件中数据转化为图片并显示

  1. void read_cifar_bin(string file_address,vector<Mat>& image,vector<int>& flag)
  2. {
  3. int width = 32, height = 32;//注意这个数值,根据自己样本的大小进行修改,重要的事情说三遍
  4. ifstream fin(file_address, ios::binary);
  5. while (!fin.eof())
  6. {
  7. char flag_tmp;
  8. unsigned char tmp;
  9. Mat image_tmp(width, height, CV_8UC3);
  10. fin.read((char *)&flag_tmp, sizeof(flag_tmp));
  11. for (int j = 2; j >=0; j--)
  12. {
  13. for (int r = 0; r < image_tmp.rows; r++)
  14. for (int c = 0; c < image_tmp.cols; c++)
  15. {
  16. fin.read((char *)&tmp, sizeof(tmp));
  17. image_tmp.at<Vec3b>(r, c)[j] = tmp;
  18. }
  19. }
  20. image.push_back(image_tmp);
  21. flag.push_back(flag_tmp);
  22. }
  23. }

3,将自己的jpg,png等传统格式转化为cifar10支持的bin文件

  1. void write_cifar_bin(string file_address, vector<string>& image_address, vector<int>& flag)
  2. {
  3. ofstream fout(file_address, ios::binary);
  4. for (size_t i = 0; i < image_address.size(); i++)
  5. {
  6. Mat image_tmp = imread(image_address[i], 1);
  7. resize(image_tmp, image_tmp, Size(32, 32));
  8. int pix[1024];
  9. char flag_tmp = flag[i];
  10. fout.write((char *)&flag_tmp, sizeof(flag_tmp));
  11. for (int j = 2; j >= 0; j--)
  12. {
  13. for (int r = 0; r < image_tmp.rows; r++)
  14. for (int c = 0; c < image_tmp.cols; c++)
  15. {
  16. unsigned char tmp = image_tmp.at<Vec3b>(r, c)[j];
  17. fout.write((char *)&tmp, sizeof(tmp));
  18. }
  19. }
  20. }
  21. }

4,将bin转为图片的测试,并用OpenCV显示

  1. int main()
  2. {
  3. string file_address = "data_batch_1.bin";
  4. vector<Mat> image;
  5. vector<int>flag;
  6. read_cifar_bin(file_address, image, flag);
  7. imshow("test", image[5000]);//随便需要显示的图像。可以跟改[]中数据进行验证
  8. waitKey();
  9. return 0;
  10. }

5,将bin转为图片的测试,并保存为jpg,并且保存相应的flag

  1. int main()
  2. {
  3. string file_address = "data_batch_1.bin";
  4. vector<Mat> image;
  5. vector<int>flag;
  6. read_cifar_bin(file_address, image, flag);
  7. ofstream mydata_batch_1("mydata_batch_1.txt");
  8. for (int i = 0; i < image.size(); i++)
  9. {
  10. char buffer[50];
  11. char address[100] = ".\\data_batch_1\\";
  12. _itoa(i, buffer, 10);
  13. imwrite(strcat(address, strcat(buffer, ".jpg")), image[i]);
  14. mydata_batch_1 << address << buffer <<".jpg"<< " " << flag[i] << endl;
  15. cout << i << endl;
  16. waitKey(1);
  17. }
  18. return 0;
  19. }

6,将图像转为bin

  1. int main()
  2. {
  3. string file_address = "mydata_batch_1.bin";
  4. vector<string> image_address;
  5. vector<int> flag;
  6. ifstream finSample("mydata_batch_1.txt");
  7. char buf[100], buftmp[50], flagtmp[10];
  8. while (!finSample.eof())
  9. {
  10. finSample.getline(buf, sizeof(buf));
  11. sscanf(buf, "%s %s", buftmp, flagtmp);
  12. int tmp=atoi(flagtmp);
  13. image_address.push_back(buftmp);
  14. flag.push_back(tmp);
  15. }
  16. write_cifar_bin(file_address, image_address, flag);
  17. return 0;
  18. }

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的更多相关文章

  1. C# Json数据反序列化为Dictionary并根据关键字获取指定值1

    Json数据: { "dataSet": { "header": { "returnCode": "0", " ...

  2. C# Json数据反序列化为Dictionary并根据关键字获取指定值

    Json数据: { "dataSet": { "header": { "returnCode": "0", " ...

  3. 将Dictionary序列化为json数据 、json数据反序列化为Dictionary

    需要引用System.Web.Extensions  dll类库 /// <summary> /// 将json数据反序列化为Dictionary /// </summary> ...

  4. Excel数据转化为sql脚本

    在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...

  5. C#:Json数据反序列化为Dictionary并根据关键字获取指定的值

    转自曾是土木人原文 C#:Json数据反序列化为Dictionary并根据关键字获取指定的值 Json数据: { "dataSet": { "header": ...

  6. [转]Excel数据转化为sql脚本

    在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...

  7. 记一次深刻的教训-----将mat数据转化为SequenceFile

    深刻的体会就是,“java.lang.NullPointer.Exception”就是空指针异常可能是由于数组部分元素未被初始化引起的. 1)使用jmatio将mat数据转化为SequenceFile ...

  8. 把数据转化为JSON格式用ajax进行前后端交互

    接着在https://www.cnblogs.com/dong973711/p/10907733.html的基础上做验证. 从前端提交数据 前端页面,submit.html <!DOCTYPE ...

  9. MySQL随机获取数据的方法,支持大数据量

    最近做项目,需要做一个从mysql数据库中随机取几条数据出来. 总所周知,order by rand 会死人的..因为本人对大数据量方面的只是了解的很少,无解,去找百度老师..搜索结果千篇一律.特发到 ...

随机推荐

  1. c++语言第二次作业

    一题目7-1统计学生成绩 1实验代码 #include<stdio.h> int main(void) { int i,n,grade,A,B,C,D,E; A=B=C=D=E=; sca ...

  2. excel中多表汇总

    excel中将多个表中的结果汇总到一张表格里,而且汇总表格的数据是随着其它表格的数据变化面变化 其实就是函数sumif的使用,sumif函数的结构: sumif函数语法 sumif(range,cri ...

  3. Linux文件传输scp和rsync断点续传

    scp 是通过ssh协议传输数据,如果是想传输一个很大的数据,这几天我就遇到过,一个tar包,400G左右,通过scp拷贝时,有可能遇到服务器断电什么的悲剧问题,那么类似scp拷贝的另一个命令 rsy ...

  4. 使用LinkedBlockingQueue来实现生产者消费者的例子

    工作中,经常有将文件中的数据导入数据库的表中,或者将数据库表中的记录保存到文件中.为了提高程序的处理速度,可以设置读线程和写线程,这些线程通过消息队列进行数据交互.本例就是使用了LinkedBlock ...

  5. C# 速编神器LinqPad(新版5.25)

    点此下载5.25 (支持.net4.6,有调试器)(页面有广告,一直点免费下载即可)(可用)密码  lp123456  批处理如下. @echo off start /b LINQPad.exe -n ...

  6. Uoj 22 外星人

    Uoj 22 外星人 注意到一个数只有 \(\%\) 了小于等于自己的数时,才可能有变化,否则可以随意安排,不会对最后最优解造成影响. 用 \(f[x]\) 表示给一个数 \(x\) ,仅用 \(a[ ...

  7. BZOJ1220 HNOI2002 跳蚤 【容斥原理+高精度】*

    BZOJ1220 HNOI2002 跳蚤 Description Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持 ...

  8. Scoi 2010 幸运数字

    [题目描述]在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸 ...

  9. 20165212 预备作业3 Linux安装及学习

    20165212 预备作业3Linux安装及学习 Linux虚拟机的安装过程 我像大部分同学一样,通过助教学姐给的Ubuntu下载地址下载映像文件.VB,但是屡次出现问题,不停的闪出一下错误提示窗口: ...

  10. 《DSP using MATLAB》第7章开始 Example7.1

    FIR低通滤波器的设计要求示意图: