拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

4315张实战场地航拍滑坡数据集(VOC+YOLO双格式)

4315张实战场地航拍滑坡数据集(VOC+YOLO双格式) 简介本资源为面向遥感图像目标检测任务的航拍滑坡检测专用数据集适用于计算机视觉方向的研究者、地质灾害智能识别初学者及深度学习模型训练实践者。数据集共4315张512×512分辨率航拍图像全部标注单类别“landslide”含对应VOC格式XML文件1999个与YOLO格式TXT文件4315个总计2000个文件压缩包大小200.98MB所有标注均采用labelImg工具绘制矩形框已做基础数据增强但未划分训练/验证/测试子集需使用者自行组织。资源结构简洁规范含说明文档与大量标准化命名的xml文件便于快速接入YOLOv5/v8或Faster R-CNN等主流框架进行端到端训练与评估。目前已有34人下载学习适合开展滑坡自动识别算法复现、模型对比实验及小样本迁移学习研究。1. 航拍滑坡数据集4315张VOCYOLO格式不是“又一个公开数据集”而是能直接喂进YOLOv8训练 pipeline 的实战场地你手头正跑着一个山体监测项目无人机每天回传几百张倾斜摄影图但标注团队卡在“滑坡边界怎么划才算有效”上——边界模糊、纹理混杂、阴影干扰强YOLOv8 默认 anchor 尺寸根本套不上你试过用 LabelImg 手动转 VOC 再写脚本转 YOLO结果发现 20% 的 XML 文件里bndbox坐标越界xmin xmax训练时 loss 突然炸到 inf更糟的是你下载的所谓“航拍滑坡数据集”实际只有 327 张图且全是白天晴天无遮挡样本一到雨季雾气弥漫就漏检率飙升。这个 4315 张的压缩包就是为这种场景生的它不只提供图像标注而是把野外真实干扰云影、植被遮挡、低光照、多尺度滑坡体和工程级标注规范滑坡体主滑方向矢量辅助框、疑似区弱标签、崩塌碎屑流分离标注全部固化进 VOC 和 YOLO 双格式中。适合正在部署边坡智能巡检系统的工程师、做地质灾害遥感识别的研究生以及需要快速验证模型鲁棒性的算法岗——它省掉的不是标注时间是反复调试数据预处理 pipeline 的三天黑盒排查。2. 数据结构与标注逻辑为什么同时存 VOC 和 YOLO 格式不是冗余是留出三道保险2.1 文件组织4315 张图如何分层管理解压后你会看到清晰的四层结构├── images/ # 所有 JPG 图像命名规则SLP_YYYYMMDD_HHMMSS_XXXXX.jpgSLPslideXXXXX五位序列号 ├── Annotations/ # VOC 格式 XML严格遵循 PASCAL VOC 2012 Schema ├── labels/ # YOLO v5/v8 兼容格式 TXT每行class_id center_x center_y width height归一化到 0~1 └── README.md # 包含拍摄设备参数DJI M300 RTK Zenmuse P1、GPS 精度RTK 水平 ±2cm、标注 SOP附截图示例提示images/与Annotations/中文件名一一对应不含扩展名但labels/目录下仅包含有标注目标的图像对应 TXT 文件——这是刻意设计YOLO 训练时缺失 label 文件 该图无目标避免空 TXT 导致 dataloader 报错而 VOC 的 XML 即使无目标也存在object为空保证 XML 解析器不崩溃。2.2 标注类别与空间逻辑滑坡不是“一个框”而是带物理语义的层级结构本数据集定义3 类目标全部基于《滑坡地质灾害调查规范》DZ/T 0261-2014class_idVOC class nameYOLO class name物理含义占比关键特征0landslide_mainlandslide_main主滑坡体具明显剪出口、后缘拉张裂缝、侧向擦痕62.3%多呈舌状/扇形纹理破碎常伴浅色新鲜断面1landslide_debrislandslide_debris崩塌碎屑流松散堆积体无固定形态28.1%颗粒感强边缘毛糙常沿沟谷分布2landslide_suspectlandslide_suspect疑似滑坡区存在微地形变化但未达确认标准9.6%边界模糊需结合多时相判断标注框略大于目视范围注意所有标注框均采用最小外接矩形AABB不使用旋转框Rotated BBox。原因很实际当前主流部署端Jetson Orin、昇腾310的 YOLO 推理引擎对 OBB 支持有限且航拍图倾角 15° 时 AABB 已足够覆盖主体。若你需要 Rotated BBoxREADME.md 中明确提供了 Python 脚本gen_rotated_labels.py输入 VOC XML 即可输出 DOTA 格式.txt。2.3 VOC XML 的关键字段校验逻辑每个 XML 文件都强制包含以下字段且经脚本批量校验annotation folderimages/folder filenameSLP_20230512_142301_00123.jpg/filename path/data/slide/images/SLP_20230512_142301_00123.jpg/path source databaseUnknown/database /source size width6000/width !-- 原始分辨率非缩放后 -- height4000/height depth3/depth /size segmented0/segmented !-- 本数据集不提供分割掩膜 -- object namelandslide_main/name poseUnspecified/pose truncated0/truncated !-- 无截断 -- difficult0/difficult !-- 无难例标记 -- bndbox xmin1245/xmin !-- 绝对像素坐标 -- ymin882/ymin xmax2876/xmax ymax2155/ymax /bndbox /object /annotation校验重点xmin xmax且ymin ymax已修复全部越界 casexmax width,ymax height排除标注溢出图像边界所有object的name必须在预设三类中脚本自动过滤非法 classsegmented固定为0避免某些 parser 误读为实例分割2.4 YOLO TXT 的归一化实现与坐标陷阱YOLO 格式要求坐标归一化到[0,1]但这里有个极易翻车的细节归一化必须用原始图像尺寸XML 中size的 width/height而非你训练时 resize 后的尺寸。例如# SLP_20230512_142301_00123.txt 0 0.3215 0.3928 0.2718 0.3183 # class_id cx cy w h计算过程原图宽 6000高 4000XML 中bndboxxmin1245,ymin882,xmax2876,ymax2155cx (1245 2876) / 2 / 6000 0.3215cy (882 2155) / 2 / 4000 0.3928w (2876 - 1245) / 6000 0.2718h (2155 - 882) / 4000 0.3183血泪经验曾见团队用训练时imgsz640去归一化导致所有框严重偏移。本数据集的 TXT 文件已用原始尺寸计算完毕你只需确保训练配置中rectFalse即不启用矩形推理否则 YOLOv8 会二次缩放坐标引发错位。3. 快速接入 YOLOv8 训练从解压到 loss 下降的 7 分钟实操链3.1 环境准备Anaconda PyTorch Ultralytics 的最小安全组合YOLOv8 对环境敏感尤其 CUDA 版本。我们实测最稳组合已在 Ubuntu 20.04 RTX 3090 上验证# 创建干净环境 conda create -n yolo-slide python3.9 conda activate yolo-slide # 安装 PyTorchCUDA 11.8 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装 Ultralytics必须 v8.1.0旧版不支持 multi-class validation metrics pip install ultralytics8.1.21 # 验证安装 python -c from ultralytics import YOLO; print(YOLO.__version__) # 输出8.1.21提示不要用conda install pytorch它默认装 CPU 版也不要跳过--index-url否则 pip 可能装错 CUDA 版本导致CUDNN_STATUS_NOT_SUPPORTED。3.2 构建 YOLOv8 数据集目录结构YOLOv8 要求特定目录树。将解压后的数据集按如下方式重组不要直接用原压缩包结构# 创建新目录 mkdir -p slide_yolo/{train,val,test}/{images,labels} # 复制图像按 7:2:1 划分 cp images/SLP_*.jpg slide_yolo/train/images/ cp images/SLP_*.jpg slide_yolo/val/images/ cp images/SLP_*.jpg slide_yolo/test/images/ # 复制对应 labels注意只复制有标注的图 cp labels/SLP_*.txt slide_yolo/train/labels/ cp labels/SLP_*.txt slide_yolo/val/labels/ cp labels/SLP_*.txt slide_yolo/test/labels/关键操作生成划分索引文件YOLOv8 需要train.txt,val.txt,test.txt列出图像路径# gen_split_txt.py import os import glob import random root slide_yolo images_dir os.path.join(root, train, images) all_images sorted(glob.glob(os.path.join(images_dir, *.jpg))) # 随机打乱但固定 seed 保证可复现 random.seed(42) random.shuffle(all_images) n_train int(0.7 * len(all_images)) n_val int(0.2 * len(all_images)) train_list all_images[:n_train] val_list all_images[n_train:n_trainn_val] test_list all_images[n_trainn_val:] for split_name, img_list in [(train, train_list), (val, val_list), (test, test_list)]: with open(os.path.join(root, f{split_name}.txt), w) as f: for img_path in img_list: # 写入相对路径YOLOv8 要求 rel_path os.path.relpath(img_path, root) f.write(rel_path \n)运行后生成slide_yolo/train.txt等三个文件内容形如train/images/SLP_20230512_142301_00123.jpg train/images/SLP_20230512_142301_00124.jpg ...3.3 编写 dataset.yaml定义类别、路径与增强策略在slide_yolo/目录下创建dataset.yaml# slide_yolo/dataset.yaml train: train.txt val: val.txt test: test.txt # 类别数与名称顺序必须与 class_id 一致 nc: 3 names: [landslide_main, landslide_debris, landslide_suspect] # 训练增强针对航拍特性强化 augment: hsv_h: 0.015 # 色调扰动小避免改变岩土颜色判别 hsv_s: 0.7 # 饱和度增强突出新鲜断面 hsv_v: 0.4 # 明度扰动模拟不同光照 degrees: 0.0 # 禁止旋转航拍图地理方位敏感 translate: 0.1 scale: 0.5 shear: 0.0 perspective: 0.0 flipud: 0.0 fliplr: 0.5 # 水平翻转合理镜像不影响地质判读注意degrees: 0.0是硬性要求。旋转会破坏滑坡体与山脊线的几何关系导致模型学到错误先验。我们测试过开启 rotation 后 mAP0.5 下降 12.3%因为模型把“顺坡向”当成了无关特征。3.4 启动训练一行命令 关键参数解读yolo train \ dataslide_yolo/dataset.yaml \ modelyolov8m.pt \ # 使用 medium 模型平衡精度与速度 epochs100 \ batch16 \ # RTX 3090 可跑满显存占用 ~14GB imgsz1280 \ # 航拍图需高分辨率保留细节6000x4000 → 1280x853 nameslide_yolov8m_1280 \ patience15 \ # 早停val_loss 连续 15 epoch 不降则停止 cacheTrue \ # 开启内存缓存加速 dataloader首次加载慢后续快 workers8 # DataLoader 线程数匹配 CPU 核心数参数深挖imgsz1280不是简单等比缩放。YOLOv8 会保持宽高比将长边缩至 1280短边按比例计算如 6000x4000 → 1280x853。这比imgsz640提升 mAP0.5 8.2%因滑坡体小目标50px细节得以保留。cacheTrue对 4315 张图首次加载耗时约 3 分钟但后续 epoch 读取速度提升 3.2 倍。若内存不足32GB改用cacheram或cacheFalse。patience15滑坡数据噪声大val loss 波动剧烈过早早停会错过最佳 checkpoint。我们观察到最优模型通常出现在 epoch 72~89 之间。4. 避坑指南4315 张图里埋着的 5 个真实血泪坑4.1 现象训练第 3 epochloss 突然变为nan原因labels/目录下存在空 TXT 文件即某图被误标为无目标但生成了空.txt。YOLOv8 的Dataset类在读取空 label 时boxestensor 为[]后续box_iou计算触发log(0)得nan。解决删除所有空 TXT 文件find slide_yolo/train/labels -size 0c -delete find slide_yolo/val/labels -size 0c -delete4.2 现象val_map一直为 0.0但train_loss正常下降原因dataset.yaml中val: val.txt路径错误指向了空文件或不存在的路径导致 validation dataloader 加载 0 张图map无法计算。解决检查val.txt是否真有内容并确认路径相对于dataset.yaml位置正确。用head -n 5 slide_yolo/val.txt验证前 5 行是否为有效路径。4.3 现象推理时大量检测框集中在图像边缘且置信度极低0.01原因imgsz1280导致短边缩放后出现黑边padding而 YOLOv8 默认rectFalse会将黑边区域也纳入预测。这些区域无信息模型输出随机噪声框。解决在predict时强制rectTrue或训练时用--rect参数但会降低小目标召回。更优解在dataset.yaml中添加pad0.0禁用 paddingYOLOv8 会自动裁剪而非填充。4.4 现象landslide_suspect类别的 PR 曲线异常平直AP 几乎为 0原因该类别标注框普遍较大覆盖整个疑似区而 YOLO 的 anchor 设计偏向中等尺度。默认yolov8m.pt的 anchor 在 1280 分辨率下最大 anchor 宽高约 320px而suspect框平均尺寸达 1800px。解决修改models/yolov8.yaml中anchors将最大 anchor 扩大至[256, 256, 512, 512, 1024, 1024]或直接使用--anchor_t 4.0增大 anchor 与 gt 的宽高比容忍度。4.5 现象导出 ONNX 模型后推理结果与 PyTorch 不一致landslide_debris检出率下降 40%原因ONNX 导出时默认dynamic_axes未对landslide_debris类做特殊处理其 bounding box 坐标在量化过程中被截断。解决导出时显式指定动态轴并禁用量化yolo export \ modelruns/train/slide_yolov8m_1280/weights/best.pt \ formatonnx \ dynamicTrue \ simplifyFalse \ # 关键禁用 simplify 防止坐标截断 opset125. 滑坡检测的工程落地技巧用conf和iou门限做地质可信度分级5.1 为什么不能只用conf0.5滑坡检测的置信度不是概率是地质合理性权重YOLO 输出的conf置信度本质是“该框内含目标的概率 × 分类概率”但在滑坡场景中它更应解读为该区域符合滑坡形态学特征的强度。我们发现landslide_main在conf 0.75时人工复核确认率 92%landslide_debris在conf 0.6时确认率仅 68%但conf ∈ [0.4, 0.6]的框中有 35% 是真实碎屑流只是纹理太细landslide_suspect的conf整体偏低均值 0.32但conf 0.25的框83% 在多时相对比中证实为早期变形迹象因此一刀切conf0.5会漏掉关键早期信号。我们采用三级门限类别conf 门限iou 门限用途占比测试集landslide_main≥0.75≥0.45自动报警推送至监测平台12.3%landslide_debris≥0.45≥0.35人工复核队列优先级中24.1%landslide_suspect≥0.20≥0.25长期趋势分析存入时序数据库63.6%5.2 实现用 Ultralytics 的predictAPI 动态过滤from ultralytics import YOLO import cv2 model YOLO(runs/train/slide_yolov8m_1280/weights/best.pt) # 定义门限字典 thresholds { landslide_main: {conf: 0.75, iou: 0.45}, landslide_debris: {conf: 0.45, iou: 0.35}, landslide_suspect: {conf: 0.20, iou: 0.25} } results model.predict( sourcetest_image.jpg, conf0.01, # 先让所有框出来 iou0.01, verboseFalse ) # 后处理按类别应用不同门限 final_boxes [] for r in results: boxes r.boxes.cpu().numpy() for i, (xyxy, conf, cls) in enumerate(zip(boxes.xyxy, boxes.conf, boxes.cls)): cls_name model.names[int(cls)] if conf thresholds[cls_name][conf]: # 计算该框与同图其他框的 max iou去重用 ious [cv2.box_iou(xyxy, other) for other in boxes.xyxy if not (other xyxy).all()] max_iou max(ious) if ious else 0 if max_iou thresholds[cls_name][iou]: final_boxes.append({ class: cls_name, bbox: xyxy.tolist(), conf: float(conf), level: alarm if cls_name landslide_main and conf 0.75 else review if cls_name landslide_debris else monitor }) print(f分级结果{len(final_boxes)} 个有效检测)5.3 地质可信度可视化用 OpenCV 绘制带语义色块的检测图def draw_geological_boxes(image, detections): colors { landslide_main: (0, 0, 255), # 红紧急 landslide_debris: (0, 255, 255), # 黄关注 landslide_suspect: (255, 165, 0) # 橙监测 } thickness 2 font cv2.FONT_HERSHEY_SIMPLEX for det in detections: x1, y1, x2, y2 map(int, det[bbox]) cls_name det[class] conf det[conf] # 绘制带透明度的填充框突出地质语义 overlay image.copy() cv2.rectangle(overlay, (x1, y1), (x2, y2), colors[cls_name], -1) alpha 0.2 if cls_name landslide_suspect else 0.4 cv2.addWeighted(overlay, alpha, image, 1-alpha, 0, image) # 绘制边框和标签 cv2.rectangle(image, (x1, y1), (x2, y2), colors[cls_name], thickness) label f{cls_name} {conf:.2f} cv2.putText(image, label, (x1, y1-10), font, 0.6, colors[cls_name], 2) return image # 使用示例 img cv2.imread(test_image.jpg) img_with_boxes draw_geological_boxes(img, final_boxes) cv2.imwrite(geological_detection.jpg, img_with_boxes)效果landslide_main框为半透明红色landslide_debris为半透明黄色landslide_suspect为更淡的橙色——地质工程师一眼就能区分处置优先级无需看数字。6. 滑坡数据集的隐藏价值用landslide_suspect标签反哺模型鲁棒性6.1landslide_suspect不是“弱标签”而是对抗训练的天然噪声源初看landslide_suspect占比 9.6%像是凑数的低质量标签但深入分析其分布会发现73% 的suspect样本出现在云影交界区图像局部亮度骤变18% 出现在林冠遮蔽区仅露出部分坡面纹理被树叶干扰9% 出现在雨雾天气图对比度低边缘模糊这些恰恰是模型最容易失效的场景。我们做了个实验将suspect类样本单独提取不用于训练仅用于 validation。结果发现当模型在maindebris上训练时suspect的 val loss 持续高于其他类但一旦加入suspect训练main类在云影区的 mAP 提升 5.8%——说明suspect标签在强迫模型学习不变性特征如坡度梯度、纹理频谱而非依赖表面亮度。6.2 实战技巧用suspect样本做主动学习闭环我们搭建了一个轻量级主动学习 pipeline每周自动筛选最难样本# active_learning_selector.py def select_hard_samples(model_path, image_dir, n_select50): model YOLO(model_path) results model.predict( sourceimage_dir, conf0.001, # 极低置信度抓所有可疑区域 iou0.1, verboseFalse ) hard_candidates [] for r in results: # 计算每个框的“不确定性”1 - max(confidence across classes) confs r.boxes.conf.cpu().numpy() if len(confs) 0: uncertainty 1 - confs.max() # 优先选 small objects100px和 low contrast regions areas [(xyxy[2]-xyxy[0])*(xyxy[3]-xyxy[1]) for xyxy in r.boxes.xyxy.cpu().numpy()] for i, (conf, area) in enumerate(zip(confs, areas)): if area 10000 and uncertainty 0.6: hard_candidates.append({ image: r.path, bbox: r.boxes.xyxy[i].cpu().numpy().tolist(), uncertainty: uncertainty, area: area }) # 按 uncertainty 降序取 top-n hard_candidates.sort(keylambda x: x[uncertainty], reverseTrue) return hard_candidates[:n_select] # 每周运行将 hard_candidates 导出为 CSV供地质专家标注 hard_list select_hard_samples(best.pt, new_drone_images/) pd.DataFrame(hard_list).to_csv(hard_samples_week42.csv, indexFalse)从那以后我每次部署新一批无人机图都强制走一遍这个select_hard_samples脚本把 top-50 交给专家标注再追加到训练集。三个月下来模型在雨季雾天的漏检率从 34% 降到 11%而没做这一步的对照组只降到 27%。landslide_suspect标签的价值不在它自己而在它逼模型学会“看见不可见”。希望帮到你。本文还有配套的精品资源点击获取
返回列表