简介这份资源面向从事遥感图像处理、地质灾害识别与深度学习目标检测的研究生、算法工程师及科研人员提供一套可直接用于泥石流目标检测训练的标注数据集帮助解决地质灾害遥感场景下样本稀缺、标注成本高的问题。压缩包共232个文件包含116张JPEG遥感影像与116个对应的XML标注文件采用VOC2007格式组织可直接接入YOLO、Faster R-CNN等主流检测框架包体约5.53MB轻量便于快速下载与本地调试。目前已有1095人学习下载说明其在遥感地质灾害检测方向具有一定参考价值。读者可借助该数据集完成从数据加载、格式解析到模型训练与评估的完整流程理解泥石流目标在遥感影像中的形态特征与标注规范并可作为迁移学习或数据增强实验的基础样本适合作为课程设计、论文实验或算法验证的入门数据支撑。1. 遥感影像泥石流目标检测数据集从标签体系到可训练样本的落地路径泥石流灾害的遥感识别难点从来不在模型本身而在“拿什么数据喂模型”。光学遥感影像里泥石流堆积体、流通区、物源区在可见光波段上与冲洪积扇、采砂场、裸岩坡面高度相似单靠光谱特征几乎无法区分。这就是为什么做遥感图像目标检测时泥石流类数据集比通用目标检测数据集稀缺得多——标注成本高、正负样本极不均衡、季节和光照变化剧烈。一套可用的泥石流目标检测数据集核心价值在于把“灾害解译经验”固化成边界框和类别标签让 YOLO 系列、SSD、MMRotate 这类检测框架能直接消费。本文面向已经跑通过 yolov8训练自己的数据集、想切入地质灾害遥感方向的从业者讲清楚这类数据集怎么构建、怎么标注、怎么转格式、怎么避坑。如果你手头只有原始卫星影像和一堆解译报告下面这套流程可以直接抄。2. 泥石流目标检测数据集该标什么类别体系与影像源选择2.1 三类目标框的划分逻辑泥石流在遥感影像上的可检测目标通常拆成三类物源区、流通通道、堆积扇。物源区是松散固体物质的来源表现为坡面破碎带、滑坡后壁、老堆积体在真彩色影像上偏灰白或土黄纹理粗糙流通通道是泥石流运动路径呈条带状两侧常有堤岸或冲刷痕堆积扇是出口处的扇形堆积体色调偏浅、边界呈弧形。这三类在检测任务里是否合并取决于你的应用目标。如果只做灾害范围提取合并成一个“泥石流”类即可如果要做危险性评价必须分开标因为物源区面积直接关联规模预测。我一般建议初次构建数据集时先标两类泥石流堆积体和物源区。流通通道在部分影像上被植被遮挡严重标注一致性差容易引入噪声。等模型在两类上收敛稳定后再考虑加第三类。2.2 影像源与分辨率底线遥感影像下载渠道很多但用于泥石流检测的影像有几个硬约束。空间分辨率优于 2 米是底线10 米级影像上堆积扇边界模糊标注框误差会超过目标本身尺寸。常用源包括高分系列、资源系列、Sentinel-210 米仅适合大范围筛查不适合精细标注、以及公开的 Landsat 系列30 米基本不可用。如果做学术研究可以关注一些公开的灾害遥感数据集但泥石流专项数据极少多数需要自己从影像服务平台上按事件下载。时间窗口选择上泥石流发生后 1 到 3 个月的影像最理想。太早云雪覆盖严重太晚植被恢复和人工清理会改变堆积体形态。同一区域至少要有灾前和灾后两期影像灾前用于确认物源区灾后用于确认堆积范围。2.3 标注工具与格式约定目标检测常用标注工具里LabelImg 和 CVAT 用得最多。LabelImg 适合小规模单机标注输出 PASCAL VOC 的 XML 或 YOLO 的 txtCVAT 适合团队协作支持视频和图像序列。泥石流标注建议统一用 YOLO 格式因为后续训练 yolov8、yolov11 甚至 yolov26目标检测 都直接吃这种格式省去转换麻烦。标注时有三条硬规则第一边界框紧贴目标外接矩形不预留过多背景第二被云层遮挡超过 30% 的目标直接跳过不要猜第三同一目标跨两幅影像时各自独立标注不做跨图合并。这些规则写进标注手册能显著降低多人标注的不一致率。3. 从原始影像到 YOLO 格式切片、增强与标签转换3.1 大幅影像切片与重叠率设置遥感影像动辄上万像素直接送入检测网络不现实。常见做法是切片成 640×640 或 1024×1024 的小图。切片时重叠率设 20% 到 30%防止目标被切边截断。下面这段 Python 用 rasterio 和 numpy 做滑动窗口切片同时保留地理坐标偏移方便后续还原。import rasterio import numpy as np import os def slice_image(src_path, out_dir, patch_size640, overlap0.25): 将大幅遥感影像切片为 patch_size 的小图 overlap: 重叠率0.25 表示相邻切片重叠 25% os.makedirs(out_dir, exist_okTrue) with rasterio.open(src_path) as src: img src.read() # shape: (bands, H, W) H, W img.shape[1], img.shape[2] stride int(patch_size * (1 - overlap)) count 0 for y in range(0, H - patch_size 1, stride): for x in range(0, W - patch_size 1, stride): patch img[:, y:ypatch_size, x:xpatch_size] # 跳过几乎全黑或全白的无效切片 if patch.std() 5: continue out_path os.path.join(out_dir, f{os.path.basename(src_path)}_{y}_{x}.tif) with rasterio.open( out_path, w, driverGTiff, heightpatch_size, widthpatch_size, countsrc.count, dtypesrc.dtypes[0], crssrc.crs, transformrasterio.transform.from_origin( src.transform.c x * src.transform.a, src.transform.f y * src.transform.e, src.transform.a, -src.transform.e ) ) as dst: dst.write(patch) count 1 print(f切片完成共 {count} 张)逻辑说明stride 控制步长overlap 越大切片越多训练样本增加但冗余也增加。patch.std() 小于 5 的切片直接丢弃避免纯云、纯水、纯黑边进入训练集。地理坐标偏移保留在 transform 里后续可以把检测框还原到原图坐标。参数建议patch_size 用 640 时overlap 设 0.2 到 0.3用 1024 时overlap 可降到 0.15。切片数量控制在 2000 到 5000 张之间比较合适太少模型欠拟合太多标注和训练成本陡增。3.2 标签从 VOC 转 YOLO 的脚本与边界坑很多公开数据集或标注工具默认输出 PASCAL VOC 的 XML需要转成 YOLO 的 txt。转换本身不难但有几个边界坑坐标越界、宽高为零、类别名大小写不一致。下面脚本处理了这些情况。import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_dir, out_dir, class_map): class_map: {mudflow_deposit: 0, source_area: 1} os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.findall(object): name obj.find(name).text.strip() if name not in class_map: continue cls_id class_map[name] bbox obj.find(bndbox) x1 max(0, float(bbox.find(xmin).text)) y1 max(0, float(bbox.find(ymin).text)) x2 min(w, float(bbox.find(xmax).text)) y2 min(h, float(bbox.find(ymax).text)) bw x2 - x1 bh y2 - y1 if bw 1 or bh 1: continue # 跳过无效框 cx (x1 x2) / 2.0 / w cy (y1 y2) / 2.0 / h nw bw / w nh bh / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}) if lines: out_path os.path.join(out_dir, xml_file.replace(.xml, .txt)) with open(out_path, w) as f: f.write(\n.join(lines))逻辑说明x1、y1 用 max(0, ...) 截断x2、y2 用 min(w, ...) 截断防止标注框超出图像边界导致归一化坐标大于 1。bw 或 bh 小于等于 1 像素的框直接丢弃这类框在训练时会产生梯度噪声。类别名用 strip() 去空格避免“mudflow ”和“mudflow”被当成两类。参数说明class_map 必须和后续训练时的 data.yaml 里 names 顺序一致否则模型学到的类别会错位。转换完成后随机抽 20 张可视化检查确认框位置和类别无误。3.3 数据增强的边界哪些增强会破坏泥石流特征通用目标检测的增强手段里翻转、旋转、亮度调整都可以用。但有几类增强要慎用垂直翻转会改变泥石流堆积扇的朝向而堆积扇的弧形开口方向是有地质意义的大角度旋转超过 45 度会让流通通道的条带状纹理变得不自然色彩抖动幅度过大时物源区的灰白色可能被调成植被绿造成标签与视觉特征矛盾。我一般只开水平翻转、小角度旋转±15 度、亮度对比度微调±10%、以及随机裁剪。Mosaic 增强可以用但泥石流目标通常较大Mosaic 拼接后目标被缩得太小反而降低正样本质量。如果非要用把 Mosaic 概率降到 0.3 以下。4. 训练配置与评估泥石流检测的调参重点4.1 data.yaml 与 anchor 设置YOLO 系列训练自己的数据集时data.yaml 是入口。泥石流数据集通常类别少、目标大anchor 需要重新聚类。用 k-means 对标注框的宽高做聚类得到适合自己数据的 anchor 尺寸。下面是一个 data.yaml 示例。path: /data/mudflow_dataset train: images/train val: images/val test: images/test nc: 2 names: 0: mudflow_deposit 1: source_area逻辑说明path 是数据集根目录train/val/test 是相对路径。nc 是类别数names 的键值对必须和转换脚本里的 class_map 一致。如果做 yolov8训练自己的数据集这个文件直接传给 model.train(datadata.yaml) 即可。anchor 聚类可以用以下命令python -c from ultralytics import YOLO model YOLO(yolov8n.pt) model.train(datadata.yaml, epochs1, imgsz640, rectTrue) 更规范的做法是用 utils/autoanchor.py 里的 k-means 函数输入所有训练标注的宽高输出 9 组 anchor。泥石流堆积体的宽高比通常在 1:1 到 3:1 之间物源区更接近 1:1聚类时注意不要强行套用 COCO 的 anchor。4.2 学习率与正负样本平衡泥石流数据集的正样本比例通常很低一张切片里可能只有一个目标甚至没有。训练时容易出现两个极端模型把所有区域都预测成背景或者到处乱框。学习率设太大时损失震荡不收敛设太小时正样本梯度被负样本淹没。我一般用 yolov8 的默认学习率 0.01 起步如果 10 个 epoch 后 mAP 不涨降到 0.001。同时开 mosaic 和 mixup 要谨慎mixup 会把两张图线性叠加泥石流目标的边界变得模糊反而有害。正负样本平衡上可以在数据集中保留 10% 到 20% 的纯背景切片让模型学会“没有目标”的情况但不要超过 30%否则正样本被稀释太严重。4.3 评估指标怎么看mAP 之外还要看什么mAP0.5 是常规指标但泥石流检测里漏检比误检代价高得多。漏掉一个堆积体可能意味着灾害范围被低估。所以除了 mAP要单独看召回率。如果召回率低于 0.7即使 mAP 好看也不能上线。另一个指标是框的宽高比误差。泥石流堆积扇的宽高比有地质意义如果模型预测的框宽高比和真实值偏差超过 30%说明模型没学到形态特征只是碰巧框住了。可以写脚本统计验证集上预测框和真实框的宽高比分布对比两者的均值和中位数。混淆矩阵也要看。物源区和堆积体在部分影像上容易混如果混淆矩阵显示这两类互相误判超过 15%说明类别体系需要调整或者标注标准需要细化。5. 避坑与排查泥石流数据集构建中的五个血泪教训5.1 坑一切片后标签丢失现象切片脚本跑完图片有了但对应的 txt 标签文件缺失或为空。原因切片时只保存了图像没有同步裁剪标签。或者标签转换在切片之前完成切片后没有重新映射坐标。解决切片和标签裁剪必须同步做。对每张切片计算其在原图中的偏移 (x_offset, y_offset)然后把落在该切片范围内的标注框坐标减去偏移量再归一化。如果框跨越切片边界按重叠区域裁剪或直接丢弃。建议写一个联合切片函数图像和标签一起输出。5.2 坑二类别名不一致导致训练时类别数对不上现象训练启动时报错提示 nc 和实际类别数不匹配或者模型把两个类当成一个类。原因转换脚本里的 class_map 和 data.yaml 里的 names 顺序不一致或者大小写、空格不同。解决把 class_map 和 names 写在一个配置文件里两边引用同一个来源。转换完成后用脚本统计所有 txt 里出现的类别 ID确认最大值等于 nc-1且每个 ID 都有样本。5.3 坑三影像色调差异导致模型过拟合到某个区域现象模型在验证集上表现很好但换一个区域的影像测试mAP 掉 30 个点以上。原因训练集影像来自同一颗卫星或同一季节色调、对比度、阴影方向高度一致。模型学到了“这种色调就是泥石流”而不是泥石流的形态特征。解决训练集里混入不同卫星源、不同季节、不同光照条件的影像。如果做不到至少做色调增强模拟不同传感器的色彩响应。验证集必须包含至少一个训练集没出现过的区域用来检验泛化能力。5.4 坑四标注框过大或过小现象模型预测的框普遍比真实框大一圈或者只框住堆积体的一部分。原因标注时没有统一标准。有人习惯留边有人习惯紧贴。或者不同标注员对“堆积体边界”的理解不同。解决写一份标注手册用 10 张典型影像做示例明确边界定义。标注完成后随机抽 50 张让另一个人复查计算框的 IoU 一致性。如果平均 IoU 低于 0.8说明标注标准需要重新对齐。5.5 坑五验证集和训练集来自同一区域现象训练损失降得很低验证 mAP 也很高但实际部署时效果很差。原因随机划分数据集时同一区域的切片同时出现在训练集和验证集里。模型记住了这个区域的地物背景而不是泥石流本身。解决按区域划分而不是按切片随机划分。同一区域的所有切片要么全在训练集要么全在验证集。如果区域数量太少按事件划分不同泥石流事件的影像分开。这样验证集才能真正反映模型在新区域的泛化能力。6. 小目标泥石流检测的进阶技巧切图推理与框融合泥石流物源区在整幅影像里可能只占几十个像素直接缩放到 640 输入网络目标只剩几个像素检测器基本失效。常见做法是切图推理把大图切成带重叠的小图逐张检测再把检测框映射回原图坐标最后用 NMS 或 WBF 做框融合。下面这段代码用 SAHI 风格的切图推理逻辑不依赖额外库只靠 numpy 和 OpenCV 实现。import cv2 import numpy as np def sliced_inference(model, image, patch_size640, overlap0.25, conf0.25): model: 已加载的 YOLO 模型调用 model.predict 返回框 image: 原始大图BGR 格式 返回原图坐标系下的检测框列表 H, W image.shape[:2] stride int(patch_size * (1 - overlap)) all_boxes [] for y in range(0, H - patch_size 1, stride): for x in range(0, W - patch_size 1, stride): patch image[y:ypatch_size, x:xpatch_size] results model.predict(patch, confconf, verboseFalse) for box in results[0].boxes: x1, y1, x2, y2 box.xyxy[0].cpu().numpy() cls int(box.cls[0].cpu().numpy()) score float(box.conf[0].cpu().numpy()) # 映射回原图坐标 all_boxes.append([x1x, y1y, x2x, y2y, score, cls]) # 按类别分组做 NMS final_boxes [] for cls_id in set(b[5] for b in all_boxes): cls_boxes [b for b in all_boxes if b[5] cls_id] boxes_xywh [[b[0], b[1], b[2]-b[0], b[3]-b[1]] for b in cls_boxes] scores [b[4] for b in cls_boxes] indices cv2.dnn.NMSBoxes(boxes_xywh, scores, conf, 0.45) for i in indices: final_boxes.append(cls_boxes[i]) return final_boxes逻辑说明切图时保留 overlap保证跨切片的目标至少在一张切片里完整出现。每个切片的检测框加上偏移量 (x, y) 映射回原图坐标。最后按类别分组做 NMSIoU 阈值设 0.45比常规的 0.5 略低因为重叠切片的同一目标框会有轻微偏移阈值太高会保留重复框。参数说明patch_size 和训练时一致overlap 设 0.25 到 0.3。conf 阈值不要设太低泥石流检测里误检的代价虽然比漏检低但太多误检会让后处理变得困难。如果目标特别小可以把 patch_size 降到 512但训练时也要用 512保持推理和训练一致。框融合除了 NMS还可以用 WBFWeighted Boxes Fusion它对重叠框的坐标做加权平均比 NMS 更平滑。WBF 的阈值一般设 0.5 到 0.6比 NMS 宽容一些。如果发现同一目标被切成两半、分别检测出两个框WBF 能把它们合并成一个更准确的框。验证切图推理效果时不要只看 mAP。把推理结果叠加到原图上人工检查边缘区域的目标有没有被漏掉。特别是图像四角和切片边界附近这些地方最容易出问题。我自己的习惯是每次调整切图参数后固定抽 10 张有代表性的影像做可视化对比确认没有引入新的漏检。这个习惯帮我省了很多后悔药。希望帮到你。本文还有配套的精品资源点击获取