尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于yolov7的山体滑坡检测:数据集处理、模型训练与部署避坑指南
简介这套带标注的山体滑坡识别数据集面向目标检测与地质灾害监测方向的学习者基于YOLOv7框架标注识别率可达95.4%。数据集中共包含2000个文件151张jpg原始影像与1848个txt标签文件一一对应标签采用YOLO格式保存目标类别与归一化坐标另有1个yaml配置文件用于声明类别和数据集路径压缩包整体约115.92MB。从文件名前缀可看出图片覆盖qxg、ny、zj、df、wn等多种山地场景不同地形、光照条件下的样本有助于提升模型泛化能力。下载后即可获得完整标注数据与可直接套用的YOLOv7训练配置配合博主配套博文中的训练代码可完成数据划分、模型训练与精度评估适合需要快速搭建滑坡识别实验的初学者及科研人员。目前已有28人学习/下载。整体规模轻量适合在消费级显卡上快速完成模型训练与效果验证。1. 带标注山体滑坡识别数据集1848张图跑出95.4%落地前先看清这三件事拿到一份写着“带标注的山体滑坡识别数据集支持yolov7识别率95.4%1848张图”的资料多数人的第一反应是直接开训。我建议动手前先花半小时把这三件事想清楚标注是什么格式、95.4%是在什么条件下测的、1848张图对小样本训练意味着什么。这份数据集的价值在于“有干净标注、有可复现基线”适合遥感目标检测和地质灾害识别方向的算法验证、毕业设计、原型演示但它不包含复杂光照、罕见滑坡形态和真实部署时的传感器噪声直接拿去野外监控大概率翻车。它的坑恰恰藏在标注格式、小目标漏检和背景混淆这三处。2. 读懂这份滑坡数据集标注格式、类别构成与质量核查拿到数据集先别急着喂给yolov7先摸清家底。标题只给了总数和图数没给标注格式而这直接决定你后续要不要写转换脚本、写哪种转换脚本。2.1 三种可能的标注格式与滑坡类别的常见定义遥感目标检测领域的数据集标注格式基本逃不出这三种Pascal VOC的xml、COCO的json、或者YOLO系列直接使用的txt。区分办法很简单打开标注目录看一眼后缀。xml说明是LabelImg或类似工具导出的VOC格式json大概率是labelme导出的或COCO格式txt则是已经转好的YOLO格式。如果是txt恭喜你省了一步如果是前两种就得走一遍坐标转换。类别定义也值得先确认。滑坡识别在这种检测任务里通常是二分类landslide和background或者只标正样本、把其他东西都当背景。但有些数据集会拆得更细把滑坡、泥石流、崩塌分成三类。这直接决定模型输出维度yolov7的nc参数必须和类别数严格一致少写一个就会在训练时崩在你的assert上。我见过有人拿着三类标签的数据集硬套二分类配置loss直接起飞查了半天才发现是类别索引对不上。另外别忘了确认图片是光学遥感影像、无人机航拍还是地面近景照片。这三种影像的滑坡形态差异很大光学遥感看到的滑坡多是裸土色调的块状区域地面近景则是碎石和坡面纹理。训练集和你要部署的场景如果影像源差异太大95.4%的识别率基本只能留在测试集里当摆设。2.2 用统计脚本核查标注质量类别分布、框面积与损坏文件数据标注这件事交付时说“带标注”和实际标得干净是两回事。我一般会先跑一个统计脚本把类别分布、标注框面积、损坏文件一次看清楚避免训练到一半才发现某个xml缺字段。import os import glob import xml.etree.ElementTree as ET from collections import Counter def parse_voc(xml_path): 解析单张VOC标注xml返回宽高和目标框列表 tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) boxes [] for obj in root.iter(object): name obj.find(name).text.strip() bnd obj.find(bndbox) xmin float(bnd.find(xmin).text) ymin float(bnd.find(ymin).text) xmax float(bnd.find(xmax).text) ymax float(bnd.find(ymax).text) boxes.append((name, xmin, ymin, xmax, ymax)) return img_w, img_h, boxes ann_dir annotations # 标注文件目录 class_counter Counter() area_list [] bad_files [] for xml_file in glob.glob(os.path.join(ann_dir, *.xml)): try: img_w, img_h, boxes parse_voc(xml_file) except Exception as e: bad_files.append((xml_file, str(e))) continue for name, xmin, ymin, xmax, ymax in boxes: class_counter[name] 1 box_area (xmax - xmin) * (ymax - ymin) area_list.append(box_area) print(类别分布:, dict(class_counter)) print(标注框总数:, len(area_list)) print(平均框面积:, sum(area_list) // len(area_list)) print(损坏文件:, bad_files)这段脚本的逻辑是遍历所有xml逐个解析出图片宽高和每个目标的类别、坐标最后汇总统计。parse_voc里用root.iter(object)而不是root.findall(object)是为了兼容嵌套结构有些标注工具会在object里再包一层。把解析异常的文件单独收进bad_files后续可以人工修复或直接剔除不要默默跳过否则训练时数据加载会黑匣子式报错。参数说明annotations路径按实际目录改如果类别名里有空格或中文.strip()后最好再打印一下确认没有隐藏字符。这一步统计出的平均框面积很有用按YOLO社区通常把小于32x32像素的目标定义为小目标如果均值明显偏大说明标注的多是成片滑坡体小滑坡样本不足后面训练时要针对小目标做增强。2.3 抽样看图找规律漏标、错标与重叠框统计脚本只是第一关接下来要肉眼抽图。随机抽几十张把标注框画出来看看。重点观察三件事有没有明显漏标的小滑坡、框是不是把整个滑坡体都包住了、有没有大量互相重叠的框。滑坡体的边界本来就模糊标注员经常只框住核心滑体而漏掉边缘碎屑流这种系统性偏差会让模型的边框回归始终不稳。重叠框要注意是不是同一目标被重复标注。两三个框重叠问题不大如果同一区域叠了七八个框很可能是多人标注合并时的产物建议写个IoU过滤脚本清理。此外还会遇到有些xml里坐标是负数或者比图片尺寸还大这类边界问题放到下一章统一处理。3. 把标注转成yolov7能吃的txt转换脚本与四个边界坑yolov7训练时读取的标注文件是txt每行一个目标格式是class_id x_center y_center width height所有数值都归一化到0到1之间。这一步绕不开坐标系换算是数据准备里最容易出错但也最机械的一环。3.1 像素坐标转归一化坐标的核心换算逻辑VOC格式里给出的是xmin, ymin, xmax, ymax四个绝对像素值而YOLO需要的是相对图片宽高的中心点坐标和宽高比例。换算公式极简x_center (xmin xmax) / 2 / img_w y_center (ymin ymax) / 2 / img_h box_w (xmax - xmin) / img_w box_h (ymax - ymin) / img_h这里唯一的坑是宽高顺序。别把img_w和img_h写反很多人第一次转出来的标注全歪了就是在这个地方把size.width和size.height的位置弄反了。另外注意VOC的坐标是包含像素边界的xmax可以等于img_w - 1直接除以img_w会得到(xmax - xmin) / img_w略微偏小的宽但误差在训练中几乎无感不用过于纠结。3.2 一套直接能跑的VOC转YOLO脚本下面这份脚本是我处理遥感影像标注时常用的把VOC的xml批量转成yolov7的txt同时做了越界修正和退化框剔除。import os import glob import xml.etree.ElementTree as ET def voc_to_yolo(xml_file, out_dir, class_map): 把单张VOC xml转成yolo txtclass_map是类别名到id的映射 tree ET.parse(xml_file) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text.strip() if name not in class_map: continue # 只保留映射表里出现的类别 cls_id class_map[name] bnd obj.find(bndbox) xmin float(bnd.find(xmin).text) ymin float(bnd.find(ymin).text) xmax float(bnd.find(xmax).text) ymax float(bnd.find(ymax).text) # 越界修正把坐标约束在图片有效范围内 xmin max(0, min(xmin, img_w - 1)) xmax max(0, min(xmax, img_w - 1)) ymin max(0, min(ymin, img_h - 1)) ymax max(0, min(ymax, img_h - 1)) # 退化框剔除修正后宽高为0则丢弃 if xmax xmin or ymax ymin: continue x_center (xmin xmax) / 2 / img_w y_center (ymin ymax) / 2 / img_h box_w (xmax - xmin) / img_w box_h (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) base os.path.basename(xml_file).replace(.xml, .txt) with open(os.path.join(out_dir, base), w, encodingutf-8) as f: f.write(\n.join(lines)) class_map {landslide: 0} # 二分类时滑坡是0类 voc_to_yolo(annotations/001.xml, labels, class_map)逻辑说明脚本每解析到一个object节点先查类别是否在class_map里不在就直接跳过。坐标读取后先做越界修正用max和min把坐标夹到[0, img_w-1]区间。这一步极其重要我处理过的遥感标注里总有那么几个框边界超出了图片范围不修正的话归一化后会得到大于1的数值yolov7会照常训练但loss会时不时跳一下最后模型边框输出飘忽不定。参数说明class_map要根据你数据集的类别名改如果数据集里是slide不叫landslide键名就要换。.6f是保留6位小数归一化坐标需要的精度到这里就够。如果标注是COCO json格式绕不开pycocotools思路是把bbox的[x, y, w, h]转成中心点坐标换算公式和上面一致只差读数据的方式。3.3 四个边界坑越界、空框、类别ID与损坏图片第一个坑是越界坐标。VOC标注工具允许鼠标拖出画布导致xmax大于图宽。转完的txt里会出现大于1的坐标训练时不报错但模型框不稳定。解决方式就是脚本里的clamp修正。第二个坑是空框。某些标注文件里只有object标签但没有bndbox子节点或者坐标全为0。这种xml解析时不会报错但转出的txt是空文件。空文件会导致yolov7在计算num_targets时出问题训练日志里表现为一个batch的正常样本突然变少。处理办法是转换后统计一下空txt数量通常一张图一个标注都没有这张图对训练没有正贡献建议直接放到测试集。第三个坑是类别ID从0还是从1开始。YOLO系列的类别索引从0开始但有些转换脚本或数据集是从1开始的。如果txt里写的是1而yaml里nc1只有一个类训练时assert会直接拦截如果侥幸没拦模型的输出通道和标签就对不上mAP永远是0。我查这个坑查过一整晚最后是写了个脚本统计txt里最大的类别ID才发现的。第四个坑是图片损坏或路径对不上。txt转好了但jpg本身打不开或者图片文件名和xml对不上训练时datasets.py会报Image not found。这类问题在数据量大的时候特别隐蔽建议用脚本统一校验一遍每个txt的名字在images目录里都要有对应文件并且用OpenCV试着读一下。4. 用yolov7训练自己的山体滑坡检测模型配置、命令与基线参数标注转好了接下来才是重头戏让yolov7在这份数据集上跑起来并且复现出接近95.4%的识别率。4.1 环境准备训练入口、依赖与目录结构yolov7的训练入口很直接克隆官方仓库装依赖就能跑。环境上我建议Python 3.8到3.10之间PyTorch用1.10以上但不用追最新版2.x也能跑但部分老代码里的torchvision算子会有小差异。# 克隆yolov7官方仓库并安装依赖 git clone https://github.com/WongKinYiu/yolov7 cd yolov7 pip install -r requirements.txt # 目录结构建议把数据集放在yolov7仓库同级 # yolov7/ # datasets/ # landslide/ # images/train/ # images/val/ # labels/train/ # labels/val/目录结构是我多次踩坑后固定的方案。images和labels分开放train和val分开yolov7的datasets.py默认就认这套结构。把数据集放到仓库外面避免git操作时把几个G的图片误提交。4.2 两条训练路线冷启动与迁移学习1848张图对深度学习来说是小样本直接从头训练yolov7的随机初始化权重效果会很惨。常见做法是加载COCO预训练权重做迁移学习。yolov7.pt是在COCO上训过的通用目标检测权重它的浅层特征边缘、纹理、颜色块对滑坡识别依然有效我们只需要让它在深层特征上适应“滑坡”这个新类别。冷启动和迁移学习的差异我用一组对比说明同样训练100轮冷启动的mAP0.5可能只有60%出头迁移学习能到90%以上。原因很简单滑坡体在影像上就是一片色调异常的裸土区域这种纹理特征COCO里的大量目标已经让模型学会了迁移学习省掉的是从头学特征的时间。4.3 训练命令与关键超参95.4%从哪里来下面是我在这个量级数据集上常用的训练命令注意几个参数的搭配。python train.py \ --data landslide.yaml \ --cfg yolov7.yaml \ --weights yolov7.pt \ --batch-size 16 \ --epochs 150 \ --img 640 \ --hyp data/hyp.scratch.p5.yaml \ --device 0参数解释--data指向数据集配置文件--cfg是网络结构配置--weights填预训练权重路径--img是训练输入分辨率--hyp是超参数文件。这里--img 640是速度与精度的平衡点如果你的滑坡体在图上普遍很小改成1280会让小目标召回率明显提升但对显存的要求也翻倍。数据集配置文件landslide.yaml按下面写train: datasets/landslide/images/train val: datasets/landslide/images/val nc: 1 names: [landslide]nc是类别数滑坡二分类就是1。names列表要和转换脚本里的class_map对应上类别索引从0开始。关于95.4%这个数字我的经验是它大概率指测试集上的mAP0.5也就是IoU阈值0.5下的平均精度不是端到端的识别准确率。在文献和数据集宣传里这很常见但你要清楚两件事一是mAP0.5对框的位置精度要求不算苛刻换到mAP0.75数字通常会掉5到10个百分点二是这个分数是在同一数据源上测的换个地区的影像光照、植被、岩性全变了分数大概率下滑。参数推荐值说明--img640 起小目标多则 1280分辨率越高小目标召回越好显存压力也越大--batch-size16 或 8显存不够就减半配合梯度累积效果接近--epochs150 左右小数据集更容易过拟合100到200之间观察早停--weightsyolov7.ptCOCO预训练迁移学习必备--hyphyp.scratch.p5.yaml默认超参已适配迁移学习先不动4.4 训练日志怎么看loss不再下降时该做什么训练日志里关注三个指标box_loss、obj_loss、cls_loss。滑坡是单类检测cls_loss通常很快降到很低重点是box_loss和obj_loss。如果两者在某个epoch后不再下降先别急着加数据看验证集的mAP是否还在涨——模型陷入局部最优不代表验证集没有收益。如果box_loss反复震荡常见原因是--img设置太小小目标的边框回归不稳定可以提到960或1280。如果obj_loss居高不下大概率是背景误检检查一下训练集里有没有大量只有背景完全没有目标的图片——yolov7对纯负样本的处理没有专门机制obj_loss会被这些图拉高。这时候可以把纯背景图从训练集里剔掉一部分或者给--hyp里的cls_pw和obj_pw设置类别权重。5. 滑坡识别的五个翻车点从loss不降到误报满天飞排查这一章全是实践里反复遇到的坑每一条都是现象加原因加解决可以直接对照你自己的log排查。5.1 滑坡与裸地混淆误报率居高不下现象验证集上精度看着还行一放到新的遥感影像上裸土路基、采石场、农田翻耕地全被标成滑坡。原因这些地物在光学影像上和滑坡体高度相似都是裸露土壤色调模型学到的是“像裸土的区域”而不是“滑坡体特有的形态”。标注框如果只框了滑坡核心区模型就没有足够信息学习滑坡体和普通裸地的边界差异。解决从泛化角度最有效的一招是扩充背景负样本收集一些不含滑坡但包含裸土、耕地、采石场的影像加入训练集让模型见过“看起来像但不是”的样本。另一个技巧是在后处理阶段提高置信度阈值从默认的0.25提到0.4以上误报会明显减少代价是召回率小幅下降。如果数据集允许还可以在标注时把容易混淆的裸地区域单独标注为背景类让模型做二分类而不是单类检测。5.2 小滑坡目标漏检640分辨率根本看不见现象大滑坡体识别得很准但图上只有几十像素的小滑坡完全漏掉mAP对这类小目标贡献几乎为零。原因输入分辨率640时一张遥感影像下采样到640原本只有30像素宽的滑坡体可能只剩几个像素特征在下采样过程中被池化抹掉了。这是目标检测的经典小目标难题不是yolov7特有。解决第一步把--img从640提到128030像素的目标在1280分辨率下还有近60像素特征保留程度完全不同。如果显存不够可以只对验证和推理用1280训练用640加mosaic增强。第二步是改用滑窗推理把测试大图切成512到640的块分别检测再合并结果这个方案对遥感影像特别有效具体做法放在最后一章。5.3 训练loss一直在降mAP却上不去现象训练集上的box_loss降得很漂亮曲线一路向下但验证集mAP在某个epoch后开始横盘甚至回落。原因这是过拟合的典型信号。1848张图对yolov7这样的大网络来说不多模型把训练集里的滑坡形态背下来了对没见过的影像泛化不出来。解决三个手段按优先级来一是加大数据增强把hyp.scratch.p5.yaml里的mosaic和mixup开关确认打开hsv_h、hsv_s这些颜色抖动参数也适当调大遥感影像的光照变化就能被模拟出来二是用早停训练到验证loss不再下降就断掉保存最佳权重而不是最后的权重三是做交叉验证把数据按影像场景而不是随机方式划分避免同一滑坡体的不同裁剪块同时出现在训练集和验证集否则mAP会虚高。5.4 拉到1280分辨率后显存溢出现象按--img 1280 --batch-size 16训练跑了几个step就报CUDA out of memory训练直接中断。原因输入分辨率翻倍特征图面积变成原来的4倍显存占用约等于翻了两番。16的batch在1080Ti甚至3090上都很难跑1280分辨率。解决batch-size先降到4或8如果还爆把网络换成yolov7-tiny.yaml这个轻量版在显存占用和精度之间平衡比较好小数据集上反而更不容易过拟合。同样有效的是开启--cache-images把图片预加载到内存省掉训练时反复读图的IO开销但注意这是CPU内存不是显存。梯度累积是另一种方案手动把batch设成4连续4个step后再更新一次权重等效batch为16只是训练时间会拉长。5.5 负样本占八成模型学成“什么都报”现象训练集里大量图片只有零到一两个标注框负样本区域占比极高训练出来的模型在真实影像上框出一大片。原因遥感影像上滑坡体往往只占画面的一小块背景占了绝大部分。模型学到的先验是“大多数地方没有目标”但它选择把所有可疑区域都框出来来降低obj_loss反正在验证集上多框几个也比漏掉强。解决关键是要让模型对背景区域有明确的负反馈。把纯背景的图片清洗掉一部分保留那些和滑坡形态接近的困难负样本。另外检查hyp.scratch.p5.yaml里obj_pw这个参数它是正负样本的损失权重默认1.0可以试着调到1.2到1.5让模型对误检付出更高代价。调完后观察验证集的F1曲线而不是只看mAPF1能更真实反映误报和漏报的平衡是否合理。6. 部署前的验证动作mAP计算、滑窗推理与一份可用性检查清单训练完不要急着相信那个95.4%用你自己的测试集复算一遍。val.py会输出mAP0.5、mAP0.75和各类别AP重点看后者。mAP0.5高只能说明框大体位置对了mAP0.75才能在毫米级精度要求下说明问题。如果只有0.5高滑坡体边缘的框可能偏大或偏小用于应急指挥时坐标估算会有偏差。滑窗推理是做遥感大图检测最值得加的一步。一张几千乘几千像素的影像直接送进yolov7会被强制缩放小目标直接丢光。常见的做法是把大图切成512或640的滑窗块相邻窗口重叠50像素分别检测再用NMS合并同一目标的重复框。这个方法不需要重新训练只是推理时多了个预处理步骤但对小滑坡的召回率提升非常明显。最后检查清单照这个过一遍转换后的txt里所有坐标都在0到1之间、没有空txt、类别ID从0到nc-1、训练集和验证集划分没有同场景泄漏、最佳权重是从验证loss最低的epoch保存的、部署影像的色调统计和训练集大致一致。六项全过这份数据集才算真正吃透了。我自己的习惯是每次拿到新数据集都强制走一遍清单少一项后面都会在某个深夜以玄学问题的方式还回来。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

Dreamweaver插件扩展包实战:安装、配置与避坑指南

Dreamweaver插件扩展包实战:安装、配置与避坑指南

简介:这份Dreamweaver插件扩展包专为网页设计开发者准备,整合了多款实用插件与扩展模块,覆盖代码辅助、模板布局、调试优化、版本控制、图像处理等常见开发场景。对初学者而言,可借助模板与代码提示快速搭建页面结构;专…

📅 2026/10/11 11:16:24
Qt读写XML文件:用QTreeWidget实现可视化编辑器

Qt读写XML文件:用QTreeWidget实现可视化编辑器

简介:面向Qt开发者的XML读写实战资源包,聚焦QTreeWidget与XML的相互转换,覆盖文件解析、树形展示、导出保存及拖放操作四个核心场景。资源共31个文件,包含6个cpp源码、3个头文件、2个xml数据文件、1个ui界面,以及sln/v…

📅 2026/10/11 11:16:24
Visual C++ 6.0 安装与调试实战指南:老旧工业系统维护必备

Visual C++ 6.0 安装与调试实战指南:老旧工业系统维护必备

简介:本资源为经典Windows平台C/C开发环境——Visual C 6.0完整安装包,面向高校计算机专业初学者、嵌入式/工控领域遗留系统维护人员及编程史研究者,解决老旧项目编译调试、MFC GUI程序开发与Windows API实践等实际需求。压缩包含2001个文件&…

📅 2026/10/11 11:16:24
MORE NEWS

更多资讯

📰

H5 Canvas粒子爆炸动画:轻量级60fps视觉特效实现

简介:这是一份面向前端开发者与HTML5动画学习者的Canvas粒子特效实战资源,聚焦于用原生JavaScript实现炫酷的文字背景爆炸动画,适用于网页动态视觉设计、交互式Banner开发及Canvas进阶练习。压缩包共6个文件,含3个JS脚本&#xff…

📰

Vibe-coding时代,Git就是你的刹车系统:基础操作与实战策略

开头先说个现象。最近不管是在技术群里还是线下交流里,到处都在讨论 Vibe-coding,就是你对着 AI 编辑器描述需求,让大模型一口气把功能代码写出来,你负责审、负责跑、负责修。很多人上手一玩,发现确实爽——一个周末能…

📰

Linux命令与终端快捷键:从入门到高效排查实战

搞 Linux 的朋友都有过这种经历:刚接触那会儿,命令抄了满满几页纸,一到真要干活的时候脑子一片空白;快捷键更是只用 CtrlC 和 CtrlV,连中断程序用的 CtrlC 都是在网上搜“怎么终止卡死的命令”才学会的。我用 Linux 当…

📰

OWASP Top 10 2021「Next Steps」全解读:代码质量、拒绝服务与内存管理三大风险域

应用安全 【免费下载链接】Top10 Official OWASP Top 10 Document Repository 项目地址: https://gitcode.com/gh_mirrors/top/Top10 点击查看 免费下载 本文基于 OWASP Top 10 2021 官方文档仓库中的 A11:2021 – Next Steps(印尼语版) 及其…

📰

Vitest Test API 完全指南:test/it 定义、修饰符、参数化与 Fixtures 实战

AI 技能人工智能 【免费下载链接】skills Anthony Fus curated collection of agent skills. 项目地址: https://gitcode.com/gh_mirrors/skills11/skills 点击查看 免费下载 导读 本文以 Vitest 5.x 为核心,系统讲解 test / it 测试定义函数及其全部修…

📰

PyTorch强化学习实现六轴机械臂实时轨迹规划:从仿真到部署

简介:《机器人运动控制新突破:PyTorch强化学习模型在六轴机械臂中的实时轨迹规划》是一份面向机器人控制与强化学习研究者的技术资料,旨在解决六轴机械臂实时轨迹规划中深度强化学习模型的设计与训练问题。内容覆盖机械臂运动学与动力学模型、…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬