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