1 前言
Caffe對(duì)于像我這樣的初學(xué)者來說是一款非常容易上手的深度學(xué)習(xí)框架。關(guān)于用Caffe跑自己的數(shù)據(jù)這樣的博客已經(jīng)非常多,感謝前輩們?yōu)槲覀兲峁┑倪@么好的學(xué)習(xí)資源。這里我主要結(jié)合我所在的行業(yè),說下如何對(duì)跑通具有多通道多格式的遙感數(shù)據(jù)。
2 數(shù)據(jù)準(zhǔn)備
Caffe封裝的非常好,要想將我們的數(shù)據(jù)運(yùn)用于Caffe上,我們唯一要做的工作就是準(zhǔn)備好Caffe支持的數(shù)據(jù)輸入格式(leveldb/lmdb)。
Caffe解決方案下有一個(gè)工程convert_imageset為我們提供了接口,主要是將圖像文件轉(zhuǎn)化為 Caffe支持的兩種數(shù)據(jù)格式。工程實(shí)現(xiàn)數(shù)據(jù)格式轉(zhuǎn)換主要經(jīng)過以下幾個(gè)步驟:
在細(xì)讀這個(gè)工程文件是會(huì)發(fā)現(xiàn),其數(shù)據(jù)讀取函數(shù)用的是OpenCV 的imread函數(shù),在io.cpp。關(guān)于OpenCV的imread函數(shù),這里不做詳細(xì)介紹,只說出其存在的問題:
1 對(duì)于圖像文件,imread不能讀取多波段數(shù)據(jù)(遙感圖像),超過4個(gè)波段的;
2 讀取的數(shù)據(jù)格式默認(rèn)是CV_8UC(n),遙感數(shù)據(jù)明顯不符合要求。
因此,要想通過Caffe自帶的數(shù)據(jù)集轉(zhuǎn)換接口將多波段多數(shù)據(jù)類型的遙感圖像輸出為Caffe支持的leveldb和lmdb格式存在明顯的不合理問題。
關(guān)于遙感圖像的讀取,我想大家第一反應(yīng)就是GDAL庫。因此,我嘗試在Caffe的解決方案下重寫數(shù)據(jù)轉(zhuǎn)換接口,利用GDAL庫來讀圖像,并將讀取的數(shù)據(jù)轉(zhuǎn)換為OpenCV的Mat數(shù)據(jù)格式,從而和圖1中流程的第二步接軌(GDAL數(shù)據(jù)讀取轉(zhuǎn)換為Mat格式可參看前面的博客)。但是后來一想,感覺這樣做有點(diǎn)多余,為啥不通過GDAL讀取的數(shù)據(jù)直接寫入到Caffe::Datum中呢。
后來仔細(xì)看了Caffe::Datum類,發(fā)現(xiàn)其存儲(chǔ)數(shù)據(jù)目前只支持uchar和float,如果讀者愿意,我想還可以給Datum類添加其他的支持?jǐn)?shù)據(jù)格式。但是,我覺得float格式已經(jīng)滿足我的要求了。因此,我寫了一個(gè)簡(jiǎn)單的函數(shù),實(shí)現(xiàn)從GDAL讀取的數(shù)據(jù)到Datum的轉(zhuǎn)化,其代碼如下: