基于YOLOv11的山体滑坡检测/分割模型
项目概述
本代码库包含使用YOLOv11训练的山体滑坡检测模型。
🧠 模型说明
custom.pt
- 基于YOLOv11定制的专用模型
- 使用5,661张标注图像训练(山体滑坡检测专用)
yolov11n.pt
- 基于COCO数据集预训练的YOLOv11 nano模型
- 轻量级通用目标检测模型
- 推理速度快,但非地质灾害场景专用
📊 数据分布概览
山体滑坡数据集
- 训练数据:4,528张
- 验证数据:1,133张
- 🧮 总计:5,661张图像
🎥 检测演示
注:括号中的"Detection Demo"可译为"检测演示"或"识别效果展示",根据实际展示内容选择更贴切的译法。如需强调分割功能,可补充说明"支持滑坡区域分割识别"。
分割训练流程
以下是关于使用YOLOv11训练分割数据集的完整指南,包含数据布置、格式转换和训练流程:
1. 数据集布置
YOLOv11分割任务需要同时包含目标检测框和分割掩码数据,目录结构建议如下:
dataset/
├── images/
│ ├── train/
│ │ ├── image1.jpg
│ │ └── ...
│ └── val/
│ ├── image2.jpg
│ └── ...
└── labels/
├── train/
│ ├── image1.txt # 检测框标签
│ ├── image1.png # 分割掩码(可选)
│ └── ...
└── val/
├── image2.txt
├── image2.png
└── ...
2. 数据格式要求
(1) 检测框标签格式(.txt文件)
每行格式:class_id x_center y_center width height
- 坐标需归一化到0-1(相对于图像宽高)
- 例如:
0 0.45 0.32 0.12 0.15
(2) 分割掩码格式
- 推荐使用PNG格式
- 单通道图像,像素值对应类别ID(0=背景,1=类别1,…)
- 或使用RGB彩色掩码(需指定颜色-类别映射)
3. 格式转换工具
(1) 从COCO格式转换
from pycocotools.coco import COCO
import cv2
import os
coco = COCO("annotations/instances_train2017.json")
cat_ids = coco.getCatIds()
for img_id in coco.getImgIds():
img_info = coco.loadImgs(img_id)[0]
img = cv2.imread(f"images/{img_info['file_name']}")
h, w = img.shape[:2]
# 生成YOLO格式标签
ann_ids = coco.getAnnIds(imgIds=img_id)
anns = coco.loadAnns(ann_ids)
with open(f"labels/{img_info['file_name'].replace('.jpg', '.txt')}", "w") as f:
for ann in anns:
# 检测框转换
x, y, bw, bh = ann['bbox']
x_center = (x + bw/2) / w
y_center = (y + bh/2) / h
bw /= w
bh /= h
f.write(f"{ann['category_id']} {x_center} {y_center} {bw} {bh}\n")
# 分割掩码转换(可选)
mask = coco.annToMask(ann)
cv2.imwrite(f"labels/{img_info['file_name'].replace('.jpg', '.png')}", mask)
(2) 从VOC格式转换
使用labelme2yolo
工具:
pip install labelme
labelme2yolo --json_dir voc_annotations/ --output_dir yolo_labels/
4. 配置文件准备
创建data.yaml
:
# 数据集配置
train: ../dataset/images/train
val: ../dataset/images/val
# 类别数量及名称
nc: 1 # 山体滑坡检测设为1
names: ['landslide']
# 分割任务需指定
segmentation: True # 启用分割模式
mask_dir: ../dataset/labels # 掩码路径
5. 训练命令
python train.py \
--weights yolov11s.pt \
--cfg models/yolov11s.yaml \
--data data.yaml \
--img 640 \
--batch 16 \
--epochs 100 \
--device 0 \
--name yolov11-landslide \
--segmentation # 关键参数:启用分割训练
6. 关键参数说明
参数 | 作用 |
---|---|
--segmentation | 启用分割训练模式 |
--mask_dir | 指定掩码路径(若未在data.yaml中配置) |
--rect | 禁用矩形训练(分割任务需完整图像) |
--weights | 加载预训练权重(推荐官方COCO预训练模型) |
7. 验证结果
训练完成后检查:
- 分割掩码预测效果:
detect.py --task segment
- 关键指标:mAP50-95、mask precision/recall
常见问题解决
-
报错"Missing mask files"
→ 检查data.yaml
中的mask_dir
路径,确保每个图像有对应的.png
掩码文件 -
训练时显存不足
→ 减小--batch-size
或使用--img-size 512
-
分割边界不精确
→ 尝试增大输入分辨率(如--img 1024
)或在数据增强中添加随机裁剪
如需处理多类别分割,只需修改data.yaml
中的nc
和names
列表即可。