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

2023-11-21 05:20

本文主要是介绍使用yolov5训练visdrone2019数据集-详细教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 准备工作
    • yolov5源码及权重下载
      • 下载yolov5官方源码
      • 下载预训练权重
    • 配置相关环境
      • cuda和cudnn
      • 安装yolov5需要的包
    • visdrone2019数据集准备
      • 数据集下载
      • 数据集处理
  • 训练Visdrone2019数据集
    • 修改配置文件
      • 修改VisDrone.yaml文件
      • 修改yolov5m.yaml文件(若训练其他yolo网络修改相应的yaml文件即可)
      • 修改train.py文件
    • 开始训练
    • 训练效果测试
    • 遇到的问题及解决方案

准备工作

首先,新建一个文件夹,命名为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, Pathdef visdrone2yolo(dir):from PIL import Imagefrom tqdm import tqdmdef convert_box(size, box):# Convert VisDrone box to YOLO xywh boxdw = 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 directorypbar = tqdm((dir / 'annotations').glob('*.txt'), desc=f'Converting {dir}')for f in pbar:img_size = Image.open((dir / 'images' / f.name).with_suffix('.jpg')).sizelines = []with open(f, 'r') as file:  # read annotation.txtfor row in [x.split(',') for x in file.read().strip().splitlines()]:if row[4] == '0':  # VisDrone 'ignored regions' class 0continuecls = int(row[5]) - 1box = 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.txtdir = 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 argumentsparser.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

这篇关于使用yolov5训练visdrone2019数据集-详细教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400103

相关文章

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

如何Python使用设置word的页边距

《如何Python使用设置word的页边距》在编写或处理Word文档的过程中,页边距是一个不可忽视的排版要素,本文将介绍如何使用Python设置Word文档中各个节的页边距,需要的可以参考下... 目录操作步骤代码示例页边距单位说明应用场景与高级用China编程途小结在编写或处理Word文档的过程中,页边距是一个

Logback在SpringBoot中的详细配置教程

《Logback在SpringBoot中的详细配置教程》SpringBoot默认会加载classpath下的logback-spring.xml(推荐)或logback.xml作为Logback的配置... 目录1. Logback 配置文件2. 基础配置示例3. 关键配置项说明Appender(日志输出器

SpringBoot项目Web拦截器使用的多种方式

《SpringBoot项目Web拦截器使用的多种方式》在SpringBoot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制,下面给大家介绍Sprin... 目录一、实现 HandlerInterceptor 接口1、创建HandlerInterceptor实

使用JavaConfig配置Spring的流程步骤

《使用JavaConfig配置Spring的流程步骤》JavaConfig是Spring框架提供的一种基于Java的配置方式,它通过使用@Configuration注解标记的类来替代传统的XML配置文... 目录一、什么是 JavaConfig?1. 核心注解2. 与 XML 配置的对比二、JavaConf

使用Python和Tkinter实现html标签去除工具

《使用Python和Tkinter实现html标签去除工具》本文介绍用Python和Tkinter开发的HTML标签去除工具,支持去除HTML标签、转义实体并输出纯文本,提供图形界面操作及复制功能,需... 目录html 标签去除工具功能介绍创作过程1. 技术选型2. 核心实现逻辑3. 用户体验增强如何运行

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生

go rate 原生标准限速库的使用

《gorate原生标准限速库的使用》本文主要介绍了Go标准库golang.org/x/time/rate实现限流,采用令牌桶算法控制请求速率,提供Allow/Reserve/Wait方法,具有一定... 目录介绍安装API介绍rate.NewLimiter:创建限流器limiter.Allow():请求是否