1. 隨機森林簡介
隨機森林是一種有監督的機器學習演算法。監督學習是機器學習的一個子類。這種型別的學習依賴於分類標籤,以生成一個函式(模型)來識別影像中的不同類別。有兩種型別的分類問題,二元分類和多類分類。隨機森林由於其準確性,簡單性和靈活性,現已成為最廣泛使用的分類演算法之一。
隨機森林是基於Bagging的決策樹方法,其核心是bagging演算法,原理如下:
給定一個大小為n的訓練集D,Bagging演算法從中均勻地、有放回地(使用自助抽樣法)選出m個大小為n‘的子集Di作為新的訓練集。在這m個訓練集上使用分類、迴歸等演算法,則可得到m個模型,再透過取平均值、取多數票等方法,即可得到Bagging結果。也即:
給定訓練集X = x1, ..., xn和目標Y = y1, ..., yn,bagging方法重複(B次)從訓練集中有放回地取樣,然後在這些樣本上訓練樹模型。在訓練結束之後,對未知樣本x的預測可以透過對x上所有單個迴歸樹的預測求平均來實現:
或在分類任務中選擇多數投票的類別。
這種bagging方法在不增加偏置的情況下降低了方差,從而帶來了更好的效能。但簡單地在同一個資料集上訓練多個樹模型會產生強相關的樹模型(甚至是完全相同的樹模型)。Bagging使用Bootstrap自助抽樣法,透過產生不同訓練集從而降低樹模型之間關聯性。
此外,x'上所有單個迴歸樹的預測的標準差可以作為預測的不確定性的估計:
樣本或者樹的數量B是一個自由引數。通常使用幾百到幾千棵樹,這取決於訓練集的大小和性質。使用交叉驗證,或者透過觀察out-of-bag誤差(那些不包含xᵢ的抽樣集合在樣本xᵢ的平均預測誤差),可以找到最優的B值。當一些樹訓練到一定程度之後,訓練集和測試集的誤差開始趨於平穩。
隨機森林就是bagging的決策樹方法,有一點改進就是隨機森林在學習過程中的每次候選分裂,選擇特徵的隨機子集。這個過程也被稱為“特徵bagging”。
2. 執行環境
隨機森林分類工具包含在新機器學習工具包內,新機器學習工具可以執行在沒有高效能GPU配置的裝置上。具體執行環境如下:
支撐軟體 |
ENVI5.6.3+ENVI Deep Learning2.0 |
作業系統 |
◾Windows 10 and 11 (Intel/AMD 64-bit) ◾Linux (Intel/AMD 64-bit, 3.10.0及更高版本, glibc 2.17 及更高版本) |
硬體 |
具有AVX的CPU。 注:一般情況下,2011年之後的CPU都包含該指令集。推薦使用Intel CPU,但不是必需的,它們擁有最佳化的英特爾機器學習庫,可為某些機器學習演算法提供效能提升。 |
ENVI5.6.3試用:https://envi.geoscene.cn/envi_license,之前安裝過562版本可直接覆蓋安裝,許可通用。
3. 操作流程
對於單張柵格影像的隨機森林分類可以透過ROI工具繪製樣本並使用隨機森林分類工具進行影像分類。
3.1. 資料
啟動ENVI,開啟ENVI自帶的示例資料,如下圖所示。資料位於:C:\Program Files\Harris\ENVI56\data\qb_boulder_msi。ROI樣本資料可下載獲取(qb_boulder_msi_ROI_points.xml)。
連結:https://pan.baidu.com/s/1-28oUZ62h6abj1chzuMAkg?pwd=envi
提取碼:envi
3.2. 隨機森林分類流程
3.3. 樣本繪製
隨機森林分類屬於機器學習工具,其分類演算法主要利用了影像的光譜資訊,其樣本的繪製遵循“質量勝於數量”的原則,即繪製的樣本要保證較高的光譜精度。同時隨機森林演算法會利用到所有的ROI像元,繪製的ROI覆蓋的像元比較多的情況下會消耗較多的計算時間。因此建議繪製點狀ROI樣本,這樣既可以保證繪製的樣本精度較高,又可以節約大量的計算時間。
樣本繪製可透過ROI工具繪製,單擊ENVI工具欄中的ROI工具圖示,開啟Region of Interest (ROI) Tool皮膚,點選按鈕,新增一個ROI類別,修改ROI Name為“水體”。在Geometry選項卡點選點狀按鈕,在圖上找到水體區域並均勻地繪製點狀ROI。之後再繪製剩餘地物型別:裸地、草地、林地、建築。繪製示例如下圖所示:
3.4. 隨機森林分類
繪製好樣本之後即可使用隨機森林分類工具執行分類。在Toolbox工具箱,選擇Machine Learning>Classification>Supercised>Random Foreast Classification隨機森林分類工具。此工具對單個柵格影像執行隨機森林監督分類。
在隨機森林分類對話方塊中:
- Input Raster:選擇一個輸入柵格執行隨機森林分類。這裡選擇qb_boulder_msi影像。
- Input ROIs:選擇ROI 檔案 ( .xml ),包含想要分類的類別。注意ROI 必須要落在輸入柵格的邊界內。
- Background Labels:在“背景標籤”欄位中,指定要用作背景的 ROI 類。例如如果只想提取水體一類,就將其餘的類別名輸入在這裡,表示這些類別為不感興趣的背景類。注意,新的機器學習工具是全畫素分類,因此樣本類別至少為兩類,一類為目標類別,一類為背景類別。此處可以按照預設Background,但不能為空。
- Balance Classes:選擇是否平衡類別。預設為Yes,平衡類別表示指定在訓練期間應將所有類視為平衡的。選擇Yes有助於增加樣本少的類別的提取範圍。這裡按照預設選Yes。
- Estimators:輸入要使用的決策樹的數量。估計器是演算法的預測器。預設值為100。此處按照預設。
- Max Depth:指定樹的最大深度。如果未指定,則擴充套件節點直到所有葉子都是純的。
- Output Raster:選擇分類結果的輸出路徑和檔名。
- 啟用Display result核取方塊以在處理完成時在檢視中顯示輸出結果。
- 要在以後再次使用這些引數設定,可以將引數儲存到一個檔案中。單擊向下箭頭並選擇“Save Parameter Values...”,指定要儲存到的位置和檔名。注意某些引數型別(例如柵格、向量和ROI等檔案)的設定不會儲存在引數檔案內。要應用已儲存的引數設定,同樣單擊向下箭頭並選擇“Restore Parameter Values...”,然後選擇之前儲存的引數檔案。
- 要在本地或遠端 ENVI 伺服器上執行該任務,請單擊向下箭頭並選擇“Run Task in the Background”。ENVI Server Job Console 將顯示作業的進度,並在處理完成時提供一個連結來顯示結果。有關詳細資訊,請參閱 ENVI 幫助中的ENVI伺服器主題。
- 要檢視此工具的基於模型的版本(顯示該工具是如何從各個子任務構建的),請單擊“Open in Modeler” 。
單擊OK執行隨機森林分類,得到分類結果,如下圖所示:
對於分類影像中的小圖斑可使用分類後處理工具進行處理,參考:https://www.cnblogs.com/enviidl/p/16276676.html
4. 自定義工作流
隨機森林分類工具可以對單幅影像快速執行隨機森林分類,如果想要透過多幅影像和對應ROI訓練隨機森林模型並用於其它相似影像的分類,可以使用ENVI Modeler構建自定義可重複使用的工作流。接下來將介紹透過ENVI Modeler 構建自定義工作流,用於資料預處理和使用多個柵格進行機器學習模型訓練。
4.1. 資料
本教程中使用的影像:classification下的兩張用於分類的影像,以及 training 下的兩張用於訓練的影像。每個訓練影像都是分類影像的小區域子集。影像是四波段(紅/綠/藍/近紅外),空間解析度為1米的航拍影像。ENVI 機器學習對於影像格式沒有限制,對於本教程您將使用TIFF和ENVI兩種格式。
注意:如果有多張影像,那麼影像型別應該保持一致,如果其中一張為地表反射率,那麼其餘影像應該也為地表反射率資料。
檔案 |
描述 |
NAIP_DallasTX_Oct11_2020_Subset.tif |
用於訓練的影像(4,046 x 3,973 畫素) |
NAIP_DallasTX_Oct11_2020_Subset.xml |
用於訓練的 ROI 標籤(人造地物、樹木、地面、水面) |
NAIP_SanAntonioSE_2020_Subset.dat |
用於訓練的影像(5,023 x 4,803 畫素) |
NAIP_SanAntonioSE_2020_Subset.xml |
用於訓練的 ROI 標籤(人造地物、樹木、地面、水面) |
NAIP_DallasTX_Oct11_2020.tif |
用於分類的影像(10,590 x 12,400 畫素) |
NAIP_SanAntonioSE_2020.dat |
用於分類的影像(10,000 x 12,300 畫素) |
4.2. 機器學習流程
機器學習的主要流程為訓練柵格生成(影像和已有樣本)、訓練機器學習模型和模型分類。柵格歸一化將輸入的多張影像進行最大最小值歸一化到0~1之間。
4.3. 使用 ENVI Modeler 建立模型
ENVI Modeler 是一個強大的視覺化工具,用於使用 ENVI Task建立自定義工作流。ENVI Modeler 使用視覺化方式構建流程塊,類似於編寫任務 API 程式碼。
4.3.1. 建立檔案節點
- 啟動 ENVI。
- 使用以下選項之一開啟 ENVI Modeler:
- 按鍵盤上的Ctrl + M。
- 單擊ENVI 選單欄中的Display按鈕,然後單擊ENVI Modeler。
- 從Basic Nodes列表中雙擊(或點選並拖動)File到 ENVI Modeler 的 Untitled 區域。出現“Select Type”選擇型別對話方塊。
- 在選擇型別對話方塊中,單擊Raster。選擇檔案 – [Raster] 對話方塊出現。
- 導航到您儲存教程資料的位置\training,點選tif,然後點選Open。檔案節點出現在無標題繪圖區域中。
- 單擊Basic Nodes基本節點中的另一個File檔案節點並將其拖動到 ENVI Modeler 的無標題區域中。出現檔案選擇對話方塊。
- 在“Select Type”選擇型別對話方塊中,單擊“Regions of Interest”感興趣區域。選擇檔案 – [ROI] 對話方塊開啟。導航到包含教程資料的位置\training,單擊xml,然後單擊Open。
這兩個檔案節點由柵格影像和 ROI 標籤組成。之後它們會生成一個訓練柵格用於訓練機器學習模型。為了保持井然有序,可以根據需要單擊畫布中的節點並將其拖動到合適的位置。
- 使用柵格檔案dat和ROI檔案NAIP_SanAntonioSE_2020_Subset.xml重複前兩個步驟。這兩個檔案都位於教程資料資料夾\training中。完成後,您將擁有兩個光柵檔案節點和兩個 ROI 節點。
4.3.2. 準備資料
要為監督分類器建立訓練資料,必須使用柵格和關聯的 ROI 提取標記畫素。使用 ENVI Machine Learning ML Training Data from ROIs 任務來建立訓練資料。此任務將從柵格中提取所有標記畫素,這些畫素由.xml檔案中指定的 ROI 標識。生成的訓練資料是包含單行光譜的新柵格。訓練柵格的維度是(行=1,列=提取的標記畫素個數,波段=輸入柵格波段+1)。附加波段將為每個畫素提供一個數值,該數值表示每個畫素的類標籤值。
對於本教程,我們有類標籤 Manmade、Trees、Ground、Water。這些標籤解析為類值 (1, 2, 3,4)。Ground類的畫素將在附加波段中分配一個值3,對於每個標記的畫素依此類推。
- 在 ENVI Modeler 的“Search…”任務搜尋欄位中,鍵入ML Training。將出現兩個任務。
- 使用ML Training Data from ROIs來生成訓練資料。ML Training Data from Spectral Library 是另一個機器學習資料準備任務,它使用光譜庫收集畫素資料進行訓練。
- 雙擊ML Training Data from ROIs兩次,兩個名為“ML Training Data from ROIs”的黃色節點出現在畫布中。
- 排列這些節點,放置在Raster和ROI檔案節點的右側。
- 單擊Raster節點的聯結器並將其拖動到ML Training Data from ROIs。
- 單擊ROI節點聯結器並將其拖動到ML Training Data from ROIs。
從 ROI 節點連線到ML Training Data from ROIs節點時,請務必正確配對Raster和ROI節點:
輸入柵格 |
NAIP_DallasTX_Oct11_2020_Subset.tif |
輸入ROI |
NAIP_DallasTX_Oct11_2020_Subset.xml |
輸入柵格 |
NAIP_SanAntonioSE_2020_Subset.dat |
輸入ROI |
NAIP_SanAntonioSE_2020_Subset.xml |
- 對其餘兩個Raster和ROI節點重複前兩個步驟。如下圖所示。
- 在“Search...”任務搜尋中,鍵入Normalization Statistics標準化統計。雙擊Normalization Statistics。
- 一個Normalization Statistics節點出現在畫布上。
- 從Basic Nodes列表中,雙擊Aggregator。一個 Aggregator聚合器節點出現在節點畫布上。
- 單擊並將兩個Raster節點聯結器拖動到Aggregator聚合器節點上。
- 單擊Aggregator節點聯結器並將其拖動到Normalization Statistics節點上。
- 單擊Normalization Statistics節點聯結器並將其分別拖動到兩個ML Training Data from ROIs節點上。
完成這些步驟後,你的節點畫布應類似於下圖:
Normalization Statistics歸一化統計節點從聚合器節點的輸出柵格中收集最小和最大資料值。這在訓練期間很重要,因為資料將使用最小值和最大值在 0 和 1 之間縮放。
4.3.3. 連線到訓練節點
要使用ML Training Data from ROIs節點生成的輸出資料進行訓練,首先需要使用聚合器節點聚合兩個訓練資料,之後將其連線到訓練任務節點。對於本教程,我們將使用Train Raster Forest訓練隨機森林節點,但也可以選擇任何其它的監督分類任務。
- 在Tasks Search欄位中,輸入Train Random Forest。訓練隨機森林任務出現。
- 雙擊Train Random Forest訓練隨機森林節點。節點Train Random Forest出現在畫布上。
- 從Basic Nodes列表中,雙擊Aggregator。一個新的 Aggregator 節點出現在節點畫布上。
- 將兩個ML Training Data from ROIs節點末端連線到Aggregator聚合器節點上。
- 將Aggregator節點的末端連線到Train Random Forest節點上。
您的畫布應該類似於下圖。
4.3.4. 新增輸入引數
Input Parameters輸入引數節點是一個基本節點,可以被許多節點重用。輸入引數節點將連線到畫布上的多個節點。透過連線輸入引數節點,可以構建一組在執行任務時能夠進行引數輸入的工作流。
- 從Basic Nodes基本節點列表中,雙擊Input Parameters輸入引數。輸入引數節點出現在節點畫布上。
- 將Input Parameters輸入引數節點連線到其中一個ML Training Data from ROIs節點的開頭(左側) 。出現“Connect Parameters”連線引數對話方塊。
- 在Connect Parameters對話方塊中,單擊ML Training Data from ROIs下的Background Labels按鈕。一條紅線將Input Parameters [Add New Inputs]連線到ML Training Data from ROIs[Background Labels]。單擊OK。
對第二個ML Training Data from ROIs節點重複此步驟。現在應該在Input Parameters下有一個[Background Labels] 選項,單擊 Input Parameters [Background Labels],然後單擊OK。
- 將Input Parameters輸入引數節點連線到Train Random Forest訓練隨機森林節點。出現“Connect Parameters”對話方塊。
- 在“Connect Parameters”對話方塊中的“Train Random Forest”下,單擊“Estimators” 估計器、“Balance Classes” 平衡類、“Max Depth” 最大深度和“Output Model URI”輸出模型路徑。
所有四個引數都透過彩色線連線到新增新的輸入。這些引數都是用於訓練模型時的輸入引數。
- 單擊OK。
您的模型現在應該類似於下圖,所有連線都已完成。注意輸入引數節點和訓練隨機森林節點的連線在下圖中被其它連線遮擋。
4.3.5. 執行模型
完成 ENVI 模型後,儲存您的工作流程並執行它。
- 從ENVI Modeler選單欄中,選擇File>Save as…。出現“選擇輸出模型檔案”對話方塊。指定儲存檔案的位置並將其命名為model並單擊Save。
- 在 ENVI Modeler 工具欄中,單擊Run執行按鈕。出現帶有五個引數的任務執行對話方塊。
- 單擊對話方塊左下角的“幫助”按鈕。出現tutorial Task對話方塊。任務引數描述提供了每個引數功能的資訊。
- 單擊Close按鈕關閉幫助對話方塊。
在Background Labels欄位中,選擇作為背景的類別。可以輸入在標記過程中建立的任意幾個類別(人造地物、樹木、地面、水面)。例如,如果您只想識別樹木,您可以新增標籤(人造地物、地面、水面)。這將產生一個帶有標籤 Background 和 Trees的二元分類器。
- 保留引數Estimators、Balance Classes和Max Depth的預設值。
- 單擊Output Model URI旁邊的Browse按鈕。出現選擇輸出模型URI對話方塊。
- 選擇檔案路徑並將模型命名為json,然後單擊“開啟” 。
- 按指定設定所有引數後,單擊OK按鈕。ENVI Modeler節點顏色為綠色,表示工作流程中此步驟已完成。機器學習訓練進度對話方塊會在訓練步驟中出現。
訓練完成,節點恢復到預設顏色,訓練進度對話方塊關閉。
4.4. 執行分類
生成訓練好的監督分類模型後,您可以執行分類過程。最小化或關閉 ENVI Modeler;對於本節,您將使用 ENVI Toolbox工具箱中的Machine Learning Classification機器學習分類工具。
- 在 ENVI 工具箱中,展開Machine Learning資料夾並雙擊Machine Learning Classification。出現機器學習分類對話方塊。
- 單擊Input Raster旁邊的瀏覽按鈕。出現資料選擇對話方塊。
- 單擊資料選擇對話方塊左下角的開啟檔案按鈕。
- 轉到您儲存教程資料的位置並選擇\classification/NAIP_DallasTX_Oct11_2020.tif,然後單擊Open。
- 單擊Input Model輸入模型旁邊的瀏覽按鈕。出現選擇檔案對話方塊。轉到儲存模型json的位置。選擇它並單擊開啟。
- 將Normalize欄位留空,將使用模型檔案中的最小值和最大值。
- 將Output Raster輸出柵格欄位留空,將建立一個臨時檔案並在分類完成後顯示。
啟用Display result顯示結果。點選OK分類開始,機器學習分類進度對話方塊出現。分類在 30 - 60 秒後完成,具體時間取決於系統配置。
- 分類柵格顯示在 ENVI 檢視中。圖層管理器顯示未分類、水面、地面、樹木和人造地物。在標註樣本過程中未使用 Unclassified 類,此類表示未分類的畫素(如果存在)。
- 在 ENVI 工具欄中,單擊Data Manager資料管理器按鈕。出現資料管理器對話方塊。
- 右鍵單擊tif並單擊Load Default載入預設值。原始影像顯示在 ENVI 檢視中。
在圖層管理器中,單擊Machine_Learning_Classification_output*raster並將其拖動到柵格NAIP_DallasTX_Oct11_2020.tif上方。分類柵格顯示在原始影像上。
在 ENVI 工具欄中,前後移動 Transparency 透明度滑塊以探索與原始影像相比的分類結果。注意到該模型在識別正確的類方面做得很好,但它並不完美。整個影像的陰影被歸類為人造材料。嘗試消除這種情況的一種方法是建立陰影類,或繪製陰影類並將其歸為背景類。
另一個缺陷是足球場部分被分類為水體。這可以透過新增更多的足球場處樣本並重新訓練模型來緩解。
在Go To欄位中輸入畫素座標 ( 7784p,7148p ),然後按Enter鍵跳轉到體育場。
- 或者再次執行分類工作流程以檢視您的模型對其他分類場景的處理情況。例如另一幅影像:\classification\NAIP_SanAntonioSE_2020.dat。
在本教程中,您學習瞭如何構建自定義機器學習工作流,以使用標記資料訓練隨機森林分類器。瞭解到可以使用多個柵格和多個標籤來訓練模型並生成良好的結果。
總之,機器學習技術為學習資料中的複雜光譜模式提供了一個強大的解決方案,這意味著它可以從複雜的背景中提取特徵,而不管它們的形狀、顏色、大小和其他屬性。
5. 總結
本教程介紹了兩種方法進行隨機森林分類。一種方法透過繪製樣本ROI之後使用隨機森林工具(Random Foreast Classification)直接得到分類結果。另一種方法透過ENVI Modeler自定義可重用的隨機森林模型訓練工作流,之後使用通用的機器學習分類工具(Machine Learning Classification)得到分類結果。第一種方法簡便快捷,方便直接獲得分類結果;第二種方法可以獲得可重用的機器學習模型。其它監督分類方法整體操作流程與本教程方法一致,區別是選擇的分類器有所不同。另外使用Machine Learning Labeling Tool機器學習標註工具也可以完成從樣本選擇到模型訓練的整個過程。並且支援實時儲存繪製的樣本,提供專案管理等功能。