前言

在前面的专栏实战中,我们先后完成了AI水体智能提取NDVI植被覆盖度反演两大生态遥感核心项目,掌握了遥感AI解译、地物统计、时序分析的标准化落地流程。

本期正式进入城镇人工地物遥感实战,带来遥感工程、城市规划、国土测绘领域最高频的落地项目:高精度建筑物提取 + 多年城市建成区扩张动态分析

建筑物是城市遥感的核心骨架,建成区范围、建筑密度、新增建设用地规模,是衡量城镇化进程、城市扩张、国土空间变化的核心指标。

传统建筑提取手段弊端显著:传统阈值分割极易与裸土、荒地、硬化路面混淆;普通U-Net面对城区密集连片建筑易出现粘连融合,城郊小型零散建筑漏检率极高,完全无法满足精细化测绘需求。

针对城镇场景复杂特征,本期采用优化Swin-UNet精细分割+小目标检测辅助方案,适配城区密集建筑、城郊零散建筑、道路硬化干扰等复杂场景,完成单期建筑高精度提取、多时相影像变化检测、建成区范围提取、扩张面积统计、空间演变分析全链路实战。

核心落地应用场景

  • 国土动态监测:年度建设用地新增、违建占地、非农化用地核查统计

  • 城市规划研究:城区扩张方向、扩张速率、空间格局演变分析

  • 城镇化评估:长时间序列城镇建成区时空动态、城镇化质量评价

  • 科研毕设课题:城市遥感、LUCC土地利用变化、时空驱动力分析


一、城镇建筑遥感提取核心难点

相比于水体、植被,建筑物提取场景更复杂,也是新手做城市遥感最容易踩坑的地方,核心难点集中在4点:

  1. 密集建筑粘连严重:城区楼栋排布密集、间距极小,普通分割模型易整片融合,无法区分单体建筑边界

  2. 小目标漏检率高:城郊自建房、零散小屋、工地临时建筑尺寸微小,模型特征丢失严重

  3. 同谱异物干扰强:硬化路面、裸土、广场空地光谱与建筑高度相似,极易错分混入建筑范围

  4. 时序干扰复杂:不同季节、光照、影像分辨率差异,导致多时相提取结果偏差大,扩张分析失真

针对以上痛点,本期采用Transformer全局建模+局部细节强化的优化方案,兼顾全局建成区轮廓与局部建筑细节,完美适配城市复杂场景。


二、本期核心技术方案

摒弃传统单一分割模式,采用「精细分割+目标检测辅助+时序差分变化」组合方案,精度与完整性双重保障:

  1. 主干模型:优化Swin-UNet,全局注意力破解密集建筑粘连问题,精准区分楼栋边界

  2. 小目标补强:轻量YOLO辅助检测,召回城郊微小零散建筑,降低漏检率

  3. 干扰剔除:光谱纹理双重约束,过滤道路、裸土、广场硬化干扰

  4. 时序分析:多时相影像配准+差分运算,自动提取新增建成区、统计扩张面积


三、全流程实战落地链路

完整标准化流程,可直接复用至任意城市、任意年份的城镇化监测项目:

多时相遥感影像收集 → 影像配准/裁剪/预处理 → 建筑样本数据集制作 → Swin-UNet建筑精细分割 → 小建筑目标补强 → 单期建成区掩膜提取 → 多时相掩膜差分对比 → 新增扩张范围提取 → 面积统计+可视化制图+报告输出


四、AI建筑高精度分割完整代码(Swin-UNet优化版)

专为城市建筑场景优化,解决密集粘连、边界模糊、裸土错分问题,适配RGB/多光谱遥感影像,带完整训练推理逻辑。

4.1 环境依赖一键安装

pip install torch timm einops rasterio opencv-python pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

4.2 建筑分割专属模型完整代码

# -*- 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("✅ 城市建筑分割推理完成,掩膜输出正常")

🖼️配图1:
城市密集建筑分割效果图


五、小建筑目标检测补强代码

针对城郊零散小型建筑漏检问题,采用轻量检测模型辅助补强,大幅提升全域建筑提取完整性。

# 小建筑目标检测补强简易脚本
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")

🖼️配图2:
城郊小建筑检测对比图


六、多时相城市建成区扩张分析代码

核心功能:读取两年/多年建筑掩膜,自动差分新增建成区、统计扩张面积、输出变化报表,是城镇化论文核心实验代码。

# 多时相城市建成区扩张差分+面积统计
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")


七、多时相扩张可视化成果展示

通过多年份影像连续分析,可直观呈现城市扩张方向、扩张速度、扩张模式,为城市规划、城镇化演变研究提供可视化支撑。

🖼️配图3:
多年城市建成区扩张对比图

🖼️配图4:
城市扩张范围统计示意图


八、本期项目核心总结

  1. 传统分割模型无法适配城镇复杂场景,Swin-UNet全局注意力可完美解决密集建筑粘连、边界模糊问题

  2. 分割+检测组合方案,兼顾城区密集建筑与城郊零散小建筑,实现全域无死角提取

  3. 多时相差分算法可精准锁定新增建成区,定量统计扩张面积,数据精准可溯源

  4. 整套流程适配城市规划、国土监测、科研时序分析,可直接落地工程项目与毕设实验


📌 下期预告(第18期)

实战4:AI土地利用全覆盖分类实战,实现建筑/水体/植被/裸土多类地物全自动分类,完成完整LUCC土地覆被制图!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐