跳转到内容
AI Segmentation
QGIS
教程

如何在 QGIS 中自动检测建筑物轮廓

0:00 / 0:00
一个区域,一个单词,848 座建筑物。真实运行,加速 3x,全程无剪辑。

我在巴黎市中心一块区域上运行了自动检测,一次就得到 635 个多边形。决定保留哪 82 个所花的时间,比检测本身还长,而这第二部分几乎每篇教程都会略过。

Dense Parisian city blocks before and after automatic building detection (after)
Dense Parisian city blocks before and after automatic building detection (before)
ImageryDetected
拖动比较
One automatic pass over central Paris, on Google Satellite imagery. Every polygon gets its own colour so neighbours stay separate. Drag the handle to compare.

简要结论。 要在 中自动检测建筑物轮廓:从 plugin manager 安装一个 AI detection plugin,加载影像,绘制区域,为对象命名,然后运行。你会在项目 CRS 中得到一个多边形 layer。接着按置信度和面积过滤这份原始输出,因为返回结果中很大一部分不是建筑物。

什么是建筑物轮廓

建筑物与地面接触处的轮廓,以平面多边形表示。不是屋顶,不是地块,也不是地址点。

这点在这里很重要,因为垂直影像给你的是屋顶。在接近正射角拍摄的五层 Haussmann 建筑街区上,偏移很小。高塔则不是。在你向任何人承诺提供建筑物轮廓 layer 之前,最好先知道这一点。

先检查开放数据集

很多工作其实不需要检测任何东西。

Three panels of the same dense Luanda neighbourhood on Google Satellite imagery, with building footprints in green. OpenStreetMap shows none, Microsoft covers most, Google Open Buildings covers nearly all.
The same 1 km² of Luanda, on Google Satellite imagery. OpenStreetMap maps no buildings here, Microsoft finds 3,140, Google Open Buildings 4,468. Over a dense African neighbourhood the dataset you reach for decides whether you get everything or nothing.

将其中一个数据集叠加到你的影像上。只有在覆盖范围存在空洞、数据年代不对,或轮廓必须匹配客户交给你的特定正射影像时,你才继续往下做。

不到五十栋建筑,就手工绘制

手工数字化。免费、精确,到了这个数量,我还是会自己做。先打开 snapping(Project -> Snapping Options,vertex 和 segment,开启 topological editing),否则你会花整个下午删除碎片。

到了第 60 栋建筑时,你开始走一些在第 6 栋时绝不会走的捷径,而且自己还注意不到。它已经进入了 layer。

自动方式

这里的 plugin 是 AI Segmentation,这是我和联合创始人在 TerraLab 开发的产品,所以读这一节时,请记得这是谁的工具。它和其他 plugin 一样从 plugin manager 安装:无需手动下载,无需 Python 环境,也无需专用显卡,因为模型运行在我们的服务器上。支持 Windows、macOS 和 Linux。

绘制一个区域,输入 buildings,点击 Detect。这就是完整的 prompt,如果你愿意,也可以使用自己的语言。结果会随着瓦片逐块传回来,作为项目 CRS 中的一个多边形 layer。

The AI Segmentation panel in QGIS with the Semi-Auto and Automatic switch
Automatic mode: pick the imagery layer, draw a zone, name the object.

值得了解的一个设置是 precision,也就是瓦片大小。小瓦片让模型看得更近,这是小型目标所需要的。大瓦片为模型提供上下文,这是农场地块所需要的。瓦片也是计费单位:每块 1 个额度。每个账户每月都有免费额度,无需银行卡,而 Pro 会提高额度。检测运行在欧洲服务器上,我们不会使用你的影像进行训练;如果任何数据都不能离开你的机器,也有一个小型本地模型可用。

然后,面板会在任何内容成为 layer 前引导你完成三个步骤:过滤要 Keep 的内容,Correct 模型漏掉的内容,并选择输出的 Shapes完整指南涵盖了这三步。第一步决定成败,所以下一节专门讲它。

过滤就是全部工作

原始检测输出是一组带有置信度分数的候选多边形。在密集影像中,大多数都很小且不确定。我将这次巴黎运行的两个过滤器都调到最宽松,因此每个候选结果都进入了 layer:在 1.18 km² 上共有 635 个多边形。

1 m²101001 00010 000 m²50 m²
Every one of the 635 detections, binned by area on a log scale. Two humps: noise under 5 m², real buildings above 160 m². The 50 m² line falls in the valley between them, which is why it is not an arbitrary number. Median 3.2 m², largest 13,528 m², median confidence 0.26.

返回结果中有一半比停车位还小:通风口、天窗、楼梯间顶棚、庭院棚屋。它们都是真实出现在影像中的东西,轮廓也画得没错,但没人所谓的建筑物轮廓是这些东西。

所以要过滤。拖动 panel 中的两个滑块,或者在属性表里用 Select by Expression 做同样的事:

"area_m2" >= 50 AND "score" >= 0.5

这样会留下 635 个中的 82 个多边形,覆盖 263,658 m² 总面积中的 222,338 m²。与其直接相信我的阈值,不如自己移动滑块。绿色会通过你的过滤,白色不会。

Aerial imagery of dense Parisian blocks with detected building polygons drawn over it

82 / 635polygons kept (13%)

84%of the built area (222,338 m²)

The same 635 detections the attribute table holds. Drop the confidence to zero and the courtyard sheds and skylights come back.

拖动第一个滑块时,观察第二个数字。丢掉 87% 的多边形,只损失 16% 的面积。其余都是你反正也会手动删除的噪声,只不过得一个个删,同时怀疑这个工具到底好不好用。

根据工作调整两者。工业棚屋测绘可以把面积下限提高到 200 m²。绘制非正规住区时,50 m² 会丢掉真实房屋,所以降到 15,并更多依赖置信度分数。

干净的结果是什么样

巴黎是个难题。同一个工具用于以西约 10 km 的独立式住宅:

Detached and semi-detached houses in a Paris suburb, each house filled with its own colour
Detached housing, review filter on. One polygon per house, almost nothing to throw away.

85

median polygon area

Paris run: 3.2 m²

0.79

median confidence

Paris run: 0.26

251polygons

kept, out of 251 returned

Paris run: 82 out of 635

同一个工具,同一座城市,几乎没有可丢弃的结果。变化的是建筑形态,而不是模型。

它在哪里失效:密集连续街区

Close view of Haussmann blocks, each block one coloured polygon following the street edge with courtyards cut out
The outline follows the street edge precisely and cuts out the courtyards. What it does not do is split the block into individual addressed buildings.

每个多边形都沿着街道边缘描出整块街区的建筑外轮廓,并正确挖出庭院。对于建筑面积或不透水面有用,但如果你需要每个地址一个多边形,就不对了。任何读取垂直影像的模型都找不到两栋相连建筑之间的共用墙,因为从上面看那里什么也没有。

所以,如果你要的是历史城区按地址划分的 layer,我不会使用自动检测。地籍数据加手工修正更胜一筹。

清理几何图形

三个原生 QGIS 工具可以整理建筑物轮廓 layer,而且顺序很重要,因为 Simplify 会移动你刚刚弄成直角的顶点。

  1. Simplify,在航拍影像上使用 0.5 m 容差。大幅减少顶点数量,同时不会把边界移动到你能察觉的位置。
  2. Orthogonalize。 将接近直角的角点吸附成方正形状。在开放数据或手工描绘的工作中可以使用它,因为这些数据还没有被方正化。
  3. Delete holes,仅当你想要实心轮廓时使用。巴黎结果不要这样做:那些孔洞是庭院,而且是正确的。

在检测得到的 layer 上,第 2 步几乎等于不做任何事。我没有直接假定这一点,而是实际测量了它:对 190 个检测出的建筑运行 Orthogonalize,并比较全部 1,845 个角点前后的变化。

87.9%

corners already within 1° of square

before running anything

87.9%

after Orthogonalize

the same 1,845 corners

1.7cm

median vertex shift

9.1 cm at the worst

Close view of detected building outlines on aerial imagery, corners meeting at right angles
The same detections, close in. The corners arrive square, so the cleanup step has nothing left to snap.

剩下那 12% 不方正的是相连的露台。看看贯穿街区中央的阶梯状边缘。没有任何角点工具能修正它,因为这些台阶沿着真实屋顶线分布,而不是建模错误。

该使用哪种方法

开放数据集手工数字化自动检测
成本免费免费免费额度,用完付费
设置几分钟几分钟
适合已有良好覆盖的区域少于约 50 栋建筑数百到数千栋建筑
匹配你的影像
团队内一致
密集连续街区视情况而定仅街区外轮廓
可说明的来源数据集及年代你的影像,附置信度分数

常见问题

它适用于无人机影像吗? 比卫星影像更好。地面分辨率比来源更重要:5 cm 正射影像能提供比 30 cm 卫星场景更干净的边界和更高的置信度。

我需要 GPU 吗? 不需要。两种模式默认都在我们的服务器上运行,小型本地模型在你自己的 CPU 上运行,但速度更慢、准确度也更低。如果你希望所有内容都留在自己的机器上,Geo-SAMsamgeo 都是免费且好用的,但它们需要 NVIDIA 显卡。

一次运行要多少钱? 自动模式下每个瓦片消耗 1 个额度,半自动模式下每保存一个对象消耗 1 个额度。每个账户每月都有免费额度,本地模型则完全不收费。

Try it free in QGIS, no card needed