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()
打开一个数据库,然后用Transaction
的Put()
和Commit()
函数去将数据写入数据库。