[译] 解密 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...

相关文章
相关标签/搜索