1 前言

Caffe對于像我這樣的初學者來說是一款非常容易上手的深度學習框架。關于用Caffe跑自己的數據這樣的博客已經非常多,感謝前輩們?yōu)槲覀兲峁┑倪@么好的學習資源。這里我主要結合我所在的行業(yè),說下如何對跑通具有多通道多格式的遙感數據。

2 數據準備

Caffe封裝的非常好,要想將我們的數據運用于Caffe上,我們唯一要做的工作就是準備好Caffe支持的數據輸入格式(leveldb/lmdb)。

Caffe解決方案下有一個工程convert_imageset為我們提供了接口,主要是將圖像文件轉化為 Caffe支持的兩種數據格式。工程實現數據格式轉換主要經過以下幾個步驟:

在細讀這個工程文件是會發(fā)現,其數據讀取函數用的是OpenCV 的imread函數,在io.cpp。關于OpenCV的imread函數,這里不做詳細介紹,只說出其存在的問題:

1 對于圖像文件,imread不能讀取多波段數據(遙感圖像),超過4個波段的;

2 讀取的數據格式默認是CV_8UC(n),遙感數據明顯不符合要求。

 

因此,要想通過Caffe自帶的數據集轉換接口將多波段多數據類型的遙感圖像輸出為Caffe支持的leveldb和lmdb格式存在明顯的不合理問題。

 

關于遙感圖像的讀取,我想大家第一反應就是GDAL庫。因此,我嘗試在Caffe的解決方案下重寫數據轉換接口,利用GDAL庫來讀圖像,并將讀取的數據轉換為OpenCV的Mat數據格式,從而和圖1中流程的第二步接軌(GDAL數據讀取轉換為Mat格式可參看前面的博客)。但是后來一想,感覺這樣做有點多余,為啥不通過GDAL讀取的數據直接寫入到Caffe::Datum中呢。

后來仔細看了Caffe::Datum類,發(fā)現其存儲數據目前只支持uchar和float,如果讀者愿意,我想還可以給Datum類添加其他的支持數據格式。但是,我覺得float格式已經滿足我的要求了。因此,我寫了一個簡單的函數,實現從GDAL讀取的數據到Datum的轉化,其代碼如下: