使用yolov5训练visdrone2019数据集-详细教程

本文详细介绍使用YOLOv5训练VisDrone2019数据集的过程,涵盖环境搭建、数据集准备、配置文件修改及训练步骤等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备工作

首先,新建一个文件夹,命名为yolov5,在yolov5文件夹下新建datasets文件夹

yolov5源码及权重下载

下载yolov5官方源码

链接如下:https://github.com/ultralytics/yolov5
下载源码并解压后产生一个yolov5-master文件夹,将其移动到yolov5文件夹下

下载预训练权重

此外,还需下载预训练权重,根据自己需要下载相应的预训练权重版本
YOLOv5的官方代码中,给出了四种版本的目标检测网络,分别是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四个模型。
在这里插入图片描述

YOLOv5s网络最小,速度最快,AP精度也最低。但如果检测的大目标为主的场景,追求速度,那么这个模型也是一个很好的选择。
其他的三种网络,在此基础上不断的加深加宽网络,AP精度也不断提升,但速度的消耗也在不断增加。
其中四种网络的预训练权重下载链接如下:https://github.com/ultralytics/yolov5/releases
在yolov5-master文件夹下新建一个weights文件夹,放入下载所需要的权重,笔者使用的是yolov5m,因此下载的是yolov5m.pt权重文件

配置相关环境

cuda和cudnn

1.首先应在电脑上配置好cuda和cudnn,这样才能使用gpu进行训练,当然若电脑无gpu,则不用进行此操作,但是cpu训练速度会很慢。
cuda和cudnn的安装教程参考https://blog.csdn.net/jhsignal/article/details/111401628

安装yolov5需要的包

最好创建一个虚拟环境,在该环境下安装所需要的包,如果是新和我一样的小白可以参考如下链接:
https://blog.csdn.net/liangyihuai/article/details/77842628
下载的yolov5-master文件夹下有requirements.txt文件,cmd中cd到该路径下,
执行
在这里插入图片描述

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

安装成功后需要进行测试,可参考如下链接:
Win10下YOLOv5安装与测试

visdrone2019数据集准备

数据集下载

下载visdrone数据集,附官方下载链接:http://aiskyeye.com/download/
官方下载链接比较慢,网上有很多大佬分享这个数据集,大家可以自行查找。
数据集下载并解压完成后,形式如下
在这里插入图片描述
此时在datasets文件夹下新建VisDrone2019文件夹,将上述4个文件夹放入其中。

数据集处理

新版本的yolov5中已经集成了训练visdrone数据集的配置文件,其中附带了数据集的处理方式,主要是labels的生成,可以新建一个visdrone2yolov5.py文件。

from utils.general import download, os, Path

def visdrone2yolo(dir):
    from PIL import Image
    from tqdm import tqdm

    def convert_box(size, box):
        # Convert VisDrone box to YOLO xywh box
        dw = 1. / size[0]
        dh = 1. / size[1]
        return (box[0] + box[2] / 2) * dw, (box[1] + box[3] / 2) * dh, box[2] * dw, box[3] * dh

    (dir / 'labels').mkdir(parents=True, exist_ok=True)  # make labels directory
    pbar = tqdm((dir / 'annotations').glob('*.txt'), desc=f'Converting {dir}')
    for f in pbar:
        img_size = Image.open((dir / 'images' / f.name).with_suffix('.jpg')).size
        lines = []
        with open(f, 'r') as file:  # read annotation.txt
            for row in [x.split(',') for x in file.read().strip().splitlines()]:
                if row[4] == '0':  # VisDrone 'ignored regions' class 0
                    continue
                cls = int(row[5]) - 1
                box = convert_box(img_size, tuple(map(int, row[:4])))
                lines.append(f"{cls} {' '.join(f'{x:.6f}' for x in box)}\n")
                with open(str(f).replace(os.sep + 'annotations' + os.sep, os.sep + 'labels' + os.sep), 'w') as fl:
                    fl.writelines(lines)  # write label.txt


dir = Path('F:/jyc/datasets/VisDrone2019')  # dataset文件夹下Visdrone2019文件夹路径

# Convert
for d in 'VisDrone2019-DET-train', 'VisDrone2019-DET-val', 'VisDrone2019-DET-test-dev':
    visdrone2yolo(dir / d)  # convert VisDrone annotations to YOLO labels

正确执行代码后,会在’VisDrone2019-DET-train’, ‘VisDrone2019-DET-val’, 'VisDrone2019-DET-test-dev三个文件夹内新生成labels文件夹,用以存放将VisDrone数据集处理成YoloV5格式后的数据标签。
在这里插入图片描述

训练Visdrone2019数据集

进行了前期准备工作,包括yolov5源码及权重的下载、python相关环境的搭建、相关库的安装以及VisDrone数据集的准备工作之后,就可以开始训练了

修改配置文件

修改VisDrone.yaml文件

记事本或notepad++打开yolov5/yolov5-master/data文件夹下的VisDrone.yaml文件,将其中path参数修改为VisDrone2019文件夹所在的路径。
在这里插入图片描述

修改yolov5m.yaml文件(若训练其他yolo网络修改相应的yaml文件即可)

记事本或notepad++打开yolov5/yolov5-master/models文件夹下的yolov5m.yaml文件,将其中nc参数修改为VisDrone2019数据集训练的类别,即nc:10。
在这里插入图片描述

修改train.py文件

在yolov5/yolov5-master下的train.py文件,需要修改几个default参数
我主要更改了–weights、–cfg、–data、–epoch以及–batch-size的默认参数
train.py文件的源码详解可以参考YOLOV5训练代码train.py注释与解析

def parse_opt(known=False):
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default=ROOT / 'weights/yolov5m.pt', help='initial weights path')
    parser.add_argument('--cfg', type=str, default=ROOT / 'models/yolov5m.yaml', help='model.yaml path')
    parser.add_argument('--data', type=str, default=ROOT / 'data/VisDrone.yaml', help='dataset.yaml path')
    parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path')
    parser.add_argument('--epochs', type=int, default=10)
    parser.add_argument('--batch-size', type=int, default=8, help='total batch size for all GPUs, -1 for autobatch')
    parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
    parser.add_argument('--rect', action='store_true', help='rectangular training')
    parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
    parser.add_argument('--noval', action='store_true', help='only validate final epoch')
    parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
    parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
    parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')
    parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
    parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
    parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
    parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')
    parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
    parser.add_argument('--workers', type=int, default=8, help='maximum number of dataloader workers')
    parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')
    parser.add_argument('--name', default='exp', help='save to project/name')
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    parser.add_argument('--quad', action='store_true', help='quad dataloader')
    parser.add_argument('--linear-lr', action='store_true', help='linear LR')
    parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
    parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')
    parser.add_argument('--freeze', type=int, default=0, help='Number of layers to freeze. backbone=10, all=24')
    parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
    parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')

    # Weights & Biases arguments
    parser.add_argument('--entity', default=None, help='W&B: Entity')
    parser.add_argument('--upload_dataset', action='store_true', help='W&B: Upload dataset as artifact table')
    parser.add_argument('--bbox_interval', type=int, default=-1, help='W&B: Set bounding-box image logging interval')
    parser.add_argument('--artifact_alias', type=str, default='latest', help='W&B: Version of dataset artifact to use')

    opt = parser.parse_known_args()[0] if known else parser.parse_args()
    return opt

开始训练

运行train.py文件,即开始训练。
在训练的过程中会产生过程文件及训练模型,会保存在runs/文件夹中

训练效果测试

修改detect.py中的–weights参数,运行detect.py文件,即可看到检测效果。

 parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'weights/yolov5m.pt', help='model path(s)')

在这里插入图片描述这是运行了6个epoch后的效果。

遇到的问题及解决方案

1.Unable to find a valid cuDNN algorithm to run convolution:
cuDnn无法找到算法进行卷积
**解决方案:**调小batchsize: 1 8 16 32 64 根据自己的内存大小调整
2.OSError: [WinError 1455] 页面文件太小,无法完成操作
解决方案:可参考如下链接:https://blog.csdn.net/qq1198768105/article/details/117392555,我采用的是其中方案2。
3.配置wandb
可参考如下链接:https://blog.csdn.net/ksp416/article/details/113915178
4.使用wandb
可参考如下链接https://zhuanlan.zhihu.com/p/145052684

<think>好的,我现在需要帮助用户解决如何使用YOLOv8训练VisDrone2019数据集的问题。首先,用户已经提到了VisDrone2018的引用,但需要的是2019年的,不过可能步骤类似。我需要先回顾已有的引用内容,看看是否有可复用的信息。 用户提供的引用[2]和[3]提到了使用YOLOv8训练VisDrone目标检测数据集,包括环境搭建、数据准备、模型训练等步骤。虽然数据集是2018年的,但2019版本的结构可能相似,所以这些步骤可以作为参考。此外,用户需要示例代码和配置文件,这部分需要详细说明。 接下来,我需要按照用户的要求,结构清晰地分步骤回答,确保每个部分都符合系统级指令,比如正确使用LaTeX格式,生成相关问题等。同时,要确保引用正确,比如在环境搭建和数据准备部分引用已有的资料。 需要注意用户可能对数据集的具体结构不太清楚,尤其是VisDrone2019。可能需要指导用户如何将数据集转换为YOLOv8所需的格式,比如YOLO格式的txt文件。此外,配置文件的部分需要详细说明如何修改yaml文件,包括路径和类别数。 在代码示例部分,要提供训练和验证的命令行指令,并解释参数的含义,如epochs、batch等。可能还需要提醒用户安装正确版本的ultralytics库,并检查CUDA环境是否配置正确。 最后,生成的相关问题需要围绕用户可能遇到的后续问题,比如数据增强、参数调优、评估指标等,这些都需要自然地从回答中延伸出来。 总结下来,回答的结构应该是:环境准备、数据转换、配置修改、训练代码、验证代码,每一步都结合引用中的信息,并确保正确引用标记。同时,检查LaTeX是否符合要求,比如行内公式用$...$,独立公式用$$...$$,但当前内容中可能涉及数学公式较少,如果有的话需要注意格式。最后生成的问题要覆盖用户可能感兴趣的扩展方向。</think>以下是如何使用YOLOv8训练VisDrone2019数据集详细步骤及代码示例: ### 一、环境准备 1. 安装YOLOv8依赖库: ```bash pip install ultralytics ``` 建议使用Python 3.8+和PyTorch 1.8+环境[^2] ### 二、数据集准备 1. 下载VisDrone2019数据集(结构示例): ``` VisDrone2019-DET ├── annotations │ ├── images │ └── labels ├── train ├── val └── test ``` 2. 转换为YOLO格式: ```python # convert_visdrone.py import os from pathlib import Path def convert_bbox(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[2]/2) * dw y = (box[1] + box[3]/2) * dh w = box[2] * dw h = box[3] * dh return (x,y,w,h) # 调用转换函数处理每个标注文件 # 完整转换脚本参考:https://github.com/ultralytics/ultralytics/discussions/2310 ``` ### 三、配置文件 1. 创建`visdrone.yaml`: ```yaml # YOLOv8配置参考 path: /path/to/VisDrone2019-DET train: train/images val: val/images test: test/images nc: 10 # 类别数 names: ['pedestrian', 'people', 'bicycle', 'car', 'van', 'truck', 'tricycle', 'awning-tricycle', 'bus', 'motor'] ``` ### 四、训练代码 ```python from ultralytics import YOLO # 加载预训练模型 model = YOLO('yolov8n.pt') # 可替换为yolov8s/m/l/x[^1] # 训练参数配置 results = model.train( data='visdrone.yaml', epochs=100, batch=16, imgsz=640, device=0, # GPU ID optimizer='Adam', lr0=0.001, augment=True, # 启用Mosaic增强 project='visdrone_results' ) ``` ### 五、验证与推理 ```python # 验证模型 metrics = model.val() # 推理示例 results = model.predict( source='test.jpg', conf=0.25, iou=0.7, show_labels=True ) ```
评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值