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

發佈了46 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章