caffe中非图片数据转为lmdb文件

        caffe训练时,一般会先把数据转换成lmdb格式的文件,图片怎么转成lmdb格式的文件,比较简单,可以参考的博客较多,主要是使用caffe自带的convert_imageset函数。

可以参考博客https://www.cnblogs.com/denny402/p/5082341.html


        那么对于非图片的呢?比如pcap文件、txt文件等,有几个参考网址,给出了python的代码,把一维数据转成lmdb文件。


    https://www.cnblogs.com/dcsds1/p/5205669.html
    http://blog.csdn.net/u014169666/article/details/69569385
    http://blog.csdn.net/u010417185/article/details/65443803


    但如果需要C/C++代码的怎么办?其实这个转换并不复杂,可以参考caffe的源码自己动手写一个。在caffe的源码中有tools/convert_imageset.cpp,在examples/mnist/convert_mnist_data.cpp,这些都可以作为参考。核心就是解析数据,然后利用Datum这种结构写入lmdb文件中。



    这里分析mnist这个例子,首先是官网给出的教程,把mnist数据转换为lmdb格式的命令如下,在caffe主目录下执行:

build/examples/mnist/convert_mnist_data.bin data/mnist/train-images-idx3-ubyte data/train-labels-idx1-ubyte examples/mnist/mnist_train_lmdb --backend=lmdb


    从这里可以看出,主要是调用了convert_mnist_data.bin这个程序,而这个可执行文件是convert_mnist_data.cpp 生成,所以直接看这个文件即可。


在这个文件中,大部分代码都是解析mnist数据的,真正写db的代码量很少,可以简单列出下面几行代码
#include "boost/scoped_ptr.hpp”
#include "caffe/proto/caffe.pb.h"
#include "caffe/util/db.hpp"
#include "caffe/util/format.hpp" 
#include 

  scoped_ptr db(db::GetDB(db_backend));
  db->Open(db_path, db::NEW);
  scoped_ptr txn(db->NewTransaction());

  Datum datum;
  datum.set_channels(1);
  datum.set_height(rows);
  datum.set_width(cols);
  for (int item_id = 0; item_id < num_items; ++item_id) {

    datum.set_data(data, rows*cols);  //the data

    datum.set_label(label);    //the label

    string key_str = caffe::format_int(item_id, 8);

    datum.SerializeToString(&value);

    txn->Put(key_str, value);
    txn->Commit();

  }

  db.Close();


        从这段代码可以看出,如果解析好了数据,也解析好了数据对应的label,那么把数据和label放到datum中即可,然后就可以保存了。代码中包含了不少头文件,是caffe中的,因此,最好把代码放到caffe某个目录下编译即可,一般放到tools中。

        另外,如果不想放到tools中,可以考虑修改Makefile文件

你可能感兴趣的:(caffe)