[caffe代码] convert_imageset.cpp

caffe利用了gtest单元测试框架,虽然对新手来说很难看懂,我也没有仔细去研究gtest的代码,就是大概知道它干什么罢了。

主要功能

convert_imageset的主要功能就是根据一个图片的(路径,类标)文件创建一个供caffe使用的数据库。

使用方法

convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME

代码分析

[FLAGS]那部分应该是一些参数最后会经过这段代码之后会去掉,变成一些FLAGS_xxx的变量。最后,char** argv参数就变成,argv[1] = ROOTFLODER/ argv[2] = LSITFILE argv[3] = DB_NAME

gflags::SetUsageMessage();
gflags::ParseCommandLineFlags();

支持的FLAGS
gray:图像是否灰度,默认no
shuffle:图片是否打乱顺序,默认no
backend:数据库的存储格式,默认lmdv
resize_width:resize图片的宽度
resize_height:resize图片的高度
check_size:所有的datum有相同的大小,默认no
encoded:图片编码后放到数据库,默认no
encode_type:图片的编码格式

图片数据库

读取LISTFILE文件,用vector< pair< string, int> > lines 保存着图片的路径和类标。

图片数据以Datum这个类型的格式保存着,
这个类型我还没找到定义在哪,由函数ReadImageToDatum()的定义,估计它的成员变量有data,label,encoded
Dataum定义在src/caffe/proto/caffe.proto中定义,具体怎么用可以查看这篇博客
数据库以图片所在lines的行号,和文件名为key,Dataum为value存到数据库中。

caffe提供了LMDB和LEVELDB,他们只是对lmdb和leveldb的一个封装而已。

class Transaction {
 public:
  Transaction() { }
  virtual ~Transaction() { }
  virtual void Put(const string& key, const string& value) = 0;
  virtual void Commit() = 0;

  DISABLE_COPY_AND_ASSIGN(Transaction);
};

class DB {
 public:
  DB() { }
  virtual ~DB() { }
  virtual void Open(const string& source, Mode mode) = 0;
  virtual void Close() = 0;
  virtual Cursor* NewCursor() = 0;
  virtual Transaction* NewTransaction() = 0;

  DISABLE_COPY_AND_ASSIGN(DB);
};

两种格式的数据库都继承这个基类,主要是用Open()打开一个数据库,然后用TransactionPut()Commit()函数去将数据写入数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值