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