##Caffe
中DataLayer默認(rèn)的數(shù)據(jù)格式是LMDB盏档。許多example中提供的輸入數(shù)據(jù)是LMDB格式获列。使用extract_features.bin提取特征時(shí)支持的輸出格式之一也是LMDB超全。LMDB在Caffe的IO功能中有相當(dāng)重要的地位。因此,搞明白如何存取Caffe的LMDB數(shù)據(jù),對(duì)于我們使用Caffe是很有幫助的闪朱。LMDB
Caffe使用LMDB來存放訓(xùn)練/測(cè)試用的數(shù)據(jù)集,以及使用網(wǎng)絡(luò)提取出的feature(為了方便钻洒,以下還是統(tǒng)稱數(shù)據(jù)集)奋姿。數(shù)據(jù)集的結(jié)構(gòu)很簡(jiǎn)單,就是大量的矩陣/向量數(shù)據(jù)平鋪開來素标。數(shù)據(jù)之間沒有什么關(guān)聯(lián)胀蛮,數(shù)據(jù)內(nèi)沒有復(fù)雜的對(duì)象結(jié)構(gòu),就是向量和矩陣糯钙。既然數(shù)據(jù)并不復(fù)雜,Caffe就選擇了LMDB這個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)來存放數(shù)據(jù)退腥。
LMDB的全稱是Lightning Memory-Mapped Database任岸,閃電般的內(nèi)存映射數(shù)據(jù)庫(kù)。它文件結(jié)構(gòu)簡(jiǎn)單狡刘,一個(gè)文件夾享潜,里面一個(gè)數(shù)據(jù)文件,一個(gè)鎖文件嗅蔬。數(shù)據(jù)隨意復(fù)制剑按,隨意傳輸。它的訪問簡(jiǎn)單澜术,不需要運(yùn)行單獨(dú)的數(shù)據(jù)庫(kù)管理進(jìn)程艺蝴,只要在訪問數(shù)據(jù)的代碼里引用LMDB庫(kù),訪問時(shí)給文件路徑即可鸟废。
圖像數(shù)據(jù)集歸根究底從圖像文件而來猜敢。既然有ImageDataLayer可以直接讀取圖像文件,為什么還要用數(shù)據(jù)庫(kù)來放數(shù)據(jù)集,增加讀寫的麻煩呢缩擂?我認(rèn)為鼠冕,Caffe引入數(shù)據(jù)庫(kù)存放數(shù)據(jù)集,是為了減少IO開銷胯盯。讀取大量小文件的開銷是非常大的懈费,尤其是在機(jī)械硬盤上。LMDB的整個(gè)數(shù)據(jù)庫(kù)放在一個(gè)文件里博脑,避免了文件系統(tǒng)尋址的開銷憎乙。LMDB使用內(nèi)存映射的方式訪問文件黍翎,使得文件內(nèi)尋址的開銷非常小择浊,使用指針運(yùn)算就能實(shí)現(xiàn)。數(shù)據(jù)庫(kù)單文件還能減少數(shù)據(jù)集復(fù)制/傳輸過程的開銷挂谍。一個(gè)幾萬君账,幾十萬文件的數(shù)據(jù)集繁堡,不管是直接復(fù)制,還是打包再解包乡数,過程都無比漫長(zhǎng)而痛苦椭蹄。LMDB數(shù)據(jù)庫(kù)只有一個(gè)文件,你的介質(zhì)有多塊净赴,就能復(fù)制多快绳矩,不會(huì)因?yàn)槲募喽缥伵!?/p>
接下來要介紹Caffe是如何使用LMDB存放數(shù)據(jù)的玖翅。
Caffe中的LMDB數(shù)據(jù)大約有兩類:一類是輸入DataLayer的訓(xùn)練/測(cè)試數(shù)據(jù)集翼馆;另一類則是extract_feature輸出的特征數(shù)據(jù)。
###Datum數(shù)據(jù)結(jié)構(gòu)
首先需要注意的是金度,Caffe并不是把向量和矩陣直接放進(jìn)數(shù)據(jù)庫(kù)的应媚,而是將數(shù)據(jù)通過caffe.proto里定義的一個(gè)datum類來封裝。數(shù)據(jù)庫(kù)里放的是一個(gè)個(gè)的datum序列化成的字符串猜极。Datum的定義摘錄如下:
'''Datum{int32height =2;int32width =3;// the actual image data, in bytes
bytes data =4;
int32 label =5;// Optionally, the datum could also hold float data.repeated
floatfloat_data =6;// If true data contains an encoded image that need to be decoded
bool encoded =7[default =false];} '''