简介:《基于YOLOv11的卫星遥感图像道路提取与变化检测方案》PDF文档共31页,面向遥感图像处理、目标检测算法研究及工程应用开发人员,结合YOLOv11单阶段检测的高效与精度优势,系统讲解了道路提取与变化检测的完整技术路线。文档以单个PDF文件提供,压缩包大小2.12MB,支持目录章节跳转与阅读器大纲定位,内容排版完整清晰。正文从研究背景与意义入手,涵盖卫星遥感图像概述、道路提取与变化检测方法、YOLOv11网络结构与损失函数、模型训练过程,并分别给出道路提取与变化检测的方案设计,包括数据预处理、模型训练、图像配准、变化识别、结果验证与误差分析;后续还包含实验设计、结果可视化、应用场景与未来展望。目前已有90人学习,读者可依据其中的架构思路、实验流程与评估方法,快速构建自己的遥感图像检测任务,也可作为技术方案撰写与课程设计的参考。
1. 卫星遥感道路提取,为什么值得押注YOLOv11这条路
卫星影像里的道路提取和变化检测,长期是各跑各的:提取用分割网络,变化检测用差值或分类模型,两套训练、两套部署、两套维护。YOLOv11这套方案能把提取和变化检测压进同一条链路——用 YOLOv11-seg 输出两期道路掩码,再对掩码做变化比对,训练和部署工作量直接砍半。适合手头有遥感影像源、要快速出路网矢量或道路变化图、又不想在传统遥感软件里堆人工规则的从业者。先说结论:这条路能不能走通,不取决于 YOLOv11 的指标,而取决于你对分辨率、标签质量和两期影像一致性的控制。
2. YOLOv11的遥感图像适用性:从网络结构改了什么谈起
2.1 C3k2与C2PSA:YOLOv11网络结构对遥感道路图改了什么
YOLOv11 是 Ultralytics 延续 YOLOv8 架构思路推出的更新版本,整体还是 Backbone + Neck + Head 三段式。和 v8 相比,公开资料里被讨论最多的结构变化有两处:一是 Backbone 大量使用 C3k2 模块替换 v8 的 C2f,C3k2 是带可配置卷积核尺寸的跨阶段部分连接结构,在小模型(yolo11n / yolo11s)上参数量更紧;二是 Backbone 末端引入 C2PSA 模块,把金字塔压缩注意力(PSA)用 C2 结构组织起来。
这两处改动对遥感图像恰好有意义。C3k2 的局部连接让低层细节特征在传递过程中少被“冲刷”掉,而道路恰恰是整幅图里最依赖细节连续性的目标;C2PSA 的作用是在大感受野上重新分配特征权重,让网络把注意力集中在“道路是连续条带”这个结构特征上,而不是被屋顶、裸地、水体这些强纹理区域带偏。遥感大图的道路经常只有几个像素宽,纯卷积堆叠很容易把注意力散掉,加注意力之后,模型会更倾向于沿着“连续性”去找路。
Neck 和 Head 的改动相对小:Neck 沿用 PAN-FPN 结构,把高层语义与低层细节融合;Head 延续 Anchor-Free 解耦头,分类和回归分支分开。对道路这种长宽比极大的目标,Anchor-Free 天然比固定锚框更好拟合。把这几个组件放在一起看,YOLOv11 在遥感场景的定位是“通用模型里的轻量分割选手”,不是为遥感设计的专用网络,但工程链完整,训练、推理、导出、部署是一套 API。
| 组件 | YOLOv8 | YOLOv11 | 对遥感道路的影响 |
|---|---|---|---|
| Backbone 基础模块 | C2f | C3k2 | 小模型参数量更省,细长路特征保留更稳 |
| Backbone 末端 | SPPF | C2PSA | 注意力重分配,利于聚焦道路连续性 |
| Neck | PAN-FPN | PAN-FPN | 多尺度融合保持 |
| Head | Anchor-Free 解耦头 | Anchor-Free 解耦头 | 回归方式兼容细长目标 |
为什么我建议选 YOLOv11 而不是继续用传统分割框架,比如 DeepLab 或 UNet?遥感道路提取本质是“找到并画出路”,掩码负责画,检测框负责在变化检测阶段把掩码碎片归到实例上。YOLOv11-seg 一次前向同时输出检测框和掩码,比单独分割更抗噪,也比“分割之后再聚类”省一步。实际项目里,掩码经常被车辆、树冠打断成若干碎片,这时候检测框能告诉你“这一段其实属于同一条路”,后处理阶段就能按实例做修复。
2.2 分割还是检测:道路提取任务选型与双阶段变化检测链路
标题里的“道路提取”对应的是分割任务,不是检测。检测输出的是 bbox,对道路这种贯穿整幅影像的目标,bbox 不仅冗余,还容易把好几条平行道路合进一个框里。YOLOv11 同时提供 detect 和 segment 两类权重,我一般直接选 segment,也就是 yolo11?-seg 系列,一次推理拿到检测框和分割掩码,变化检测阶段按实例做比对。
整体链路是这样:T1 期影像和 T2 期影像,各自过一遍 YOLOv11-seg 推理,得到两期道路掩码;对掩码做形态学后处理,去掉孔洞和小碎片;再对两期掩码做逐像素或连通域比对,输出新增、消失、不变三类结果。这条链路的好处在于 T1 和 T2 之间没有任何共享模型,两期影像独立推理,即使来源不一致(不同传感器、不同时相、不同分辨率)也能跑,只是精度会受影响,后面避坑章节会细说。
为什么不做端到端变化检测模型?常见做法是在网络里拼接两期特征图,接一个“变化检测头”,直接输出变化区域。这类模型需要的是成对标注样本——同一位置两期影像都要人工标,标注成本在“成对”上,大多数遥感项目根本凑不出这么多数据。两阶段方案只需要一套道路标注,T1 和 T2 共用同一个模型,训练一次、复用两期,工程迭代更快。第 6 章会提到的开放词汇变化检测是另一条路线,适合没有成对标注但有文本描述能力的环境。
算一下算力账:每期影像推理一次,两期就是两次。如果做成在线服务,模型常驻显存,一张 GPU 可以轮询处理多个瓦片;如果离线批量跑,把 T1、T2 的瓦片拼进同一个 batch,省掉模型反复加载的开销。显存不够时,参考第 4 章的切片推理方案,用空间换显存。
3. yolov11环境配置与遥感道路数据集制作:跑通最小闭环
3.1 环境配置:conda + pip 与版本搭配
遥感方向一上来最容易翻车的就是环境。torch、CUDA、Ultralytics 三者版本不匹配,后面所有步骤都跑不动。我的标准配置是 Python 3.10、CUDA 11.8 运行库、torch 2.1,Ultralytics 装 8.3.x 及以上版本,因为 yolo11 权重从 8.3.x 才开始带。
conda create -n yolo11 python=3.10 -y conda activate yolo11 pip install torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu118 pip install "ultralytics>=8.3.0"torch 的下载地址里 cu118 对应 CUDA 11.8 运行库,如果你机器上装的是 CUDA 12.x,把这段改成 cu121 或 cu124 再装。装完先验证能不能正常加载权重:
python -c "from ultralytics import YOLO; YOLO('yolo11n-seg.pt')"如果能跑通,说明环境没问题。纯 CPU 机器不建议拿这份方案训遥感大图,推理倒是勉强能跑,但速度会让人怀疑人生;训练至少需要一张 8GB 显存的卡,显存不够就往下看切片方案。
3.2 标注格式与转换:把多边形路网变成YOLO能吃的标签
这一步是能不能复现的关键。遥感影像的标注通常落在 GeoJSON 里,道路是多边形(Polygon)或线(LineString),而 YOLO-seg 要求每张图对应一个同名 txt 文件,每行格式是class_id x1 y1 x2 y2 ...,坐标归一化到 0~1。直接手写这个转换脚本,不要用标注软件自带的导出,因为遥感标签动辄上万顶点,通用导出工具经常漏点。
import json from pathlib import Path def geojson_to_yolo_seg(geojson_path, img_width, img_height, out_txt): with open(geojson_path, encoding="utf-8") as f: data = json.load(f) lines = [] for feature in data["features"]: cls = 0 # 只标道路这一类 geom = feature["geometry"] if geom["type"] != "Polygon": continue # 只处理面要素,线要素先按路宽做缓冲区再转 # 取外环,内环通常是隔离带或树岛,道路提取阶段先合并 coords = geom["coordinates"][0] norm = [] for x, y in coords: nx = round(x / img_width, 6) ny = round(y / img_height, 6) # 防止顶点落在影像外导致训练报错 nx = min(1.0, max(0.0, nx)) ny = min(1.0, max(0.0, ny)) norm.append(f"{nx} {ny}") lines.append(f"{cls} " + " ".join(norm)) Path(out_txt).write_text("\n".join(lines), encoding="utf-8") print(f"已写出 {len(lines)} 个道路多边形 -> {out_txt}") # 用法示例 geojson_to_yolo_seg("roads.geojson", 8192, 8192, "roads.txt")img_width 和 img_height 必须和影像实际像素数一致,写错一格整个标签就废了。GeoJSON 里如果是经纬度坐标,不能直接拿去归一化,必须先投影到米制坐标(比如 UTM),再换算成像素坐标;经纬度直接归一化会造成不同纬度上道路宽度不一致的变形。内环是否保留取决于产物:如果最终要的是路面面要素,可以保留;如果要做矢量化入库,多数情况下取中心线做骨架,内环反而制造掩码空洞,我一般只留外环。
数据集配置用 YAML,路径建议写绝对路径:
path: /data/road_dataset train: images/train val: images/val names: 0: roadUltralytics 的相对路径经常因为当前工作目录不一致而报错,写成绝对路径是最省事的。影像格式 png / jpg / tif 都行,tif 如果是 16bit 要先转成 8bit 做归一化;多光谱影像可以先做 RGB 合成再训练。
3.3 数据增强:细长道路的Mosaic取舍与翻转策略
数据增强是遥感道路项目里最容易被当成“默认值不管”的部分,而默认值恰恰是给自然图像调的。Mosaic 增强把四张图拼在一起,对普通目标没问题,对道路这种细长连续目标就是灾难——拼接缝会把道路切断,模型学到一堆“道路本来就有断口”的错误样本。我一般把 mosaic 概率压到 0.3 附近,或者干脆关掉,同时打开 copy_paste 增强,把道路掩码完整贴到另一张图上,保证实例不被切断。
翻转增强收益明显,水平翻转和垂直翻转都开,因为遥感影像上的道路方向不固定。旋转增强只开 90 度的倍数,其他角度旋转会把细长道路拉出影像边界,还要重采样,代价大收益低。光度扰动建议打开,亮度、对比度的小幅扰动可以模拟不同季节和云雾遮挡下的成像差异,让模型对光照变化更鲁棒。
4. 小目标优化与推理结果保存:让训练和预测都出效果
4.1 输入分辨率与切片推理:小目标优化的核心参数
遥感道路在整幅影像里通常只有几个到十几个像素宽,属于典型的小目标。YOLOv11 框架里对小目标最直接的两个杠杆是输入分辨率 imgsz 和切片推理。训练时 imgsz 直接定到 1536,8GB 显存跑 yolo11n-seg 配 batch=4 到 8,16GB 显卡可以上 2048。imgsz 必须是 32 的倍数,Ultralytics 会自动向上取整。
大影像(8192x8192 这种)直接整图训练不现实,切片是标准解法:
import cv2 import numpy as np def sliding_window_crop(img, tile_size=1536, stride=1280): h, w = img.shape[:2] crops = [] for y in range(0, h - tile_size + 1, stride): for x in range(0, w - tile_size + 1, stride): crops.append(img[y:y + tile_size, x:x + tile_size]) return cropsstride 小于 tile_size,确保相邻切片有重叠,防止道路恰好落在切片边缘被切断。边缘不足 tile_size 的图像先做 pad 再切。推理时用同样的切片参数,把每片的检测框和掩码按偏移量映射回整幅图坐标,再做一次全局 NMS;重叠区重复检测到的实例靠 NMS 的 iou 阈值压掉。切片推理可以复用 open-mmlab 的 SAHI 库,能直接对接 YOLO 系列模型,但 SAHI 对 seg 任务的掩码合并支持不如检测框完善,跑 yolo11-seg 时我倾向于自己控制切片,合并逻辑更透明。
4.2 训练命令与关键超参:imgsz、batch 与 loss 取舍
训练命令直接给可复现版:
yolo segment train \ model=yolo11s-seg.pt \ data=road.yaml \ imgsz=1536 \ batch=8 \ epochs=100 \ optimizer=SGD \ lr0=0.01 \ weight_decay=0.0005 \ mosaic=0.3 \ patience=15预训练权重选 yolo11s-seg,别一上来就 yolo11x-seg,1536 输入下显存必爆。优化器选 SGD 而不是 AdamW,遥感分割数据量通常不大,AdamW 容易在小数据集上过拟合,SGD 收敛慢但泛化稳。mosaic 压到 0.3 的原因在上一章说过,细长道路经不起拼接切断。训练过程中重点盯 val/segment_mAP_0.5 而不是 box_mAP,道路提取场景下掩码质量才是交付物,检测框只是辅助。
loss 调参有点玄学。小目标丢得厉害时,常见做法是调高 box_loss_gain 或 cls_loss_gain,但 YOLOv11 的解耦头对这些增益的响应不线性,我踩过几次坑之后总结的规律是:先加大 imgsz,再看要不要动 loss。imgsz 翻倍,小目标的有效像素大约翻倍,收益远大于调 loss 权重。loss 调节只适合最终精调阶段小步试,一次动 10% 以内幅度的参数。
4.3 推理结果保存:save、save_txt、save_mask 怎么配
推理结果保存是很多人忽略的一环,训练完跑完预测发现只存了可视化图,后续变化检测没数据可用。命令行保存的完整姿势:
yolo segment predict \ model=runs/segment/train/weights/best.pt \ source=./T1_imgs \ imgsz=1536 \ save=True \ save_txt=True \ save_conf=True \ save_mask=True \ project=./infer_T1save=True 输出可视化叠加图;save_txt=True 输出 txt 检测结果,包含类别、置信度和归一化坐标;save_conf=True 在 txt 里附带置信度;save_mask=True 输出掩码图。如果后续要做变化检测,叠加图不够,掩码必须以 numpy 或 PNG 灰度形式单独留下:
from ultralytics import YOLO import numpy as np from PIL import Image model = YOLO("runs/segment/train/weights/best.pt") res = model.predict("T1_0001.png", imgsz=1536, save=True) for r in res: m = r.masks.data.cpu().numpy() # 形状为 n_instances, H, W 的 bool 数组 if len(m) > 0: merged = m.max(axis=0).astype(np.uint8) * 255 Image.fromarray(merged).save("T1_0001_mask.png")r.masks.data 是归一化到原图尺寸的掩码,多实例取 max 合并成单通道掩码。predict 默认做 letterbox 缩放,但掩码坐标已经被还原到原图尺寸,不需要手动映射。有一点提醒:推理 imgsz 如果和训练时不同,比如训练 1536 推理降到 1024 提速,掩码边缘会明显变毛糙,变化检测误报随之上升。想提速请用切片并行,不要降 imgsz。
5. 遥感道路提取避坑手册:5个血泪踩坑记录
5.1 多边形顶点太多,标签文件直接爆掉
现象:训练到一半报 “format not supported” 或 txt 读取出错,打开标签文件一看,单行几千个顶点。 原因:遥感路网矢量来自高精度测绘,一个复杂路口的多边形动辄几百上千个点。YOLO 对单实例顶点数没有硬限制,但 DataLoader 的归一化和增强过程会随顶点数增加变得异常慢,还会触发样本解析错误。 解决:转换时先对多边形做抽稀,保留道路形状的前提下把顶点压到 50 个以内:
from shapely.geometry import Polygon from shapely import simplify poly = Polygon(coords) simplified = poly.simplify(tolerance=3.0, preserve_topology=True)tolerance 按像素给,一般取 2 到 5。道路边缘是相对平滑的曲线,3 像素容差能去掉毛刺又保住弯道形状。preserve_topology=True 防止抽稀后多边形自相交。
5.2 大图缩放后路网断裂
现象:训练时把原图从 8192 缩到 1536,模型预测出的道路是一段一段的碎线,mIoU 看着还行,矢量化出来完全没法用。 原因:道路宽度在缩放后只剩 2 到 4 个像素,下采样过程中被滤波平滑掉了。分割任务对窄目标的分辨率极其敏感,这不是 loss 能解决的。 解决:不要靠缩小整图省显存,改用切片训练保持原始分辨率。如果必须缩图,至少用 cv2.INTER_CUBIC 保留边缘,避免 INTER_AREA 过度平滑。推理端可以用形态学闭运算把细小断裂接上,但这只是后处理,治标不治本。yolov11 小目标优化的讨论集中在切片和分辨率两个词上,方向就是这个,没有捷径。
5.3 分割掩码孔洞和锯齿边缘
现象:掩码在树冠遮挡、车辆停靠的位置出现孔洞,边缘呈锯齿状;变化检测时这些孔洞被误判成“道路消失”。 原因:YOLOv11-seg 的分割分支本质上是回归低分辨率原型掩码,对细小孔洞的建模能力有限,标注里又没排除遮挡区域。 解决:训练时把连续遮挡超过一定像素的区域在标签里标成非道路,不要指望模型学会脑补。后处理用闭运算加去掉小连通域,必要时做骨架化,把路面掩码退化成道路中心线再做变化检测,抗遮挡能力比重建面要素强得多。
5.4 季节差异导致变化检测大面积误报
现象:T1 春天拍摄,树木发芽遮挡严重;T2 秋天拍摄,树叶落光。同一段道路 T1 掩码断成几截,T2 完整,比对结果出现大范围“新增道路”。 原因:两期影像光照、植被、土壤湿度不同,模型在两期上的分割性能不一致,掩码直接相减就变成了伪变化。变化检测的误差不只在模型,更在两期成像条件。 解决:两阶段方案里必须加变化容忍度。比对前对两期掩码分别做形态学开运算,吞掉细小差异;再按连通域计算变化面积,小于阈值的连通域直接过滤。更稳的做法是先提取两期掩码的中心线,再比较中心线距离,距离小于道路宽度一半的视为不变。这个逻辑放在后处理,不重训模型就能把误报降一半以上。
5.5 Jetson Nano 部署慢:nano版权重与INT8导出
现象:把 yolo11s-seg 部署到 Jetson Nano 4GB 版,一张 1536x1536 的图推理十几秒,完全没法用。 原因:边缘设备算力有限,FP32 模型太大,切片推理在边缘端放大了计算量。 解决:换 yolo11n-seg,再导出 TensorRT 引擎:
yolo export model=best.pt format=engine device=0 workspace=4 half=Trueformat=engine 直接导出 TensorRT 引擎,half=True 开 FP16。INT8 需要额外校准集标定,Ultralytics 的 export 接口通过 data 参数传入校准集;直接在 Jetson 上做 INT8 校准又慢又容易崩,建议在 PC 上导好 engine 再拷贝到设备。实际项目里最有效的是把 imgsz 降到 1024 加切片推理并行,单次前向压在 200ms 内,再配合多线程流水线掩盖耗时。如果还是慢,考虑 Jetson 上只跑检测不做分割,掩码放到服务端生成——这是架构妥协,具体看产品形态。
6. 变化检测验证:开放词汇思路与三分类评估
6.1 先分割后比对 vs 开放词汇变化检测
有足够成对标注数据时,双分支变化检测模型是首选,但大多数遥感项目没有。开放词汇变化检测(open-vocabulary change detection)是最近讨论比较多的替代路线,借助 CLIP 这类图文对齐模型,用文本提示词“新建道路”“道路消失”去匹配两期影像的特征差异。好处是不需要成对像素标注,换个提示词就能查“裸地变建筑”;代价是多模态模型显存占用高、推理链路复杂,对道路这种细长几何目标的边界刻画远不如分割掩码精确。我的判断:如果要的是行政区级路网变化统计图,开放词汇路线值得试;如果要的是可矢量化、可入库的道路变化面要素,两阶段分割比对仍然更稳。
6.2 三分类混淆矩阵与变化成图
变化检测的评估不能只看整体准确率。“不变”像素通常占 90% 以上,随便预测都能有高准确率。更合理的是在“新增、消失、不变”三个类别上分别算 precision、recall 和 F1。代码上先对两期掩码做差,输出三色图:
import cv2 import numpy as np t1 = cv2.imread("T1_mask.png", 0) > 0 t2 = cv2.imread("T2_mask.png", 0) > 0 out = np.zeros((t1.shape[0], t1.shape[1], 3), dtype=np.uint8) out[t1 & t2] = (0, 180, 0) # 不变:绿色 out[(~t1) & t2] = (0, 0, 255) # 新增:红色 out[t1 & (~t2)] = (255, 0, 0) # 消失:蓝色 cv2.imwrite("change_map.png", out)三色图直接叠加到底图上供人工复核。统计变化面积时注意传感器分辨率:T1 是 2 米分辨率,T2 是 0.5 米分辨率,像素级差会被分辨率差主导,“新增”大面积假阳性。两条影像分辨率不一致时,先重采样到同一分辨率再比对;无法确认几何配准时,对变化层做 3x3 中值滤波后人工目检一遍。
做这个方向攒下的最大教训是:变化检测项目里,一半以上的时间花在数据配准和成像条件一致性上,模型只占一小半。谁先把两期影像对齐、重采样、去云影这件事想明白,谁的项目就能早落地。希望帮到你。
本文还有配套的精品资源,点击获取