ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv11跨域迁移学习:卫星建筑提取与变化检测实践

YOLOv11跨域迁移学习:卫星建筑提取与变化检测实践 简介这份PDF是一份关于跨域迁移学习与YOLOv11在卫星遥感图像中建筑物提取和变化检测的系统性技术资料全书共38页面向遥感图像处理、计算机视觉目标检测方向的初学者与研究者。内容从研究背景与现状出发依次讲解迁移学习基础、YOLOv11的网络结构与检测机制、卫星遥感图像的数据预处理与特征提取并结合实际流程给出建筑物提取与变化检测的实现方案突出单阶段检测算法在速度与精度上的优势章节组织清晰支持目录跳转和左侧大纲快速定位适合边读边查。资源包仅含1个PDF文件压缩包大小1.95MB排版完整、图表文字均正常携带方便可配合YOLO系列资料一起学习。目前已有78人浏览学习对想了解跨域迁移学习如何降低遥感目标检测成本、提升小目标识别精度的读者具有较高的参考价值。1. 从「换个城市模型就废了」说起YOLOv11 与卫星建筑提取的第一道坎同一个 YOLOv11 权重在 A 城能画出完整的建筑轮廓换到 B 城直接漏掉两三成这不是玄学而是卫星遥感里最常见的「域偏移」domain shift。卫星影像的偏移来自分辨率、波段、屋顶材质、阴影方向甚至季节光照你在纽约标注训练出的模型拿到东京或者国内二线城市精度崩得远比想象快。标题里的跨域迁移学习就是解决这道坎的——把已经有标注的源域比如某城市的高分影像上训练好的 YOLOv11 检测能力迁移到只有少量标注或没有标注的新目标域建筑物提取负责把每栋房子框出来变化检测再比较两期影像输出新增、拆除和未变三类结果。适合手里有高分影像但标注预算只够几百张图、又不想从零训练检测器的遥感算法工程师。2. YOLOv11 凭什么接手遥感建筑提取网络结构、域偏移与迁移三层次2.1 先看懂 YOLOv11 的网络结构C3k2、PAN-FPN 与 Anchor-Free工程上选模型我一般先看 backbone 和 neck这两段决定特征表达head 只是最终映射。YOLOv11 把上一代用的 C2f 换成了 C3k2核心是用两个 3×3 卷积拆成的 Bottleneck 分支替代原来的堆叠方式再通过拼接做特征复用。整体还是 CSP 的思路但计算量更小、梯度路径更干净这对需要在遥感大图上反复推理的场景很友好。neck 沿用了 PAN-FPN 结构浅层细节和深层语义来回融合这对建筑这种“纹理清楚但尺度差异大”的目标是有利的。head 是 Anchor-Free 的解耦检测头直接输出中心点加宽高省掉了 Anchor 调参。对遥感建筑提取来说Anchor-Free 比 Anchor-Based 稳。卫星图里的建筑宽高比差异很大低密度别墅区是细长条城中村是密集小方块Anchor 预设尺寸很难覆盖两端而 Anchor-Free 让网络自己回归宽高反而省心。YOLOv11 官方把命名简化成了 YOLO11权重文件是 yolo11n.pt 这种写法但本文按标题继续叫 YOLOv11。值得说明的是网络结构本身不是遥感建筑检测的全部。很多针对遥感的改进版本里会拼上各类注意力模块比如 HCANet 这类跨层连接设计思路都是让网络更关注小目标和密集目标。我的建议是先把跨域迁移这条主链路跑通再谈加模块否则改进和迁移两个变量混在一起出了问题很难定位。2.2 跨域迁移学习的三个层次微调、辐射归一化与伪标签跨域迁移在卫星建筑提取里按落地难度从低到高可以拆成三个层次。第一层是常规微调。拿 COCO 上预训练的 yolo11s.pt 直接在你的目标域数据上继续训练。COCO 里虽然大多是自然影像但 backbone 学到的边缘、角点、纹理基底是通用的微调后通常比随机初始化高一大截。这是最基础也最稳的迁移方式适合目标域有几千张标注图的情况。第二层是输入域对齐也叫辐射归一化。卫星影像常见的是 16 位深度的多波段数据而预训练模型是在 8 位 RGB 自然图上训的。如果不做转换模型看到的像素分布完全不同微调效果会大打折扣。常见做法是把 16 位影像线性拉伸到 0-255再做直方图匹配让目标域的色调分布尽量贴近源域的统计特性。这一步成本几乎为零却常常能带来几个点的 mAP 提升。第三层是伪标签与自训练。目标域只有几百张标注时先用这些数据训练一个初版模型对无标注的目标域影像做推理把置信度高于阈值的框当作伪标签加进训练集迭代两三轮。这个操作要非常小心置信度阈值设太低会把大量误检当作真值一般取 0.7 以上且只保留背景简单的切片。更稳妥的做法是把伪标签框再做一次类别平衡避免模型在迭代中越来越“自信”把噪声也巩固下来。2.3 和开放词汇变化检测的边界什么时候不要上 CLIP最近遥感圈子里“开放词汇变化检测”讨论很多这类方案用图文对齐模型去识别任意类别的变化理论上是更通用的路线。但标题场景是固定的建筑物提取加二分类变化检测属于封闭词汇任务。封闭任务上用 YOLOv11 加迁移学习推理速度快、结果可解释性强、工程依赖少一个 GPU 就能跑完整套流程没必要为“先进性”引入文本编码分支。只有当你需要同时检测建筑、道路、水体、农田等多类目标且类别列表会频繁调整时开放词汇路线才值得考虑。换句话说类别固定、计算资源有限就老实走 YOLO类别开放的探索性任务再去碰开放词汇变化检测。3. 把 16 位大 TIFF 做成 YOLOv11 数据集滑窗切片、掩码转框与增强3.1 滑窗切片与正样本筛选stride 直接决定召回率卫星建筑物提取遇到的第一道坎不是模型而是数据形态。一张高分影像常常是 12800×12800 像素的 16 位 TIFF直接缩放到 640×640 输入网络8 像素宽的小房子在缩放后直接消失更别提单张图放不进显存。常规做法是滑窗切片但在切片前先把影像拉到统一的米/像素分辨率比如 0.5m/px再按固定像素尺寸切。不同分辨率的影像直接混训模型会把“房子多大”学成一个混乱的分布。我给的建议是切片尺寸取 1024×1024stride 取 512也就是重叠一半。重叠是为了保证跨在切片边缘的建筑至少有一个完整版本落入某一张片子里。如果目标框经常被切破stride 可以再降到 size 的三分之一代价是训练数据量和推理时间同步上涨。import numpy as np SIZE, STRIDE 1024, 512 MIN_AREA_RATIO 0.001 # 建筑像素占比阈值 for row in range(0, img_h - SIZE 1, STRIDE): for col in range(0, img_w - SIZE 1, STRIDE): crop img_norm[row:rowSIZE, col:colSIZE] mask_crop building_mask[row:rowSIZE, col:colSIZE] # 纯背景切片直接丢弃避免数据失衡 if mask_crop.sum() / (SIZE * SIZE) MIN_AREA_RATIO: continue # 保存切片路径与对应的地理坐标偏移推理阶段要用 np.savez(fcrop_{row}_{col}.npz, imgcrop, maskmask_crop, rowrow, colcol)这段代码里 MIN_AREA_RATIO 是关键参数。设 0.001 意味着 1024×1024 的切片里至少要有一百平方米级别的建筑像素过滤掉大量纯农田和纯水体切片。对城中村这种密集场景阈值可以放宽到 0.005对别墅区则要降回 0.0005否则正样本切得太碎。另一个容易被忽略的细节保存切片时一定要把它在原大图中的 row 和 col 坐标一起存下来推理阶段拼回完整地图时靠它定位否则你得到一堆散片却拼不回地理坐标。3.2 分割掩码转 YOLO 格式归一化坐标与最小外接矩形卫星建筑数据集的原始标注大量来自两个途径一是已有语义分割掩码比如从公开数据集或政府矢量化成果里来二是人工用 LabelMe 类工具画的矩形。后者可以直接转 YOLO 格式前者需要把连通域转成框。这一步看起来简单坑却不少一个建筑掩码可能因为噪声断成几个碎片直接一个连通域一个框就会把同一个房子拆成三四个小框反过来相邻两栋楼掩码黏连在一起又会被并成一个巨大的框。from skimage.measure import label, regionprops # 二值掩码 - 归一化 YOLO txt lab label(mask) with open(labels.txt, w) as f: for prop in regionprops(lab): if prop.area 30: # 过小连通域多为标注噪声 continue y1, x1, y2, x2 prop.bbox cx ((x1 x2) / 2) / img_w cy ((y1 y2) / 2) / img_h bw (x2 - x1) / img_w bh (y2 - y1) / img_h f.write(f0 {cx:.4f} {cy:.4f} {bw:.4f} {bh:.4f}\n)转框之后建议做一次可视化检查把生成的框画到切片上人眼过一遍。掩码转框常见的坑是细长型建筑烟囱、冷却塔、长条仓库的水平框里包含大量背景训练时模型被迫学习“框里有非建筑”的矛盾。真要处理这些细长目标工作量会转向旋转框检测但标题的场景里水平框配合后处理已经能覆盖大多数需求。如果项目有高精度面积统计需求我会用两阶段方案YOLO 先出候选框第二阶段用一个轻量分割头在框内做精修而不是逼着水平框去逼近旋转目标。3.3 遥感数据增强从翻转旋转到“魔鬼面具”式贴图卫星影像是正射视角没有地平线概念所以旋转增强可以放开做。90 度、180 度、270 度旋转和水平翻转都不会产生语义问题连续旋转degrees90也合法这比自然影像的增强空间大得多。基础组合我一般开翻转到 0.5、上下翻转 0.5、旋转 90 度、亮度对比度在 0.3 附近小幅扰动。裁剪缩放要控制 scale 在 0.5-1.5 之间缩放太猛会把 8 像素的小房子缩成 3 像素模型学到的全是模糊斑点。用 ultralytics 训练时这些增强直接作为训练参数传入不需要改代码from ultralytics import YOLO model YOLO(yolo11s.pt) model.train( dataroof.yaml, epochs120, imgsz1024, batch16, degrees90.0, # 正射视角满旋转合法 flipud0.5, # 上下翻转 scale0.5, # 缩放扰动范围 mosaic0.8, copy_paste0.5, # 建筑块随机复制粘贴 close_mosaic10, # 后 10 轮关闭 mosaic稳定指标 )copy_paste 参数对应一种“魔鬼面具”式的增强思路把一张切片里的建筑掩码连同像素抠出来随机贴到另一张切片上。这能成倍扩充建筑样本的上下文多样性让模型不再把目标域里某个城市的特定道路材质当作建筑上下文特征。但直接硬贴会产生生硬的边缘和光谱异常模型可能学会识别“贴图接缝”而不是“建筑本体”。解决方法是贴图后对粘贴区域做随机亮度扰动和 2-3 像素高斯模糊或者只做 mask 级的 CopyPaste。遥感场景里 mosaic 建议控制在 0.6-0.8不要拉满mosaic 会让建筑目标缩到原尺寸四分之一反而不利于小目标学习。4. 跨域迁移训练与变化检测操作能抄的参数、冻结策略与配对算法4.1 从 COCO 到卫星域预训练权重怎么选冻结解冻怎么做YOLOv11 的预训练权重有 n/s/m/l/x 五档。卫星建筑提取不是大量类别任务单类别检测用 s 足够精度不够再升 m不必一上来就追大模型。n 档适合 Jetson 这类边缘设备但精度确实要打折扣。我的组合习惯是研究阶段用 s部署阶段重新训练或蒸馏到 n 档。目标域标注量决定冻结策略。标注超过 5000 张切片时不冻结、全局小学习率微调即可只有几百张时先冻结 backbone 训练 30 个 epoch等检测头把目标域的基础分布稳住再解冻全模型低学习率微调。ultralytics 的 freeze 参数既填层数也支持直接给 backbone 关键字。from ultralytics import YOLO # 目标域数据少冻结 backbone先让 head 适应新域 model YOLO(yolo11s.pt) model.train( dataroof.yaml, epochs100, imgsz1024, batch16, freezebackbone, # 冻结主干网络 lr00.003, # 冻结阶段学习率再降一半 weight_decay0.0005, )第一阶段跑完后再用同一套数据解冻全模型跑 30-50 个 epoch学习率放回 0.005 或更低。两阶段训练比一开始就全量微调在标注量少的目标域上通常能高出 3-5 个点。注意观察 backbone 冻结阶段验证集的 loss如果一直不降说明检测头学习率太高或数据本身有问题先调数据再继续别硬跑。4.2 训练参数imgsz 是遥感任务的胜负手小目标优化要点遥感建筑训练里影响精度最大的参数不是学习率而是 imgsz。建筑目标在 0.5m/px 分辨率下大约 8-64 像素imgsz640 会把大部分小建筑压没imgsz1024 或 1280 才够。显存紧张时可以保持 1024 分块训练、1280 推理这属于训练推理尺度不一致的妥协方案但验证指标会略低于同尺度组合。小目标优化还有几个非常规手段值得一提。一是对含小目标的切片做在线复制增强把 8-16 像素的小建筑在图中复制 3-5 份相当于变相提高小目标采样率。二是关闭 mosaic 的最后时段要留足mosaic 会把目标缩小最后 15-20 轮关闭让模型回归真实尺度分布。三是损失函数层面降低对框中心点偏移的惩罚权重对小目标更友好不过 ultralytics 默认参数没有对外开放这个旋钮需要改源码不是首选。参数推荐值说明imgsz1024 / 12800.5m/px 影像用 1024 起步batch显存允许下尽量大16 起步A100 可上 64lr00.005 / 0.003冻结阶段取下限mosaic0.6-0.8过高导致小目标退化close_mosaic10-20后 N 轮自动关闭copy_paste0.3-0.5建筑贴图增强这批参数按 8 张 A100 或单张 24G 显存的环境经验写的小显存环境先降 batch再把 imgsz 降到 768 试跑一轮指标退化超过 2 个点再想其他办法。遥感训练里的“显存不够”多数发生在 batch 和 imgsz 同时拉高的组合上优先保 imgsz。4.3 双时相变化检测框级配对算法与置信度差分建筑物变化检测的核心不是训练一个新模型而是对两期影像分别用同一个 YOLOv11 模型推理再做框级匹配。匹配逻辑T1 有框、T2 对应位置没有框判为拆除T1 没有、T2 有判为新增两期都有且空间重合度高判为未变。这里最关键的参数是匹配的 IOU 阈值。由于两次推理存在检测器自身的抖动同一栋建筑两次框出来的位置可能有几十像素偏差IOU 阈值取 0.35-0.5 比较好。阈值太高会把同一栋楼误判成新增太低又会把旁边的两栋楼合并。另一个很有用的信号是置信度差分建筑被树木遮挡、阴影变化会导致同一目标的置信度在两期差异很大把置信度差值叠加到变化判定里能压掉不少“伪变化”。def match_boxes(boxes_t1, boxes_t2, iou_thr0.35): 框级配对返回新增、拆除、未变三组结果 used [False] * len(boxes_t2) added, removed, unchanged [], [], [] for b1 in boxes_t1: best_j, best_iou -1, 0 for j, b2 in enumerate(boxes_t2): if used[j]: continue v box_iou(b1, b2) # 计算两个框的 IoU if v best_iou: best_iou, best_j v, j if best_j 0 and best_iou iou_thr: unchanged.append((b1, boxes_t2[best_j])) # 两期都有未变 used[best_j] True else: removed.append(b1) # T1 有T2 无 - 拆除 for j, b2 in enumerate(boxes_t2): if not used[j]: added.append(b2) # T2 新增建筑 return added, removed, unchanged这段代码的问题是要先做 NMS 去重否则同一栋建筑被相邻两个框重复匹配变化结果会成对翻车。实际工程里我还会加一步约束只保留置信度都大于 0.3 的框参与匹配低置信度框统一丢进“不确定”集合避免把检测器的噪声直接变成变化结果。后处理上对判定为新增或拆除的框做形态学膨胀一次再统计面积面积小于阈值的剔除应对小噪点引起的虚警。4.4 保存推理结果从带框图片到 GeoJSON、TXT 与可视化“yolov11 保存推理结果”在遥感任务里比在自然影像里更讲究——你需要的不是一张画了框的 JPG而是能进入 GIS 系统的矢量结果。ultralytics 的 predict 直接集成了多种保存方式results model.predict( sourcet2_crop_1024.png, # 单张切片 conf0.25, iou0.45, saveTrue, # 保存带框可视化图片 save_txtTrue, # 每张图一个 txtYOLO 格式坐标 save_confTrue, # txt 末尾追加置信度 projectruns/change, namet2_infer, )saveTrue 把结果图写到 runs/change/t2_infer 目录save_txt 输出归一化坐标save_conf 让 txt 每行变成 class cx cy w h conf 五个值。但要注意predict 的 source 若直接给一张 12800×12800 的大 TIFFultralytics 会在内部切成小块推理后再拼回这个内部分块不包含你对 0.5m/px 严格分辨率的前提坐标也和原图的地理参考对齐困难。所以我强烈建议在大图上自己做滑窗推理把每块结果里的绝对坐标换算回整幅图坐标最后再汇总。输出 GeoJSON 时用切片保存的 row、col 偏移量配合影像自带的地理仿射参数把像素坐标转成经纬度这样成果才能被 ArcGIS 或 QGIS 直接打开。只保存可视化 PNG 而不保存矢量的项目到后期验收时基本都要返工。5. 卫星建筑检测五个高频大坑现象、原因与排障路径5.1 训练指标很好上真实影像却全线崩盘现象验证集 mAP 达到 0.7 以上但用模型预测一张新的城市大图漏检率肉眼可见地高。原因往往不是模型而是训练与推理的数据形态不一致训练切片是 1024×1024 且有 50% 重叠推理时图省事直接整图缩放或训练用的 0.5m/px 影像和推理用的 1m/px 数据混在了一起。解决训练和推理锁定同一分辨率和同一波段顺序。把所有影像统一重采样到目标分辨率训练切片与推理切片的尺寸、重叠率完全一致。这个坑最气人的地方是它不报错loss 正常、指标正常只有看真实推理结果才发现问题。5.2 切片边缘建筑被截断拼接处疯狂漏检现象检测结果在每张切片的边缘位置出现规律性漏检拼回大图后建筑缺失点在网格状位置聚集。原因滑窗切片的 stride 太大建筑跨在切片边界被切掉一半NMS 之后置信度不足被滤掉。解决stride 降到 size 的一半以上条件允许时用三次方重叠切块推理时对重叠区域的重复框做加权合并。工程上我习惯用 SAHI 式的切片推理工具链它内部会做重叠切片和结果合并不用自己重复造轮子。合并阶段对同一目标的多个结果框保留置信度最高者而不是简单平均平均会让一个高置信度真值和两个低置信度伪框互相污染。5.3 copy-paste 增强一开始有效换季节就失效现象在夏季影像上训练的模型加入 copy-paste 增强后指标涨了一截但对冬季影像推理时误检爆炸。原因贴图增强只复制了建筑像素没复制对应的光照和季节环境模型学到“这张图的绿色植被纹理里出现的建筑块”这种伪相关。解决贴图区域在粘贴后做光照扰动和全局色调扰动把同一建筑块用不同亮度、对比度、色温各贴几份。更进一步的做法是把贴图源从训练集扩展到外部素材库让建筑块的纹理多样性超过目标域本身的分布而不是在同一个分布里来回复制。这个坑的本质是增强不能只增数量不增多样性。5.4 变化检测虚警横飞两期影像根本没有严格对齐现象T1 和 T2 的影像来自不同传感器或不同季节变化检测输出几百个“新增建筑”实地核查大部分是虚警。原因两期影像之间除了建筑变化还有配准误差、光照差异、阴影方向差异。一个 0.3 像素的配准误差在建筑边缘就产生大幅框偏差被框级配对算法误判为拆除或新增。解决变化检测前先做影像配准把两期影像按地理坐标精确重采样到同一网格再对两期影像分别做直方图匹配把光照差异抹平最后置信度阈值分别标定不要用同一个 conf。配准误差超过一个像素时任何变化检测算法都会输出大量虚警这不是模型能解决的问题。5.5 小目标 mAP 持续为 0训练 loss 出现 NaN现象训练两轮后 loss 直接变成 NaN 且不复原或者小目标 AP 始终是 0大目标正常。两个现象分开看。出现 NaN先查影像是否直接以 16 位深度送入网络值域过大导致梯度爆炸把数据归一化到 0-255再把混合精度关闭试试。小目标 AP 为 0 则多半是切片尺寸或增强配置的问题imgsz640 时很多建筑只有 4-6 像素网络特征图下采样 32 倍后小目标连一个特征点都占不满。解决imgsz 提到 1024对小目标切片做复制增强并确认 mosaic 开启时没有被缩放过狠。查这个坑时先看一张训练数据可视化确认切片里的目标尺寸分布不要只盯训练曲线。6. 把训练好的 YOLOv11 部署到 Jetson Nano 上TensorRT 导出与切片推理卫星建筑检测落到边缘设备上最典型的硬件是 Jetson Nano 这类低功耗板卡。很多遥感团队会在现场服务器上跑不完的情况下把推理交给边缘设备。这里的关键不是训练而是把 PyTorch 权重压缩成能在 Nano 上跑得动的引擎。环境配置上Nano 的 JetPack 版本和 ultralytics 版本要匹配我踩过最深的坑是 PyTorch 版本与 TensorRT 版本不一致导致导出后推理结果全为 0却不报错。# 在已装好 JetPack 和对应 PyTorch 的 Nano 上执行 pip install ultralytics tensorrt # 导出 TensorRT engineFP16 足够INT8 量化容易掉点 yolo export modelyolo11n.pt formatengine device0 halfTrue导出完成后遥感大图不能在 Nano 上整图推理。我的做法是把大图切成 1024×1024、重叠 128px 的切片按 batch4 逐批送入 engine所有结果收集回来再做一次跨切片的全局 NMS。这一步的要点是重叠区域不要简单丢弃重叠 128px 的情况下同一建筑最多出现在 4 个切片里全局 NMS 的 IOU 阈值取 0.5 可以很好地把重复框消掉。Nano 上 FP16 的 yolo11n 跑 1024×1024 切片大约需要 1-2 秒一个 12800×12800 的大图切成约 200 张切片总耗时能压在十分钟内这在现场作业场景是可以接受的。最后养成一个习惯把切片、推理、全局 NMS、地理坐标回写这四步封装成固定脚本输入是大 TIFF 和模型路径输出是 GeoJSON 和可视化 PNG。参数写死成统一配置不要每次临时改来改去否则很难比对两次工程的差异。我这个习惯救过很多次返工希望帮到你。本文还有配套的精品资源点击获取
返回列表