山体滑坡检测数据集823张YOLO+VOC双格式实战指南
简介本资源为面向计算机视觉与遥感监测方向的目标检测数据集聚焦山体滑坡这一单一类别适合从事灾害识别、地质监测或深度学习入门实践的开发者与研究人员使用。压缩包共约2000个文件整体63.01MB包含823张jpg图片、823个VOC格式xml标注文件与825个txt标签文件分别用于图像存储、目标框标注与YOLO训练读取图片分辨率清晰标注均为矩形框landslide类别共950个标注框未做数据增强可直接用于YOLO与VOC双格式训练流程。目前已有484人学习下载可作为滑坡检测模型训练、格式转换与算法对比的现成数据基础。需要说明的是数据集仅提供准确合理的标注不对训练所得模型或权重文件的精度作任何保证使用者需自行评估效果。1. 山体滑坡检测数据集823张YOLOVOC双格式到底能跑出什么山体滑坡这类地质灾害的目标检测和常规的车辆、行人检测完全不是一个路数。滑坡区域没有固定形状边界模糊颜色和纹理跟周围裸露岩土高度相似标注时连人眼都要反复确认。我拿到「目标检测山体滑坡数据集823张YOLOVOC格式.zip」这个资源时第一反应不是数据量够不够而是这823张里有多少是真正可用的正样本、多少是负样本或重复帧。这个数据集的核心价值在于同时提供了YOLO和VOC两套标注格式意味着你不需要自己写格式转换脚本就能直接喂给YOLOv5/v8/v11系列也能用VOC格式做Faster R-CNN或SSD的对比实验。适合谁做遥感地质灾害监测的研究生、需要快速验证滑坡检测方案的算法工程师、以及想拿真实场景练手YOLO训练全流程的入门者。823张不算多但滑坡检测本身就是小样本问题关键看你怎么用增强和迁移学习把这块数据榨干。2. 先搞清楚823张的分布再决定怎么切YOLO与VOC格式的差异与选型2.1 两种格式在滑坡标注上的实际差异VOC格式用XML存绝对坐标每个目标一个object节点包含bndbox的xmin/ymin/xmax/ymax。YOLO格式用txt存归一化后的中心点坐标和宽高每行class_id cx cy w h。滑坡检测里这个差异会带来一个实际问题滑坡区域往往是大面积不规则多边形标注时VOC的矩形框容易框进大量背景转成YOLO归一化后坐标精度损失更明显。我一般会先检查VOC的XML里有没有difficult或truncated标记如果有转YOLO时这些目标要不要保留得提前决定。import xml.etree.ElementTree as ET import os def count_voc_objects(xml_dir): 统计VOC标注中滑坡目标数量和difficult标记分布 total, difficult 0, 0 for f in os.listdir(xml_dir): if not f.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, f)) for obj in tree.findall(object): total 1 diff obj.find(difficult) if diff is not None and diff.text 1: difficult 1 return total, difficult total, diff count_voc_objects(./Annotations) print(f总目标数: {total}, difficult标记: {diff}, 占比: {diff/total:.2%})这段代码跑完你就能判断如果difficult占比超过15%说明标注质量堪忧转YOLO时建议直接丢弃这些目标否则训练时loss会被这些模糊样本带偏。参数上xml_dir指向VOC的Annotations文件夹输出的是全局统计不涉及单张图片的细节。2.2 划分训练集验证集时别用随机切分823张如果按8:1:1随机切验证集只有82张滑坡目标可能只出现几十次mAP波动会非常大。我的做法是按场景来源分层如果数据集里混了不同地区、不同季节的滑坡影像先按来源分组再切分保证验证集覆盖所有场景类型。没有来源信息时至少按亮度均值做分层避免验证集全是阴天或全是晴天。# 按文件名排序后每隔10张取1张做验证集保证时间/来源连续性 ls images/*.jpg | sort | awk NR%100 val_list.txt ls images/*.jpg | sort | grep -v -f val_list.txt train_list.txt这个切分逻辑适合数据按时间序列采集的情况。如果数据是完全随机采集的还是用sklearn的train_test_split加stratify参数按目标数量分层更稳妥。注意YOLO训练时data.yaml里的val路径要指向验证集图片目录不是txt列表。2.3 格式转换的四个边界坑VOC转YOLO时坐标归一化要用图片实际宽高不是XML里size节点写的宽高——有些标注工具会写错。转换后要检查有没有坐标超出[0,1]范围的有就说明原标注框超出了图片边界。类别映射要统一滑坡数据集通常只有一类但VOC里可能写成landslide、landslide带空格、Landslide转YOLO前必须统一成同一个class_id。最后空标注图片没有滑坡目标的负样本在YOLO里对应空txt文件这些图片要不要保留我的经验是保留10%左右的负样本能降低误检率但不要超过20%。3. 用YOLOv8跑通第一个baseline从data.yaml到训练命令的完整链路3.1 环境配置与数据目录结构YOLOv8用ultralytics包Python 3.8以上PyTorch 1.8以上。滑坡数据集823张显存8G的卡用yolov8s或yolov8n就够了别一上来就上x版本小数据集容易过拟合。pip install ultralytics # 验证安装 yolo checks目录结构按YOLO官方要求组织landslide_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yamldata.yaml内容path: ./landslide_dataset train: images/train val: images/val nc: 1 names: [landslide]nc是类别数滑坡检测通常就是1类。names列表里的名字要和标注时的class_id对应YOLO格式里class_id从0开始。3.2 训练命令与关键参数设置yolo detect train \ data./landslide_dataset/data.yaml \ modelyolov8s.pt \ epochs200 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience30 \ augmentTrue \ mosaic1.0 \ mixup0.1 \ degrees10.0 \ translate0.1 \ scale0.5 \ fliplr0.5 \ namelandslide_baselineepochs200配合patience3030轮验证mAP不提升就早停。lr00.01是初始学习率小数据集可以降到0.005。mosaic1.0开启马赛克增强对滑坡这种背景单一的数据集很关键能显著提升泛化。mixup0.1轻度混合再高会模糊滑坡边界。degrees10.0旋转增强滑坡方向不固定适度旋转合理。scale0.5缩放增强模拟不同拍摄高度。fliplr0.5水平翻转滑坡左右对称性一般0.5够用。3.3 训练过程监控与指标解读训练时重点看box_loss和mAP50。滑坡检测的box_loss下降通常比常规目标慢因为边界模糊。如果box_loss震荡不降先检查标注框是否一致——同一张图里相似滑坡区域的框大小差异过大模型学不稳。mAP50到0.6以上算及格0.75以上说明数据质量和增强策略到位了。验证集mAP比训练集低超过0.2过拟合了减少epochs或加大增强。from ultralytics import YOLO model YOLO(runs/detect/landslide_baseline/weights/best.pt) metrics model.val(data./landslide_dataset/data.yaml, splitval) print(fmAP50: {metrics.box.map50:.4f}) print(fmAP50-95: {metrics.box.map:.4f}) print(f单张推理耗时: {metrics.speed[inference]:.2f}ms)metrics.box.map50是IoU0.5时的平均精度滑坡检测主要看这个。map是IoU从0.5到0.95的平均滑坡边界模糊这个值通常偏低不用太纠结。speed里的inference时间帮你判断能不能上边缘设备。4. 小样本滑坡检测的避坑与排查823张最容易翻车的五个地方4.1 验证集mAP高但实际推理全是误检现象验证集mAP50到0.8拿真实滑坡视频抽帧推理满屏都是框。原因验证集和训练集来自同一批影像背景分布一致模型学到了「这种色调的裸露岩土就是滑坡」的捷径。解决从验证集里挑出模型置信度最高的几张图看框的位置是否真的覆盖滑坡主体如果框在裸岩或云层上说明特征学偏了。重新划分验证集确保验证集里有不同光照、不同植被覆盖的滑坡样本。4.2 训练到50轮后loss突然变NaN现象前50轮正常第51轮box_loss变成nan。原因滑坡标注里有坐标超出图片边界的框归一化后出现负值或大于1的值梯度爆炸。解决训练前跑一遍坐标校验脚本把超出[0,1]的框裁剪到边界内或直接丢弃该目标。YOLOv8默认会做坐标裁剪但某些版本对极端值处理不完善。import os def validate_yolo_labels(label_dir, img_dir): 检查YOLO标注坐标是否在[0,1]范围内 bad_files [] for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fh: for line in fh: parts line.strip().split() if len(parts) ! 5: bad_files.append((f, 字段数不对)) continue cx, cy, w, h map(float, parts[1:]) if not all(0 v 1 for v in [cx, cy, w, h]): bad_files.append((f, f坐标越界: {cx},{cy},{w},{h})) return bad_files bad validate_yolo_labels(./labels/train, ./images/train) for b in bad[:10]: print(b)4.3 增强开太猛导致滑坡特征被破坏现象训练mAP一直上不去验证mAP更低。原因mosaic1.0加mixup0.5再加rotation30滑坡区域被拼接到完全不相关的背景上模型学不到真实滑坡的纹理。解决滑坡检测的增强要克制。mosaic保持1.0但关闭最后10轮的mosaicYOLOv8有close_mosaic参数mixup不超过0.2旋转不超过15度。颜色增强hsv_h/s/v可以开但饱和度增强别超过0.5否则滑坡的土黄色调会失真。4.4 类别不平衡导致漏检严重现象mAP50有0.7但recall只有0.4大量滑坡漏检。原因823张里有些图片滑坡区域极小几十个像素有些极大占半张图模型偏向学大目标。解决开启YOLOv8的copy_paste增强需要分割标注纯检测框用不了或者手动过采样小目标图片。更直接的办法是调整box损失权重YOLOv8默认box7.5可以提到10.0让模型更关注定位精度。4.5 推理时置信度阈值怎么定现象默认conf0.25推理结果要么漏要么误。原因滑坡检测的置信度分布和COCO完全不同0.25对滑坡可能太低。解决在验证集上跑一遍不同conf阈值下的F1曲线选F1最高的点。我一般从0.4开始试滑坡检测的conf通常在0.4-0.6之间。iou阈值用0.5-0.6滑坡框重叠多NMS的iou设太低会合并相邻滑坡。from ultralytics import YOLO import numpy as np model YOLO(best.pt) # 在验证集上扫描conf阈值 for conf in np.arange(0.1, 0.9, 0.1): metrics model.val(datadata.yaml, confconf, iou0.5) print(fconf{conf:.1f}, precision{metrics.box.mp:.3f}, recall{metrics.box.mr:.3f}, f1{2*metrics.box.mp*metrics.box.mr/(metrics.box.mpmetrics.box.mr1e-6):.3f})5. 把823张用到极致迁移学习策略与推理加速的一个具体技巧823张做滑坡检测如果从COCO预训练权重开始微调前20轮基本在学「什么是目标框」后180轮才学「什么是滑坡」。我的做法是分两阶段第一阶段冻结backbone只训head用freeze10冻结前10层学习率设0.001跑30轮让head先适应滑坡特征。第二阶段解冻全部学习率降到0.0005跑150轮。这样比直接端到端训练收敛快最终mAP通常高3-5个点。# 第一阶段冻结backbone yolo detect train datadata.yaml modelyolov8s.pt freeze10 lr00.001 epochs30 namestage1 # 第二阶段全量微调 yolo detect train datadata.yaml modelruns/detect/stage1/weights/best.pt lr00.0005 epochs150 namestage2推理加速方面滑坡检测往往要部署到无人机或边缘设备TensorRT是绕不开的。YOLOv8导出ONNX再转TensorRTFP16精度下640分辨率T4显卡能跑到200FPS以上Jetson Xavier NX大概30-40FPS。导出时注意dynamic参数滑坡检测输入尺寸固定640的话设dynamicFalseTensorRT能更好地优化。# 导出ONNX yolo export modelbest.pt formatonnx imgsz640 dynamicFalse simplifyTrue # 导出TensorRT需要TensorRT环境 yolo export modelbest.pt formatengine imgsz640 halfTrue device0simplifyTrue会调用onnx-simplifier优化计算图减少冗余算子。halfTrue用FP16精度滑坡检测对精度损失不敏感FP16完全够用。导出后拿几张验证集图片跑一下对比PyTorch和TensorRT的输出框IoU差异超过0.05说明导出有问题检查是否有不支持的自定义算子。最后说个血泪教训别在823张上反复调参超过一周。小数据集的mAP波动很大同一组参数跑两次可能差3个点。定好一个合理的baseline把精力花在数据清洗和增强策略上比调学习率有用得多。我一般会留出20张完全没参与训练的图片做最终测试只有这20张的指标才信。希望帮到你。本文还有配套的精品资源点击获取