[譯] 解密 Mapbox 衛星影像處理神器 Robosat
英文原文地址: https://www.openstreetmap.org...
前言
最近,Mapbox 開源了端到端的衛星影像特徵提取工具 RoboSat。下面我將以來自 OpenAerialMap 的 Tanzania 區域的無人機影像 演示如何在自定義影象資料集上執行完整的RoboSat流程。
目標
我們的目標是通過手把手的教學,在Dar es Salaam 和 Zanzibar 附近提取建築物輪廓。我建議手工你過一遍 Zanzibar Mapping Initiative 和 OpenAerialMap 來建立對資料集的直觀先驗瞭解。
整體步驟
從無人機影像提取建築輪廓包含下面幾個步驟:
- 資料準備:建立訓練資料集
- 訓練模型:分割模型提取特徵
- 後處理:將分割結果轉為簡單的幾何格式
首先,帶你建立一個基於 OpenAerialMap 的無人機影像並且帶有 OpenStreetMap 建築物輪廓蒙版的資料集。
接著,我將演示如何訓練 RoboSat 分割模型在新的無人機影像如何提取建築。
最後,我將介紹略好將預測結果轉化為簡單的多邊形並對映到 OpenStreetMap 上。
資料準備
Zanzibar Mapping Initiative 通過OpenAerialMap提供他們的無人機影像。
這是一個你可以手動瀏覽地圖。
訓練RoboSat 的分割模型需要同時提供對應的 Slippy Map tiles 格式的無人機影像和對應的建築物輪廓資料集。你可以認為這些由二進位制組成的蒙版是用來標記建築物對應區域是否存在建築。
讓我們開始提取 Dar es Salaam 和 Zanzibar 邊界框吧。
從對應的無人機影象範圍中提取OSM建築物幾何圖形提取作為訓練資料集,因此需要在 OSM 上擷取對應的區域。
我有個在 GeoFabrik 工作的朋友提供了方便又先進的 提取工具 osmium-tool
,它可以幫助實現上述任務。
wget --limit-rate=1M http://download.geofabrik.de/africa/tanzania-latest.osm.pbf
osmium extract --bbox '38.9410400390625,-7.0545565715284955,39.70458984374999,-5.711646879515092' tanzania-latest.osm.pbf --output map.osm.pbf
完美! Dar es Salaam and Zanzibar 的建築物幾何圖形儲存在 map.osm.pbf 中。
RoboSot 利用 rs extract 來從 OSM 的底圖提取幾何圖形。
rs extract --type building map.osm.pbf buildings.geojson
現在我們從建築物幾何圖形的 buildings.geojson 檔案提取對應的 Slippy Map tiles 檔案,通常設定 zoom level 在19 或者 20 是比較合理的。
rs cover --zoom 20 buildings.geojson buildings.tiles
基於 buildings.tiles 檔案我們可以從 OAM 下載無人機影像並且將它柵格化成對應的OSM蒙版瓦片,下面是一個訓練資料的預覽效果:
如果你自己看會發現這些蒙版其實不是完美匹配的,因為我們訓練的模型基於千萬個影象和蒙版,有一些噪音資料還是可以接受的。
建立無人機影象瓦片最簡單的方式是通過 OAM 的 API。 我們可以用 /meta 介面請求所有開放的給定區域的無人機影像。
http 'https://api.openaerialmap.org/meta?bbox=38.9410400390625,-7.0545565715284955,39.70458984374999,-5.711646879515092'
JSON 陣列是請求的響應,她包含了所有邊界框中的無人機影像元資訊。我們可以用 jq 來過濾這些網路請求響應,結合比如 通過使用者名稱或者日期這樣的過濾條件。
jq '.results[] | select(.user.name == "ZANZIBAR MAPPING INITIATIVE") | {user: .user.name, date: .acquisition_start, uuid: .uuid}'
它將返回一個包含對應GeoTIFF影象的 JSON 物件
{ "user": "ZANZIBAR MAPPING INITIATIVE", "date": "2017-06-07T00:00:00.000Z", "uuid": "https://oin-hotosm.s3.amazonaws.com/5ac7745591b5310010e0d49a/0/5ac7745591b5310010e0d49b.tif" }
現在我們有兩個選項
- 下載 GeoTIFF 然後用
rasterio
和rio-tiler
小工具來切割 GeoTIFF生成對應的瓦片。 - 請求 OAM 的 API 直接獲取對應的瓦片。
rs download https://tiles.openaerialmap.org/5ac626e091b5310010e0d480/0/5ac626e091b5310010e0d481/{z}/{x}/{y}.png building.tiles
注意: OAM 提供多個 Slippy Map 介面
這兩種方法都是為了實現一個目的: 生成一個包含 256x256大小的無人機影像的 Slippy Map。
我們可以用提取過的建築幾何邊界和瓦片檔案建立對應蒙版。
rs rasterize --dataset dataset-building.toml --zoom 20 --size 256 buildings.geojson buildings.tiles masks
在柵格化之前我們需要建立 dataset-building.toml
資料集;
訓練與建模
RoboSat 分割模型是一個全連線神經網路,為了保證模型效果,我們進行了資料集切割:
- 80% 訓練集,用於模型訓練
- 10% 驗證集,使用者模型效果驗證
- 10% 預留集,使用者模型超引數調優
我們按照上述比例對 building.tiles 檔案隨機洗牌到不同的 Slippy Map 資料夾下。
rs subset images validation.tiles dataset/validation/images rs subset masks validation.tiles dataset/validation/labels
rs subset images training.tiles dataset/training/images rs subset masks training.tiles dataset/training/labels
rs subset images evaluation.tiles dataset/evaluation/images rs subset masks evaluation.tiles dataset/evaluation/labels
因為前景和背景在資料集中分佈不均,模型訓練之前需要先計算一下每個類的分佈。
rs weights --dataset dataset-building.toml
將權重以配置檔案的形式儲存起來,之後訓練會用到。
一切都準備好了,可以開始訓練了:
rs train --model model-unet.toml --dataset dataset-building.toml
在訓練過程中對於每個 epoch
,都會將歷史的訓練和驗證的損失以及指標儲存到 checkpoint 中。我們可以在訓練過程中選擇在 validation 中表現最好的model存在 checkpoint 中。
用儲存下來的checkpoint能夠預測影象中每個畫素用以區分前景和背景的所屬類別概率,隨後這些所屬類別概率可轉為離散的分割蒙版。
rs predict --tile_size 256 --model model-unet.toml --dataset dataset-building.toml --checkpoint checkpoint-00038-of-00050.pth images segmentation-probabilities
rs masks segmentation-masks segmentation-probabilities
這些 Slippy Map 資料夾也可以通過 HTTP 伺服器的方式直接對外提供柵格瓦片服務。我們通過 rs serve
也提供按需瓦片服務,它既能有效進行後處理(瓦片邊界、去噪音、向量化,邊緣簡化)也可以方便地debug。
如果你手工檢查預測結果你需要注意,本來不存在建築物但是模型缺圈出來的建築物是被稱為假陽性錯誤。假陽性錯誤是因為我們的資料集導致的,我們在資料集中反覆取樣帶有建築的例子,即使這些瓦片的背景畫素不包含足夠的背景(被稱為負取樣)也一樣被用來學習勾勒建築物輪廓。如果我們不反覆輸入一張圖片,那麼模型是很難區分出哪些是背景的。
解決這個問題有兩種方法:
rs compare
rs compare visualizations images segmentation-masks
在確認真正的背景圖片後,不止要在OSM上標註,而且還要找出對應的全背景的負樣本到資料集中。接著,走一遍訓練流程:
rs weights
通常,在乾淨的小資料集上做很多遍硬負挖掘和訓練才能使得模型收斂。
恭喜!你現在有一個魯棒的模型用於預測了!
在花費數小時的硬負樣挖掘,我們能產出分割概率了。
有趣的看到的是該模型並不完全確定建築工地。這是因為在我們用硬樣挖掘方法選擇資料集時決定是否使用建築工地決定的。
最後,後處理流程是有必要的,它將分割蒙版轉化為向量化的 GeoJSON 之後用於瓦片檔案生成。
本文不對後處理的細節展開,因為基於小樣本的訓練方式比較粗糙的, RoboSat
後處理模組還在打磨中。
總結
本教程手把手過了一遍 RoboSat 全流程,從資料集準備、訓練分割模型到預測航拍圖片中的建築物。本教程所有工具和資料都開源了。