薛祥祥,羅 澤
1(中國科學院 計算機網絡信息中心,北京 100190)
2(中國科學院大學,北京 100049)
青海湖區域是我國重要的生態保護基地,青海湖國家級自然保護區是以野生水鳥及其棲息地保護為主要任務的保護區[1].近年來,伴隨著人類的生產活動,以及氣候的變化,青海湖湖泊會在一定程度上發生變化.為了能夠更好的進行青海湖生態保護,及時了解青海湖水體變化,如何能夠自動快速的進行青海湖水體識別成為研究的關鍵.
遙感圖像水體識別是指通過一定的方法對遙感圖像數據進行處理分析,以期能夠識別出遙感圖像中的水體.近年來,針對水體識別問題,相關研究人員和學者提出了很多理論和方法.目前主要分為兩類,第一類方法主要通過發現單個波段或多個波段之間的關系,通過設定閾值來實現[2–5];第二類方法是指通過機器學習算法,進行訓練模型來實現[6–8].上述方法目前均在單機環境下進行水體的提取,同時又存在耗時,普適性不強,自動化程度較低等不足[9,10].
2013年2月,Landsat8衛星在美國加州發射,經過100天測試運行成功之后,開始向地面提供遙感影像,是目前唯一一顆在軌運行的Landsat系列衛星[11].隨著Landsat8陸地資源衛星的發射,我們可以更方便的獲取更高精度的青海湖區域遙感影像數據.但隨著時間的推移,數據量將日益增多,在大數據量的情況下,耗時,自動化程度低等問題將更加突出.
針對目前面臨的上述問題,本文采用分布式處理框架進行解決,搭建水體識別系統,實現水體識別自動化執行.其主要包括基于Hadoop平臺實現遙感數據的存儲和處理,基于Spark平臺實現青海湖區域水體的識別.最后通過實驗,驗證系統的有效性.
本文通過Hadoop平臺和Spark平臺實現青海湖水體識別系統,其整體架構圖如圖1所示.

圖1 系統架構圖
本系統的主要模塊功能為:(1)數據存儲.系統使用HDFS進行數據存儲,用戶首先將本地遙感圖像數據上傳至HDFS,并存儲到相應的文件夾下.(2)數據讀取.本系統利用GDAL來實現Hadoop平臺對遙感影像的數據讀取,通過重寫Hadoop的輸入輸出格式進行實現.(3)數據處理.通過第二步的讀取,可以獲得遙感影像數據,之后自定義MapReduce程序,將原始數據轉換為libSVM格式數據,并輸出到HDFS相應的文件夾下,提供給Spark程序使用.(4)模型訓練.本實驗的算法模型采用邏輯斯諦回歸算法.針對遙感影像上青海湖區域,人工選取水體和非水體樣本,作為訓練樣本,并利用Spark MLlib進行訓練,最后將模型進行持久化.(5)模型預測.第三步的輸出結果為用戶的待預測數據,通過讀取該數據,并調用第四步的模型進行預預測,最終預測結果輸出到HDFS上.
Landsat8遙感圖像較之前的Landsat系列影像,具有更高的精度,能夠更好的對地物進行區分,并且對外開放,可以從官方網站下載獲取,故本論文采用Landsat8遙感衛星圖像作為實驗數據.Landsat8遙感影像屬于多光譜遙感圖像,共包含11個波段,每個波段對應一幅遙感圖像.亦即,對于同一個區域,遙感數據為11幅單波段遙感圖像.根據遙感圖像數據的特點,本文采用如下的方式來進行數據存儲.
首先在HDFS根目錄下創建image目錄,并且之后上傳的圖像均在/image目錄下.下載得到的青海湖區域某一天的遙感圖像為一個文件夾,該文件夾中包含各個波段的遙感圖像.本文在將本地文件夾數據上傳至HDFS時,會首先獲取該文件夾名稱,并在HDFS上/image目錄下創建與此文件夾名稱相同的文件目錄.然后依次將本地文件夾中的波段數據上傳到HDFS對應的目錄下.
Hadoop平臺支持文本文件,SequenceFile等多種文件作為輸入,同時也允許用戶自定義輸入輸出格式[12,13].Hadoop平臺默認的輸入格式為textInputFormat,當進行數據讀取時,會首先計算SplitSize大小,然后根據此數值對輸入文件進行Split操作,最后每一個Split對應一個Map任務.按照Hadoop的默認輸入格式,其Split的過程是按照文件大小來進行分片的,不會考慮數據之間的關系.而遙感影像數據屬于柵格數據,如果按照默認方式進行切分,則會丟失數據之間的關系,無法讀取到正確結果.所以,如何實現正確讀取遙感數據,是問題解決的關鍵.
為了保證數據的完整性,本文對于輸入的遙感圖像不進行切片操作,一幅遙感影像作為一個Map任務進行數據讀取.本文通過自定義MyInputFormat類和MyRecordReader類來實現該功能.MyInputFormat類重寫isSplitable()方法,使其返回值為false,表明對輸入數據不進行切片.MyRecordReader類的功能為獲取Split數據,并將其轉換為MapReduce的輸入,該類重寫initialize()nextKeyValue(),getCurrentKey(),getCurrentValue()四個方法來進行實現.
根據2.1中的存儲策略,本文會將青海湖區域同一時刻的遙感數據存儲到HDFS上同一文件夾下.在執行Hadoop程序時,程序的輸入路徑為該文件夾的路徑.Hadoop程序會依次遍歷該路徑下的每一個文件,按照上述不分片處理的設計,則該文件夾下每個波段文件會分別對應一個Map任務進行處理.
Hadoop程序通過自定義輸入格式來讀取數據,之后通過MapReduce程序對數據進行處理,然后輸出libSVM格式數據,以提供給Spark程序進行調用.根據系統需求,本文Hadoop程序輸出格式采用默認輸出格式,即 TextOutputFormat.
MapReduce是Hadoop框架的計算模型,可以完成海量數據的處理任務.其主要包含三個階段,分別是Map階段,Shuffle階段和Reduce階段.Map函數的輸入為一個 圖2 MapReduce執行原理圖 本文MapReduce中,Map函數的輸入key值為當前處理的文件名稱,value為當前處理文件的二進制數據流.經過MapReduce處理,本文最終要得到由多個波段數據組成的libSVM格式數據.因此,本文采用如下MapReduce設計. Map函數輸入的key值為當前處理文件的文件名稱,value值為當前處理文件的二進制數據流.Map函數首先獲取當前處理文件的波段號,然后通過GDAL進行數值讀取,對每一個像素點進行輸出.Map函數的輸出key值為當前像素點的坐標,格式為:XSize.YSize,輸出的value為當前波段號和該像素點的值,格式為“波段號:像素值”.具體轉換過程如圖3所示. 圖3 Map函數轉換圖 Reduce函數輸入的key值與map函數輸出的key值相同,為當前像素點的坐標.輸入的value值為該坐標下,各個波段的像素值組成的集合.Reduce函數會對集合中的數據進行排序,使其按照波段的大小順序有序.Reduce函數輸出的key值為像素點的坐標,輸出的value為各個波段值的有序集合.最后設置Reduce函數輸出的key值和value值之間用空格進行分隔,這樣,通過MapReduce函數,即可得到libSVM格式數據.其具體的輸入輸出格式如下所示: 本文對遙感圖像進行水體識別,其本質上屬于二分類問題,要求算法能夠準確判別出待預測數據為水體或非水體.本文采用Spark MLlib中邏輯歸回算法來進行實現. 邏輯回歸算法屬于分類算法,廣泛應用于二分類問題.該算法首先對數據進行線性擬合,而后通過Sigmoid函數進行映射,將預測結果值限定在0到1區間之內,通過設定閾值,從而實現分類.邏輯回歸算法基于Spark平臺,實現了并行化處理,并且基于內存計算,大大提高了模型訓練和預測的速度. Landsat8衛星遙感影像數據共包含11個波段,根據遙感圖像的光譜特征,其中第2波段到第7波段,對于水體的區分具有明顯效果.故本文采用第2波段到第7波段這6個波段數據.遙感圖像由一個個像元組成,本文在模型訓練和模型預測中以像元為基本單位,每一個樣本共7個維度,分別對應波段2到波段7像元的數值. 本文系統實現過程中,首先選取樣本進行模型訓練,并將此模型持久化存儲到HDFS相應的目錄下.之后,對于待識別的遙感影像數據,經過MapReduce計算轉換為待預測數據后,直接調用此模型進行預測,并將預測結果輸出到HDFS相應的目錄下. 本文根據上述系統設計方法實現了基于大數據平臺的水體識別系統.主要系統模塊包括數據上傳,數據讀取,數據轉換,模型訓練,模型預測.通過系統測試,本文實現的水體識別系統能夠自動完成遙感圖像水體識別,且具有較高準確率. 本系統在VMware虛擬機下進行實現,采用CDH(Cloudera’s Distribution including apache Hadoop)來搭建大數據平臺.軟件版本信息為:CDH5.12.0,Hadoop2.6.0,Spark1.6.0,Java1.7.0,Maven3.0.4,GDAL2.2.2. 首先在HDFS根目錄下創建image文件夾,此后所有遙感圖像數據均保存在此目錄下.本文遙感圖像數據從Landsant遙感圖像官方網站進行下載.這里本文下載2017年10月4日青海湖區域數據,并以此進行說明. 數據下載后,其文件夾名稱為:LC08_L1TP_133034_20171004_20171014_01_T1.通過 hadoop fs –put命令將該文件夾及文件夾下數據上傳到HDFS image目錄下.則執行命令之后,該數據在HDFS上對應的路徑為:/image/LC08_L1TP_133034_20171004_20171014_01_T1/*. 從上述3.1中得知,遙感圖像數據已經存儲到HDFS相應目錄之下,本步驟所要實現的功能為通過Hadoop程序,完成HDFS數據的讀取以及轉換功能,最后生成libSVM格式數據,作為水體識別模型的輸入. Hadoop程序采用Maven管理工具來進行構建,通過編寫pom文件,實現程序jar包的依賴.本文通過GDAL(Geospatial Data Abstraction Library)來進行讀取遙感圖像.GDAL是一個用于讀取柵格數據的開源庫,對外提供了多種語言接口,本文通過Java語言來進行函數調用. 整體的實現過程如下所述:(1)首先從GDAL官方網站下載其源碼,然后在linux系統上進行編譯,編譯完成之后,將得到so文件和jar文件.其中so文件復制到Hadoop安裝目錄native目錄下;jar文件通過maven命令安裝到本地maven倉庫,而后通過pom.xml文件的設置,添加到Hadoop程序中.(2)按照本文3.2,3.3中的系統設計方案,實現輸入輸出及MapReduce程序.(3)進入程序的根目錄,執行mvn package命令,對程序執行打包操作,得到hadoop.jar文件. 之后,對于遙感圖像進行讀取轉換,只需執行如下命令即可: 程序會處理inputPath下遙感圖像數據,并將其轉換為libSVM格式數據,結果輸出到outputPath路徑下. 本文從遙感圖像中共選取訓練樣本18 000個,其中正樣本(水體)9000個,負樣本(非水體)9000個.樣本具體信息為:青海湖中心水體樣本3000個,沿岸水體樣本3000個,小島附近水體樣本3000個,耕地樣本3000個,山脈樣本3000個,荒地樣本3000個.以此作為訓練數據集,進行模型訓練. 本模塊基于Spark平臺來進行編碼實現,Spark工程同樣采用Maven管理工具進行構建.在模型訓練過程中,對訓練數據集進行隨機切分,其中70%用于模型訓練,30%進行模型測試,不斷迭代訓練,直至模型收斂. 整體實現過程如下所述:(1)讀取遙感圖像,得到訓練數據集,并保存為train_libsvm.csv文件.(2)將train_libsvm.csv上傳到HDFS /MLlib目錄下.(3)通過邏輯回歸算法進行模型訓練,并將得到的模型持久化保存到HDFS /model目錄下. 本文模型訓練的參數及測試集上準確率,如表1所示. 由上述3.2,可以得到待預測數據集,其格式為libsvm格式.Spark程序通過從HDFS相應目錄下讀取待預測數據,然后調用訓練得到的模型進行預測,最終將預測結果輸出到HDFS/spark_output目錄下. 表1 模型參數及準確率說明 本文中,數據在HDFS上的存儲路徑設置如下:遙感圖像存儲于/image目錄下,Hadoop程序運行結果存儲于/Hadoop_output目錄下,spark程序運行結果存儲于/spark_output目錄下,訓練數據集存儲于/mllib目錄下,模型存儲于/model目錄下.根據目錄之間的設定關系,本文采用shell腳本來進行程序的自動化執行,用戶可以根據不同的需求,執行相應的腳本來完成功能.腳本的具體信息如下所述. 本文定義腳本waterClassification.sh,該腳本完成整個流程的自動化執行.當用戶執行該腳本時,只需輸入本地遙感圖像文件夾路徑即可.該腳本將依次完成文件上傳,并執行Hadoop計算,而后進行模型預測,最終將結果識別結果輸出到HDFS對應文件夾下,完成水體識別的整個流程. 由于本文水體識別過程,由不同的功能模塊組成,故針對每一個具體的功能模塊,本文定義對應的shell腳本,來實現模塊功能的單獨執行.實現模塊功能的shell腳本有:uploadImage.sh,hadoop.sh,spark.sh.其中uploadImage.sh完成本地遙感圖像上傳功能;hadoop.sh完成讀取數據,并對數據進行運算的功能,該腳本可以指定HDFS上任意遙感圖像文件夾.spark.sh完成水體識別功能,該腳本運行時需指定待預測樣本文件路徑. 在上述系統設計方案的基礎上,本文成功實現了基于大數據平臺的水體識別系統.為了驗證系統的有效性,以及對青海湖區域水體識別的效果,本文選取了不同三天的遙感圖像數據,通過該系統進行水體識別.測試遙感圖像數據為時間分別為:2017年7月16日,2017年10月4日,2017年11月5日. 通過該系統對遙感圖像進行水體識別,得到識別結果后,對于識別出的水體像元,本實驗將其對應的像元值設置為0,進行標注,其最終識別效果如圖4,圖5,圖6所示. 圖4 2017年7月16日 圖5 2017年10月4日 圖6 2017年11月5日 針對當前遙感圖像水體識別速度慢,自動化程度低等問題,本文基于大數據平臺,構建了水體識別系統.將遙感圖像存儲于HDFS,實現數據的分布式存儲;自定義實現Hadoop輸入輸出格式,完成數據的讀取;設計MapReduce,完成對遙感數據的處理;通過訓練的模型對遙感圖像像元進行預測;最后通過實驗,來對該系統進行驗證.實驗結果表明,該系統可以自動,快速完成青海湖區域遙感圖像水體識別,且準確率較高,具有一定的應用性.在本實驗中,系統的執行是通過命令行的形式來完成,下一步工作將嘗試開發Web界面,以使用戶可以更簡單方便的進行操作.


2.4 模型訓練和模型預測設計
3 系統實現
3.1 遙感圖像存儲實現
3.2 數據讀取及轉換實現

3.3 模型訓練及預測實現

3.4 系統執行流程實現
3.5 系統驗證



4 結論與展望