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()
函數去將數據寫入數據庫。