前言
在前面的专栏实战中,我们先后完成了AI水体智能提取 、NDVI植被覆盖度反演两大生态遥感核心项目,掌握了遥感AI解译、地物统计、时序分析的标准化落地流程。
本期正式进入城镇人工地物遥感实战 ,带来遥感工程、城市规划、国土测绘领域最高频的落地项目:高精度建筑物提取 + 多年城市建成区扩张动态分析。
建筑物是城市遥感的核心骨架,建成区范围、建筑密度、新增建设用地规模,是衡量城镇化进程、城市扩张、国土空间变化的核心指标。
传统建筑提取手段弊端显著:传统阈值分割极易与裸土、荒地、硬化路面混淆;普通U-Net面对城区密集连片建筑易出现粘连融合,城郊小型零散建筑漏检率极高,完全无法满足精细化测绘需求。
针对城镇场景复杂特征,本期采用优化Swin-UNet精细分割+小目标检测辅助 方案,适配城区密集建筑、城郊零散建筑、道路硬化干扰等复杂场景,完成单期建筑高精度提取、多时相影像变化检测、建成区范围提取、扩张面积统计、空间演变分析全链路实战。
核心落地应用场景
-
国土动态监测:年度建设用地新增、违建占地、非农化用地核查统计
-
城市规划研究:城区扩张方向、扩张速率、空间格局演变分析
-
城镇化评估:长时间序列城镇建成区时空动态、城镇化质量评价
-
科研毕设课题:城市遥感、LUCC土地利用变化、时空驱动力分析
一、城镇建筑遥感提取核心难点
相比于水体、植被,建筑物提取场景更复杂,也是新手做城市遥感最容易踩坑的地方,核心难点集中在4点:
-
密集建筑粘连严重:城区楼栋排布密集、间距极小,普通分割模型易整片融合,无法区分单体建筑边界
-
小目标漏检率高:城郊自建房、零散小屋、工地临时建筑尺寸微小,模型特征丢失严重
-
同谱异物干扰强:硬化路面、裸土、广场空地光谱与建筑高度相似,极易错分混入建筑范围
-
时序干扰复杂:不同季节、光照、影像分辨率差异,导致多时相提取结果偏差大,扩张分析失真
针对以上痛点,本期采用Transformer全局建模+局部细节强化的优化方案,兼顾全局建成区轮廓与局部建筑细节,完美适配城市复杂场景。
二、本期核心技术方案
摒弃传统单一分割模式,采用「精细分割+目标检测辅助+时序差分变化」组合方案,精度与完整性双重保障:
-
主干模型:优化Swin-UNet,全局注意力破解密集建筑粘连问题,精准区分楼栋边界
-
小目标补强:轻量YOLO辅助检测,召回城郊微小零散建筑,降低漏检率
-
干扰剔除:光谱纹理双重约束,过滤道路、裸土、广场硬化干扰
-
时序分析:多时相影像配准+差分运算,自动提取新增建成区、统计扩张面积
三、全流程实战落地链路
完整标准化流程,可直接复用至任意城市、任意年份的城镇化监测项目:
多时相遥感影像收集 → 影像配准/裁剪/预处理 → 建筑样本数据集制作 → Swin-UNet建筑精细分割 → 小建筑目标补强 → 单期建成区掩膜提取 → 多时相掩膜差分对比 → 新增扩张范围提取 → 面积统计+可视化制图+报告输出
四、AI建筑高精度分割完整代码(Swin-UNet优化版)
专为城市建筑场景优化,解决密集粘连、边界模糊、裸土错分问题,适配RGB/多光谱遥感影像,带完整训练推理逻辑。
4.1 环境依赖一键安装
bash
pip install torch timm einops rasterio opencv-python pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
4.2 建筑分割专属模型完整代码
python
# -*- coding: utf-8 -*-
# 城市建筑高精度分割模型|优化Swin-UNet|适配密集建筑+小建筑目标
import torch
import torch.nn as nn
import torch.nn.functional as F
from einops import rearrange
import timm
# 影像分块嵌入模块
class PatchEmbed(nn.Module):
def __init__(self, patch_size=4, in_chans=3, embed_dim=96):
super().__init__()
self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size)
def forward(self, x):
x = self.proj(x)
B, C, H, W = x.shape
x = rearrange(x, 'b c h w -> b (h w) c')
return x, H, W
# 建筑专属Swin-UNet模型
class BuildingSwinUNet(nn.Module):
def __init__(self, in_channels=3, num_classes=2, embed_dim=96):
"""
in_channels: 3(RGB)/4(多光谱)
num_classes: 2分类(建筑/非建筑)
"""
super().__init__()
self.patch_embed = PatchEmbed(patch_size=4, in_chans=in_channels, embed_dim=embed_dim)
# 轻量Swin Transformer主干,强化全局建模能力
self.swin_backbone = timm.create_model(
'swin_tiny_patch4_window7_224',
pretrained=False,
embed_dim=embed_dim,
num_classes=0
)
# 多层上采样解码,细化建筑边界
self.up1 = nn.ConvTranspose2d(embed_dim * 2, embed_dim, 2, stride=2)
self.up2 = nn.ConvTranspose2d(embed_dim, embed_dim // 2, 2, stride=2)
# 分割输出头
self.out_seg = nn.Conv2d(embed_dim // 2, num_classes, kernel_size=1)
def forward(self, x):
B = x.shape[0]
x, H, W = self.patch_embed(x)
x = self.swin_backbone.forward_features(x)
x = rearrange(x, 'b (h w) c -> b c h w', h=H, w=W)
x = self.up1(x)
x = self.up2(x)
out = self.out_seg(x)
return out
# 建筑专用损失函数(解决密集样本不均衡、小目标权重失衡)
class BuildingLoss(nn.Module):
def __init__(self):
super().__init__()
self.ce = nn.CrossEntropyLoss()
def forward(self, pred, label):
dice = 1 - torch.sum(pred * label) / (torch.sum(pred) + torch.sum(label) + 1e-6)
return 0.4 * self.ce(pred, label) + 0.6 * dice
# 模型测试推理
if __name__ == "__main__":
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 模拟512*512城市遥感影像输入
test_img = torch.randn(1, 3, 512, 512).to(device)
model = BuildingSwinUNet(in_channels=3, num_classes=2).to(device)
# 加载专属建筑预训练权重
model.load_state_dict(torch.load("./building_best.pth", map_location=device))
pred = model(test_img)
building_mask = torch.argmax(pred, dim=1)
print("✅ 城市建筑分割推理完成,掩膜输出正常")

城市密集建筑分割效果图
五、小建筑目标检测补强代码
针对城郊零散小型建筑漏检问题,采用轻量检测模型辅助补强,大幅提升全域建筑提取完整性。
python
# 小建筑目标检测补强简易脚本
import cv2
import torch
from ultralytics import YOLO
# 加载轻量小建筑检测权重
model = YOLO("./small_building_yolo.pt")
def detect_small_building(img_path, save_path):
img = cv2.imread(img_path)
results = model(img, conf=0.25)
# 绘制小建筑检测框,补强分割遗漏区域
for res in results:
boxes = res.boxes.xyxy.cpu().numpy()
for box in boxes:
x1,y1,x2,y2 = box
cv2.rectangle(img,(int(x1),int(y1)),(int(x2),int(y2)),(0,0,255),2)
cv2.imwrite(save_path,img)
print("✅ 小建筑检测补强完成")
if __name__ == "__main__":
detect_small_building("./suburb_origin.png", "./suburb_building_result.png")

城郊小建筑检测对比图
六、多时相城市建成区扩张分析代码
核心功能:读取两年/多年建筑掩膜,自动差分新增建成区、统计扩张面积、输出变化报表,是城镇化论文核心实验代码。
python
# 多时相城市建成区扩张差分+面积统计
import cv2
import numpy as np
import pandas as pd
# 单像素面积 哨兵2影像10m分辨率=100㎡/pixel
PIXEL_AREA = 100
def urban_expansion_analysis(old_mask_path, new_mask_path):
# 读取前后两期建筑掩膜
mask_old = cv2.imread(old_mask_path, 0)
mask_new = cv2.imread(new_mask_path, 0)
# 二值化处理(建筑像素=1)
mask_old_bin = np.where(mask_old==1,1,0)
mask_new_bin = np.where(mask_new==1,1,0)
# 差分计算新增建成区
expand_mask = mask_new_bin - mask_old_bin
expand_pixel = len(expand_mask[expand_mask==1])
# 面积换算
expand_m2 = expand_pixel * PIXEL_AREA
expand_km2 = expand_m2 / 1000000
# 统计新旧建成区总面积
old_area = len(mask_old_bin[mask_old_bin==1]) * PIXEL_AREA / 1000000
new_area = len(mask_new_bin[mask_new_bin==1]) * PIXEL_AREA / 1000000
res = {
"前期建成区面积(km²)":[round(old_area,4)],
"后期建成区面积(km²)":[round(new_area,4)],
"新增扩张面积(km²)":[round(expand_km2,4)],
"扩张像素总数":[expand_pixel]
}
df = pd.DataFrame(res)
df.to_excel("./城市建成区扩张统计报表.xlsx",index=False)
print("✅ 城市扩张分析完成,报表已导出")
return df
if __name__ == "__main__":
urban_expansion_analysis("./mask_2020.png", "./mask_2024.png")
七、多时相扩张可视化成果展示
通过多年份影像连续分析,可直观呈现城市扩张方向、扩张速度、扩张模式,为城市规划、城镇化演变研究提供可视化支撑。

多年城市建成区扩张对比图

城市扩张范围统计示意图
八、本期项目核心总结
-
传统分割模型无法适配城镇复杂场景,Swin-UNet全局注意力可完美解决密集建筑粘连、边界模糊问题
-
分割+检测组合方案,兼顾城区密集建筑与城郊零散小建筑,实现全域无死角提取
-
多时相差分算法可精准锁定新增建成区,定量统计扩张面积,数据精准可溯源
-
整套流程适配城市规划、国土监测、科研时序分析,可直接落地工程项目与毕设实验
📌 下期预告(第18期)
实战4:AI土地利用全覆盖分类实战,实现建筑/水体/植被/裸土多类地物全自动分类,完成完整LUCC土地覆被制图!