[譯] 解密 Mapbox 衛星影像處理神器 Robosat

英文原文地址:https://www.openstreetmap.org...
英文原文做者:danielgit

clipboard.png

前言

最近,Mapbox 開源了端到端的衛星影像特徵提取工具 RoboSat。下面我將以來自 OpenAerialMap 的 Tanzania 區域的無人機影像 演示如何在自定義圖像數據集上運行完整的RoboSat流程。github

目標

咱們的目標是經過手把手的教學,在Dar es Salaam 和 Zanzibar 附近提取建築物輪廓。我建議手工你過一遍 Zanzibar Mapping Initiative 和 OpenAerialMap 來創建對數據集的直觀先驗瞭解。json

clipboard.png

總體步驟

從無人機影像提取建築輪廓包含下面幾個步驟:segmentfault

  1. 數據準備:建立訓練數據集
  2. 訓練模型:分割模型提取特徵
  3. 後處理:將分割結果轉爲簡單的幾何格式

首先,帶你建立一個基於 OpenAerialMap 的無人機影像而且帶有 OpenStreetMap 建築物輪廓蒙版的數據集。api

接着,我將演示如何訓練 RoboSat 分割模型在新的無人機影像如何提取建築。數組

最後,我將介紹略好將預測結果轉化爲簡單的多邊形並映射到 OpenStreetMap 上。服務器

clipboard.png

數據準備

Zanzibar Mapping Initiative 經過OpenAerialMap提供他們的無人機影像。微信

這是一個你能夠手動瀏覽地圖。網絡

訓練RoboSat 的分割模型須要同時提供對應的 Slippy Map tiles 格式的無人機影像和對應的建築物輪廓數據集。你能夠認爲這些由二進制組成的蒙版是用來標記建築物對應區域是否存在建築。app

讓咱們開始提取 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"
}

如今咱們有兩個選項

  1. 下載 GeoTIFF 而後用 rasteriorio-tiler 小工具來切割 GeoTIFF生成對應的瓦片。
  2. 請求 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數據集;

clipboard.png

訓練與建模

RoboSat 分割模型是一個全鏈接神經網絡,爲了保證模型效果,咱們進行了數據集切割:

  1. 80% 訓練集,用於模型訓練
  2. 10% 驗證集,用戶模型效果驗證
  3. 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。

若是你手工檢查預測結果你須要注意,原本不存在建築物可是模型缺圈出來的建築物是被稱爲假陽性錯誤。假陽性錯誤是由於咱們的數據集致使的,咱們在數據集中反覆採樣帶有建築的例子,即便這些瓦片的背景像素不包含足夠的背景(被稱爲負採樣)也同樣被用來學習勾勒建築物輪廓。若是咱們不反覆輸入一張圖片,那麼模型是很難區分出哪些是背景的。

解決這個問題有兩種方法:

  1. 添加隨機採樣的背景瓦片到訓練集中,從新計算類的分佈權重,而後再次訓練,或者使用咱們訓練好的模型在數據集上反覆訓練,而後故意在已知無建築物的樣本中進行預測。若是模型出現誤判了,而後咱們就調出這部分數據集,再次訓練。
  2. 使用所謂的 "硬負挖掘",容許咱們主動添加負樣本。這個方法只在小而乾淨的數據集上使用。對於"硬負挖掘" 咱們從不在 building.tiles 的瓦片中隨機採樣來訓練模型。而後經過rs compare 工具建立無建築的圖像,接着進行預測。
rs compare visualizations images segmentation-masks

在確認真正的背景圖片後,不止要在OSM上標註,並且還要找出對應的全背景的負樣本到數據集中。接着,走一遍訓練流程:

  1. rs weights
  2. 更新配置
  3. 從新訓練

一般,在乾淨的小數據集上作不少遍硬負挖掘和訓練才能使得模型收斂。

恭喜!你如今有一個魯棒的模型用於預測了!

在花費數小時的硬負樣挖掘,咱們能產出分割機率了。

有趣的看到的是該模型並不徹底肯定建築工地。這是由於在咱們用硬樣挖掘方法選擇數據集時決定是否使用建築工地決定的。

clipboard.png

最後,後處理流程是有必要的,它將分割蒙版轉化爲矢量化的 GeoJSON 以後用於瓦片文件生成。

本文不對後處理的細節展開,由於基於小樣本的訓練方式比較粗糙的,RoboSat 後處理模塊還在打磨中。

總結

本教程手把手過了一遍 RoboSat 全流程,從數據集準備、訓練分割模型到預測航拍圖片中的建築物。本教程全部工具和數據都開源了。

嘗試一下吧! https://github.com/mapbox/rob...

做爲分享主義者(sharism),本人全部互聯網發佈的圖文均聽從CC版權,轉載請保留做者信息並註明做者 Harry Zhu 的 FinanceR專欄: https://segmentfault.com/blog...,若是涉及源代碼請註明GitHub地址: https://github.com/harryprince。微信號: harryzhustudio
商業使用請聯繫做者。

參考資料

https://www.openstreetmap.org...
https://github.com/mapbox/rob...

相關文章
相關標籤/搜索