Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

Kaggle 轎車 深度學習 機器學習 量子位 2017-05-01

王小新 編譯自 Kaggle

量子位 出品 | 公眾號 QbitAI

在2016年12月至2017年3月期間,Kaggle網站舉辦了一場對英國國防科學與技術實驗室(DSTL)提供的衛星圖像進行場景特徵檢測的圖像分割比賽。

主辦方所提供的訓練集裡包含了25個1平方公里大小地區的高分辨率衛星圖像,具體任務是通過算法進行識別10個不同類型的對象,分別是:

  1. 房屋和樓房;

  2. 混雜的人工建築;

  3. 道路;

  4. 鐵路;

  5. 樹木;

  6. 農作物;

  7. 河流;

  8. 積水區;

  9. 大型車輛;

  10. 小轎車。

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

Kyle的Kaggle主頁

比賽結束後,冠軍Kyle Lee接受了Kaggle網站的採訪,詳細地介紹了他在這次比賽中的獲勝之道。其中,耐心和堅持是關鍵因素,他花費了大量的時間,為不同的類別開發了獨特的處理技術、採樣策略和U-NET結構。

以下內容節選自Kaggle對Kyle的採訪:

你的整體策略是什麼?

總而言之,我的解決方案主要有以下幾點:

1. 將多尺度圖像塊與滑動窗口生成方法相結合,利用區域塊重疊技術覆蓋到整個圖像的邊緣。最初將尺度為256x256和288x288的圖像塊相結合,後來又加入了尺度為224x224和320x320的圖像塊;

2. 組合不同的頻段(bands)和尺度(scales),來訓練和融合網絡模型,得到最優的U-NET網絡;

3. 對小樣本類別進行過採樣。過採樣在小樣本圖像上以較小的步長來滑動採樣窗口,在大樣本圖像上以比默認值更大的步長來滑動採樣窗口;

4. 作用於河流對象的指標法,組合無差別水分指數(Non-Differential Water Index)和頂端葉綠素含量指數(Canopy Chlorophyl Content Index)這兩個指標來辨識河流;

5. 對道路、積水區、河流、小轎車與大型車輛這些對象進行後期處理。這種後期處理辦法解決了積水區和河流之間的類別混亂,同時去除道路上的偽影,並在計算大型車輛得分時設置附加權值;

6. 大型車輛識別。在這裡我用了一些技巧來訓練用於預測道路和房屋的網絡。我只使用RGB頻段的圖像數據,取平均值,並訓練多個融合網絡,對大型車輛進行分割。

7. 農作物。我先將圖像的尺度降低為1024×1024,然後利用滑動窗口重疊採樣,得到尺度為256x256的圖像塊。

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

圖1:辨識所有類別的完整網絡示意圖

你是如何進行特徵提取和數據預處理?

我使用不同大小的滑動窗口,對A頻段和M頻段的圖像分開處理。另外,我還在一些融合模型中對小樣本類別進行過採樣操作。關於滑動窗口的詳細參數如下:

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

圖2:各類過採樣的詳細參數

同時對積水區和河流進行過採樣是一個不錯的方法。因為過採樣能減少積水區的偽影,降低了積水區和河流的類別混亂。

就網絡所用的數據頻段來說,我主要使用灰度圖、RGB圖像和多光譜M頻段,也使用了短波紅外A頻段。對於A頻段,我沒有使用所有的通道,而是隨機選擇幾種通道,以節省訓練時間和內存佔用。

在上面也提到過,我僅對道路和建築物周圍的車輛進行滑動窗口採樣,用於網絡訓練和預測,這有助於減少訓練所需的圖像數量,並允許對車輛圖像塊進行鍼對性的過採樣。該方案也應用於測試集,你可以從流程圖中看出一系列結果。

最後,在預處理中,將訓練集的圖像減去平均值,並標準化偏差。也就是說,訓練集、驗證集和測試集的圖像塊都需要減去全局平均值,再除以訓練集的標準偏差。

你使用了哪種監督學習方法?

U-NET網絡經常用於“超聲神經分割”(Ultrasonic Nerve Segmentation)比賽和其他的分割比賽中。在此次比賽中,我也大量使用了這種網絡,因為這是目前擴展性最好的完全卷積網絡(Fully Convolutional Network)。事實上,如果我沒有猜錯,大多數參賽者都使用了升級版U-NET網絡。

我對原始的網絡結構進行了調整,在下游路徑添加了BN層(batch-normalization),在後合併路徑上添加了dropout層,所有激活層都使用的是指數線性單元(ELU)。通過交叉驗證評分,對於不同的類別使用不同的網絡深度和圖像尺寸,如256 x 256,288 x 288等。

在我的實驗過程中,有一種網絡結構在訓練時間等方面都具備最優的性能。這種網絡有著較大的圖像尺寸(288x288)和較淺的U-NET網絡深度(3組2 x conv層+ maxpool)。

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

圖3:不同類別的U-NET結構

最終,我創建了40多種不同尺度、寬度和深度的網絡模型,來訓練數據子樣本和選擇最佳頻段。

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

圖4:10類對象的全部網絡模型表1

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

圖5:10類對象的全部網絡模型表2

在交叉驗證方面,我根據不同類別,使用了10%到20%的隨機圖像塊,大樣本類別比例更高。對於過採樣的小樣本類別,只使用5%的隨機圖像塊。這樣,整體上減少了模型的運行時間。

訓練集的圖像(包括圖像和標籤)通過旋轉45度、縮放15-25%、剪切操作、切換頻段(僅針對某些網絡)和垂直+水平翻轉等圖像增強操作,增加泛化能力,網絡的訓練時間也隨之增加。對驗證集或測試集不進行上述操作。

在優化策略方面,NAdam優化器效果不好,直接使用Adam作為優化器,用Jaccard Loss作為訓練指標。我的學習率優化方法是,每經過30次迭代,學習率減小為原來的0.2倍。

在處理網絡輸出上,大多數類直接使用標籤算術平均,對於積水區和大型車輛類別採用相加方法,僅在使用NDWI指數和CCCI指數的河流上使用了交叉選取的方法。

對於數據,最重要的洞察力是什麼?

我的理解是,大多數參賽者在積水區和兩種車輛對象的識別率都比較低,在這一塊,我花了很多功夫來進對圖像進行預處理和後期處理。我相信,只要提高這三類對象(積水區,小轎車和大型車輛)的識別率,就能領先其他參賽者,提高我的最終成績排名。

積水區與河流

對於積水區,積水區的主要問題之一是會與河流相混淆。如前所述,對積水區和河流進行過採樣,有助於U-NET網絡在積水區預測時解決河流的偽影問題,但仍然有大量河流對象的旁支幹擾,下圖為積水區預測的最初效果。

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

圖6:積水區的偽影問題

從常識上來說,河流總是會延伸到圖像的邊界,而積水區一般只有小的重疊區域,這是解決問題的關鍵。此外,為了檢測河流而建立的NDWI指數可能與原始的積水區預測結果相重疊,並且兩者間非常相似的斷裂邊緣可以被合併成凸包,形成一種觸及圖像邊界的完整輪廓。總之,檢查積水區和河流的圖像邊界輪廓,是後期處理流程的一部分工作,能將一些錯分為積水區的圖像轉變為河流類。

大型車輛和小轎車

此外,我也花了大量時間用於分類兩類車輛對象。我注意到,無論是在訓練數據中,還是根據常識來判斷,車輛往往停放在道路上或道路附近,以及建築物的周圍。

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

圖7:在道路上和建築物周圍的小轎車

我們只對包含有建築物和道路的車輛圖像塊進行訓練和預測,同時對車輛圖像樣本進行過採樣,並縮小網絡中的卷積核大小。此外,我只採用RGB圖像作為輸入數據,因為在其他的頻段中,車輛對象不可見或明顯移位。

其次,許多車輛在圖像模糊和處於標記區域時,都很難區分大型車輛和小轎車。作為參照,這些訓練數據的標記區域大小顯示在下面的直方圖中,並且在大型車輛和小轎車之間,大約有50-150像素點的大面積重疊。

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

圖8:小轎車和大型車輛的標記區域像素點數量對比

為了解決這個問題,我將小轎車和大型車輛合併為一類,訓練了更多的網絡,並將這個網絡與識別大型車輛的網絡進行合併。這是因為該合併網絡沒有類別混亂,所以能夠更好地預測多邊形。然後我設置了這個合併網絡識別區域的最小像素為200,目的是隻提取大型車輛。對於小轎車的識別,基本上只是採取多個小轎車網絡預測的平均值,並刪除與大型車輛重疊的輪廓和超過區域像素閾值的多邊形。此外,再通過建築物、樹木和其他類別的標籤排除兩類車輛對象的可能性。

後來的分析表明,這種方法有助於大型車輛的私有LB評分,如果省去這部分,對大型車輛的預測性能將下降59%。另一方面,去除上述的區域最小像素門檻,小型車輛的預測性能沒有任何的改善。

什麼結果讓你感到驚訝?

令我驚訝的是,使用簡單快速的指數法可以很好地預測河流對象。我沒有采用深度學習的方法,而是結合NDWI指數和CCCI指數進行邊界連接檢查,以過濾掉積水區和建築物,從而騰出資源用於其他類的訓練。相對於可能使用深度學習方法的其他團隊來說,在這一類上,我的公開LB得分和私有LB得分是比較有競爭力的。

最後,這是各類的CV值、私有LB得分和公開LB得分列表。

Kaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?

圖9:各類的本地CV值,公開LB得分和私有LB得分比較。

作物類別的私有LB評分帶有星號(*),是因為OpenCV庫的findContours函數出現錯誤,如果使用正確的WKT生成腳本,則該類別的私有LB得分為0.8344,而不是0.7089。這樣我的解決方案的正確率可達0.50434,超過了0.5!而不是現在0.49272的總體私有LB分數。

我在後來的比賽中才發現,這個錯誤導致了部分圖像沒有被檢測出輪廓。如果我有時間,我會編寫一個WKT格式標籤轉儲Diff的程序。剩餘的九類都使用了正確的提交腳本。

我猜測,較好的車輛和積水區預測效果,使我在比賽中脫穎而出,因為其他優秀的參賽者往往車輛類別或積水區類別的得分不高。

你使用哪些工具?

以Theano後端的Keras ,用於操縱多邊形的OpenCV庫、Rasterio庫和Shapely庫。

雖然我之前使用了VGG16分類器對合並後的車輛預測網絡進行了微調,但效果並不是很好。所以在最終解決方案中,我沒有使用預先訓練好的模型。

你是如何度過這次比賽?

由於這是一個應用神經網絡分割的比賽,我花了80%的時間用於調整和訓練不同的網絡並監控訓練效果;剩下20%的時間用於設計預處理和後期處理流程。從各類所用時間的角度來看,超過70%的時間花在識別車輛、積水區和建築物,而花了最少的時間識別農作物。

在提交次數上,我多次嘗試提交文件來微調近似多邊形。我先嚐試了正方形邊框,然後改為近似多邊形,接著在OpenCV中嘗試侵蝕多邊形。最終,我使用rasterio庫和shapely庫來執行從多邊形到WKT格式的轉換。除了樹木之外,其他的類別都沒有近似值,所以在轉換為WKT格式之前,我首先將樹木類別重新調整為1550 x 1550,這樣能有效地逼近多邊形。

你的硬件配置是怎樣的?

在這次比賽中我使用了三部臺式機:前兩個用於所有類別的網絡訓練和預測,而第三個僅用於訓練農作物的預測網絡。

  • GTX1080(8GB)+ 48GB內存的桌面系統

  • GTX1070(8GB)+ 48GB內存的桌面系統

  • GTX960(4GB)+ 16GB內存的桌面系統

您獲勝方案的總運行時間是多少?

假設所有的模型和所有的圖像尺度預處理過程可以並行運行,那麼完成所有網絡的訓練大約需要三天時間:一天進行預處理,一天進行訓練和預測,剩下一天進行車輛預測並生成提交方案。

量子位還曾經編譯過Kaggle對這次比賽第三名的採訪。要查看文中提到的Kaggle競賽和U-NET論文,可以在量子位公眾號(QbitAI)對話界面回覆“衛星圖像識別”。


招聘

我們正在招募編輯記者、運營等崗位,工作地點在北京中關村,期待你的到來,一起體驗人工智能的風起雲湧。

相關細節,請在公眾號對話界面,回覆:“招聘”兩個字。

One More Thing…

今天AI界還有哪些事值得關注?在量子位(QbitAI)公眾號會話界面回覆“今天”,看我們全網蒐羅的AI行業和研究動態。筆芯~

相關推薦

推薦中...