保姆级教程:用YOLOv5s搞定VisDrone无人机数据集,从数据转换到模型训练全流程

张开发
2026/5/3 19:19:00 15 分钟阅读
保姆级教程:用YOLOv5s搞定VisDrone无人机数据集,从数据转换到模型训练全流程
从零实战YOLOv5s训练VisDrone无人机数据集的完整指南无人机视角下的目标检测正成为计算机视觉领域的热门方向。VisDrone2019-DET作为该领域最具挑战性的基准数据集包含了城市空中拍摄的复杂场景。本文将带你完整走通从数据准备到模型训练的全流程特别针对小目标检测和遮挡处理等难点提供解决方案。1. 环境准备与数据集获取在开始之前我们需要配置好基础开发环境。推荐使用Python 3.8和PyTorch 1.7版本这些组合经过验证与YOLOv5兼容性最佳。基础环境安装conda create -n visdrone python3.8 conda activate visdrone pip install torch1.7.1cu110 torchvision0.8.2cu110 -f https://download.pytorch.org/whl/torch_stable.html pip install ultralytics albumentations tqdm opencv-pythonVisDrone2019-DET数据集可以通过官方网站申请下载。数据集包含三个部分训练集6,471张图像验证集548张图像测试集3,190张图像下载后建议按以下结构组织目录VisDrone/ ├── VisDrone2019-DET-train/ │ ├── annotations/ │ └── images/ ├── VisDrone2019-DET-val/ │ ├── annotations/ │ └── images/ └── VisDrone2019-DET-test-dev/ ├── annotations/ └── images/2. 深入理解VisDrone标注格式VisDrone的标注文件采用.txt格式每行对应一个目标实例包含8个字段bbox_left,bbox_top,bbox_width,bbox_height,score,category,truncation,occlusion其中几个关键字段需要特别注意category1-10分别对应10个物体类别occlusion表示遮挡程度0完全可见1部分遮挡2严重遮挡truncation表示目标是否被截断0未截断1截断类别对应表类别ID类别名称说明1pedestrian行人2people人群3bicycle自行车4car轿车5van厢式货车6truck卡车7tricycle三轮车8awning-tricycle带篷三轮车9bus公交车10motor摩托车3. 标注格式转换实战YOLOv5需要的标注格式与VisDrone原始格式不同需要进行转换。核心是将左上角坐标宽高转换为归一化的中心坐标宽高。转换脚本详解import os from pathlib import Path from PIL import Image from tqdm import tqdm def visdrone_to_yolo(dataset_dir): 将VisDrone标注转换为YOLO格式 :param dataset_dir: 数据集目录(包含images和annotations子目录) # 创建labels目录存放转换后的标注 labels_dir dataset_dir / labels labels_dir.mkdir(parentsTrue, exist_okTrue) # 遍历所有标注文件 pbar tqdm((dataset_dir / annotations).glob(*.txt), descfConverting {dataset_dir.name}) for anno_file in pbar: # 获取对应图像尺寸 img_path dataset_dir / images / anno_file.name.replace(.txt, .jpg) img Image.open(img_path) img_width, img_height img.size # 读取并转换标注 yolo_lines [] with open(anno_file, r) as f: for line in f: parts line.strip().split(,) if len(parts) 8: continue # 过滤忽略区域(score0)和严重遮挡目标(occlusion2) if parts[4] 0 or parts[7] 2: continue # 获取类别ID(转换为0-based) class_id int(parts[5]) - 1 # 转换坐标格式 x_min int(parts[0]) y_min int(parts[1]) width int(parts[2]) height int(parts[3]) # 计算归一化中心坐标和宽高 x_center (x_min width / 2) / img_width y_center (y_min height / 2) / img_height norm_width width / img_width norm_height height / img_height # 格式化为YOLO标注行 yolo_line f{class_id} {x_center:.6f} {y_center:.6f} {norm_width:.6f} {norm_height:.6f}\n yolo_lines.append(yolo_line) # 写入转换后的标注文件 output_path labels_dir / anno_file.name with open(output_path, w) as f: f.writelines(yolo_lines) # 对训练集、验证集和测试集分别进行转换 base_dir Path(/path/to/VisDrone) for subset in [VisDrone2019-DET-train, VisDrone2019-DET-val, VisDrone2019-DET-test-dev]: visdrone_to_yolo(base_dir / subset)关键处理逻辑说明过滤掉score0的忽略区域和occlusion2的严重遮挡目标将类别ID从1-based转换为0-based坐标从绝对像素值转换为归一化的相对值格式从(x_min,y_min,width,height)转换为(x_center,y_center,width,height)4. 数据增强策略设计无人机图像中的目标通常较小且密集需要特别设计数据增强策略。以下是针对VisDrone数据集的推荐配置基础增强随机水平翻转(p0.5)随机亮度/对比度调整(±20%)随机色调饱和度调整(±20%)针对小目标的特殊增强Mosaic增强4图拼接增加小目标上下文随机缩放(0.5-1.5倍)小目标复制粘贴增强可以在data/hyps/hyp.scratch-low.yaml中调整以下参数# 数据增强参数 hsv_h: 0.015 # 色调增强幅度 hsv_s: 0.7 # 饱和度增强幅度 hsv_v: 0.4 # 亮度增强幅度 degrees: 0.0 # 旋转角度(对小目标不推荐大角度旋转) translate: 0.1 # 平移 scale: 0.5 # 缩放 shear: 0.0 # 剪切(对小目标影响较大建议设为0) perspective: 0.0001 # 透视变换 flipud: 0.0 # 上下翻转 fliplr: 0.5 # 左右翻转 mosaic: 1.0 # Mosaic增强概率 mixup: 0.0 # Mixup增强(对小目标可能不利)5. 模型训练与调优5.1 配置文件准备创建visdrone.yaml配置文件# VisDrone数据集配置 path: /path/to/VisDrone train: VisDrone2019-DET-train/images val: VisDrone2019-DET-val/images test: VisDrone2019-DET-test-dev/images # 类别定义 names: 0: pedestrian 1: people 2: bicycle 3: car 4: van 5: truck 6: tricycle 7: awning-tricycle 8: bus 9: motor5.2 训练参数优化针对VisDrone数据集的特点推荐以下训练参数调整学习率策略# hyp.scratch-low.yaml中的关键参数 lr0: 0.01 # 初始学习率 lrf: 0.1 # 最终学习率 lr0 * lrf momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0 warmup_momentum: 0.8 warmup_bias_lr: 0.1损失函数权重调整box: 0.05 # 增加边界框损失权重 cls: 0.3 # 分类损失权重 obj: 0.7 # 目标存在损失权重5.3 启动训练使用以下命令开始训练python train.py \ --img 1024 \ # 使用更大分辨率应对小目标 --batch 16 \ --epochs 300 \ --data visdrone.yaml \ --cfg models/yolov5s.yaml \ --weights yolov5s.pt \ --hyp data/hyps/hyp.scratch-low.yaml \ --name visdrone_exp \ --cache \ # 使用RAM缓存加速训练 --device 0 # 使用GPU 05.4 小目标检测优化技巧增大输入分辨率从默认的640x640增加到1024x1024或更高调整anchor尺寸使用k-means重新聚类VisDrone特有的anchorpython tools/anchors.py \ --img-size 1024 \ --dataset visdrone.yaml \ --task train使用更密集的预测头考虑使用YOLOv5l或YOLOv5x模型添加小目标检测层修改模型配置增加检测小目标的特征层6. 模型评估与结果分析训练完成后使用以下命令评估模型性能python val.py \ --weights runs/train/visdrone_exp/weights/best.pt \ --data visdrone.yaml \ --img 1024 \ --task test \ --device 0关键指标解读mAP0.5IoU阈值为0.5时的平均精度mAP0.5:0.95IoU阈值从0.5到0.95的平均精度各类别AP针对每个类别的单独精度针对VisDrone数据集常见问题及解决方案问题现象可能原因解决方案小目标检测效果差特征提取不足增大输入分辨率增加检测层密集目标漏检NMS阈值过高调整--iou-thres参数(如0.4)类别不平衡某些类别样本过少使用过采样或类别加权损失遮挡目标检测不稳定特征提取不鲁棒增加遮挡数据增强7. 实际部署建议将训练好的模型部署到实际应用中时还需要考虑以下因素推理速度优化python export.py \ --weights runs/train/visdrone_exp/weights/best.pt \ --img 1024 \ --batch 1 \ --device 0 \ --include onnx \ --simplify后处理优化调整置信度阈值(--conf-thres)优化NMS参数(--iou-thres)针对小目标使用更宽松的过滤条件部署架构建议使用TensorRT加速推理对于实时应用考虑使用多尺度推理策略实现跟踪算法处理视频序列在无人机平台上部署时还需要考虑计算资源限制。YOLOv5s是一个较好的起点但如果性能不足可以尝试以下方法使用模型量化(FP16/INT8)实现模型剪枝采用更轻量级的网络架构

更多文章