【YOLOv5】记录YOLOv5的学习过程

news2024/11/30 10:29:48

以下记录的是Ubuntu20.04版本,其他Ubuntu版本也相差不大~ 

一、安装pytorch GPU版本、显卡驱动、CUDA、cuDNN

下载pytorch GPU版本:

最新版本链接:Start Locally | PyTorch

历史版本链接:Previous PyTorch Versions | PyTorch

可以顺便参照TensorFlow的cuda版本: 从源代码构建  |  TensorFlow

CU

 可以看出,目前TensorFlow CUDA版本最高支持11.2

通过对照pytorch,安装CUDA11.1版本CU

下图是cuda版本需要达到的算力,如果没达到的话记得更新下显卡驱动!

下载显卡对应版本驱动:

最新版本: Official Drivers | NVIDIA

其他历史版本: Official Advanced Driver Search | NVIDIA

下载对应版本CUDA:

CUDA Toolkit Archive | NVIDIA Developer

选择了11.0版本 CUDA Toolkit 11.0 Update 3 Downloads | NVIDIA Developer

wget https://developer.download.nvidia.com/compute/cuda/11.0.3/local_installers/cuda_11.0.3_450.51.06_linux.run
sudo sh cuda_11.0.3_450.51.06_linux.run

安装后记得在 .bashrc 中添加路径  

export PATH=/usr/local/cuda-11.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-11.0

下载对应版本cuDNN:

  • cudnn官网:CUDA 深度神经网络库 (cuDNN) | NVIDIA Developer

选择适合的cuDNN版本即可

我选择是cuda11.0配套的cuDNN8.0版本

然后将压缩包进行解压,解压后,复制两个文件到cuda路径即可:

cp cuda/lib64/* /usr/local/cuda-11.0/lib64/
cp cuda/include/* /usr/local/cuda-11.0/include/

查看cuDNN是否安装成功:

cat /usr/local/cuda-11.0/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

若是要删除cuda:

cd /usr/local/cuda-11.0/bin
sudo ./cuda-uninstaller


二、下载YOLOv5

到GitHub下载yolov5源码即可~(目前更新到YOLOv5 V7.0版本)

git clone https://github.com/ultralytics/yolov5.git

记得Python版本 需要为3.7以上,pytorch1.7以上 

下载依赖:

 pip install -r requirements.txt

下载预训练权重文件:

Releases · ultralytics/yolov5 · GitHub

将下载的权重文件pt存放在weights目录(新建的)下

测试安装:

python detect.py --source ./data/images/ --weights weights/yolov5s.pt --conf-thres 0.4

则可以在runs目录下查看输出结果: 


三、YOLO v5 训练自定义数据:

1、准备数据集

(自备数据集哈)

链接: https://pan.baidu.com/s/1HGMkmvDkJd8drZMc6E-pzQ 提取码: nrib 

2、创建dataset.yaml文件

在data目录下创建一个coco_chv.yaml文件

coco_chv.yaml 文件:填写数据集的路径,包括训练数据验证数据测试数据。以及类别

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/CHV_dataset # dataset root dir
train: images/train  # train images (relative to 'path') 118287 images
val: images/val  # val images (relative to 'path') 5000 images
test: images/test  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794

# Classes
names:
  0 : person
  1 : vest
  2 : blue helmet
  3 : red helmet
  4 : white helmet
  5 : yellow helmet

3、选择合适的预训练模型

4、修改训练模型的yaml文件 

进入models目录下,新建一个新的yaml文件用于训练,修改里面的类别个数nc

5、开始训练

注意:batch-size 后面的数字根据显卡的显存而定~太大容易爆显存!

# yolov5n
python ./train.py --data ./data/coco_chv.yaml --cfg ./models/yolov5n_chv.yaml --weights ./weights/yolov5n.pt --batch-size 20 --epochs 120 --workers 4 --name base_n --project yolo_chv
# yolov5s
python ./train.py --data ./data/coco_chv.yaml --cfg ./models/yolov5s_chv.yaml --weights ./weights/yolov5s.pt --batch-size 20 --epochs 120 --workers 4 --name base_s --project yolo_chv
# yolov5m
python ./train.py --data ./data/coco_chv.yaml --cfg ./models/yolov5m_chv.yaml --weights ./weights/yolov5m.pt --batch-size 10 --epochs 120 --workers 4 --name base_m --project yolo_chv
# yolov5l
python ./train.py --data ./data/coco_chv.yaml --cfg ./models/yolov5l_chv.yaml --weights ./weights/yolov5l.pt --batch-size 5 --epochs 120 --workers 4 --name base_l --project yolo_chv

 6、可视化

YOLO官方推荐:Weights & Biases

需要先进入官网进行注册~ 

注册后,登录,保存key码

安装wandb

pip install wandb 

安装完成后,第一次需要login

wandb login

第二次重新登录可以

wandb login --relogin

然后输入刚刚保存的key,然后回车即可!

开始训练后就可以通过登录官网进行监听~

最终的效果如下:


也可以使用tensorboard

在训练的时候,启动另外的终端输入:

tensorboard --logdir=./yolo_chv

后面跟的是项目名称,若是没有填,则默认runs目录

有没有发现tensorboard没有上面的wandb好看,哈哈哈,个人觉得tensorboard不好看!! 

 7、测试评估模型

测试:

--sources:

python detect.py --weights yolov5s.pt --source         0              # webcam
                                                       img.jpg        # image
                                                       vid.mp4        # video
                                                       path/          # directory
                                                       path/*.jpg     # glob
                                                      'https://youtu.be/Zgi9g1ksQHc'  # YouTube
                                                      'rtsp://example.com/media.mp4'  # RTSP, RTMP, HTTP stream

例如:(使用图片进行测试) 

python detect.py --source ../datasets/CHV_dataset/images/test/ppe_0048.jpg --weights yolo_chv/base_m/weights/best.pt --conf-thres 0.3

评估:

python val.py --data ./data/coco_chv.yaml  --weights yolo_chv/base_m/weights/best.pt --batch-size 10

                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 14/14 [00:02<00:00,  5.93it/s]
                   all        133        917      0.925      0.873      0.892      0.534
                person        133        387      0.974      0.891      0.934      0.576
                  vest        133        171      0.882      0.789      0.828      0.504
           blue helmet        133         49      0.999      0.878      0.897      0.522
            red helmet        133         48      0.828      0.917      0.843      0.487
          white helmet        133         99      0.939       0.94      0.959      0.628
         yellow helmet        133        163      0.928      0.822      0.889      0.489
Speed: 0.2ms pre-process, 11.7ms inference, 2.0ms NMS per image at shape (10, 3, 640, 640)


四、目标检测常用的指标

具体相关知识可以参考以下博文:

【机器学习】模式识别基本概念_Q小鑫的博客-CSDN博客_机器学习模式识别

  • 真阳性TP(True Positive)    :预测是阳,实际是阳,预测正确
  • 假阳性FP(False Positive)  :预测是阳,实际是阴,预测错误
  • 假阴性FN(False Negative:预测是阴,实际是阳,预测错误
  • 真阴性TN(True Negative)    :预测是阴,实际是阴,预测正确

Precision:精度、查准率,是评估预测的(预测阳性)准不准

Recall:召回率、查全率,是评估找的全不全

IOU(交并比) intersection over union

 

  • IOU=1,表示预测与标注边界框完全匹配
  • 若设置IOU阈值,比如0.5
    • 如果IOU>=0.5,则表示TP(真阳性)
    • 如果IOU<0.5,则表示为FP(假阳性)
    •  如果有标注,但未检测出,则为FN(假阴性)
    • TN(真阴性)对目标检测没有用处,忽略

mAP(mean Average Precision)

  • AP衡量模型在每个类别上的好坏
  • mAP衡量模型在所有类型上的好坏;mAP取所有类别AP的平均值

 在这里插入图片描述

定义:PR线下方的面积就是AP(Average Precision)

Pascal VOC 2007:11点计算法

AP = (AP(0) + AP(0.1) + AP(0.2) + AP(0.3) + ... +AP(1.0))/ 11

Pascal VOC 2010-2012:所有的点计算 

 COCO mAP:使用101个recall 取值点:[0:.01:1]

COCO中AP和mAP不做区分,是对所有类别求平均值

AP^{IOU}=0.5 表示IOU=0.5 时的AP(相当于Pascal VOC 的mAP)

AP[.5:.05:.95]=\frac{AP^{IOU=0.5}+AP^{IOU=0.55}+...+AP^{IOU=0.95}}{10}

检测速度:

  • 前传耗时:输入图像到输出结果的耗时,包括前处理(如归一化)、网络前传耗时、后处理(如NMS非极大抑制)
  • FPS:每秒帧数,每秒钟能处理的图像数量
  • 浮点运算量(Flops):处理一张图所需要的浮点运算数量,与硬件无关


 五、如何得到最优的训练结果

参考:Tips for Best Training Results · ultralytics/yolov5 Wiki · GitHub

1、数据

  • 每类图片:建议>=1500张;

  • 每类实例(标注的物体):建议>=10000个;

  • 图片采样:真实图片建议在一天中不同时间、不同季节、不同天气、不同光照、不同角度、不同来源(爬虫抓取、手动采集、不同相机源)等场景下采集;

  • 标注:

    • 所有图片上所有类别的对应物体都需要标注上,不可以只标注部分;
    • 标注尽量闭合物体,边界框与物体无空隙,所有类别对应物体不能缺少标签;
  • 背景图:背景图用于减少假阳性预测(False Positive),建议提供0~10%样本总量的背景图,背景图无需标注;

2、模型选择

模型越大一般预测结果越好,但相应的计算量越大,训练和运行起来都会慢一点,建议:

  • 在移动端(手机、嵌入式)选择:YOLOv5n/s/m
  •  云端(服务器)选择:YOLOv5l/x

3、训练

  • 对于小样本、中样本,建议试用预训练模型开始训练:
python train.py --data custom.yaml --weights yolov5s.pt
                                             yolov5m.pt
                                             yolov5l.pt
                                             yolov5x.pt
                                             custom_pretrained.pt
  • 对于大样本,建议从0开始训练(无需预训练模型):
python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml
                                                      yolov5m.yaml
                                                      yolov5l.yaml
                                                      yolov5x.yaml
  • Epochs:初始设定为300,如果很早就过拟合,减少epoch,如果到300还没过拟合,设置更大的数值,如600, 1200等;
  • 图像尺寸:训练时默认为--img 640,如果希望检测出画面中的小目标,可以设为--img 1280(检测时也需要设为--img 1280才能起到一样的效果)
  • Batch size:选择你硬件能承受的最大--batch-size
  • 超参数(Hyperparameters):初次训练暂时不要改,具体参考Hyperparameter Evolution · Issue #607 · ultralytics/yolov5 · GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL——内置函数

文章目录内置函数日期函数字符串函数数学函数其他函数内置函数 日期函数 基本使用&#xff1a; 可以进行运算&#xff1a; 在日期基础上加时间 在日期基础上减时间 计算两个日期相差的天数 案例1&#xff1a; 建一张表&#xff0c;记录生日 案例2&#xff1a; 创建一…

设计有趣的轻巧真无线,体积小续航长,南卡小音舱上手

大家平时都会听听音乐、玩玩游戏&#xff0c;这时候就需要用到蓝牙耳机&#xff0c;特别是在户外接打电话时&#xff0c;戴上一副耳机都会方便很多。最近发现了一款南卡小音舱Lite2&#xff0c;这些天用过之后感觉它质量不错&#xff0c;做得十分小巧&#xff0c;日常携带特别方…

Postman带sessionId的post请求访问失败

Postman带sessionId的post请求访问失败1、Python 调用过程2、Postman 错误示例3、Postman 正确示例4、总结使用 Python 访问一个数据接口&#xff0c;调用是正常的&#xff0c;但是使用 Postman 进行访问时出错了&#xff0c;搞了两天&#xff0c;后面发现很简单&#xff0c;故…

如何理解FFT中时间窗与RBW的关系

作为一种常用的频谱分析工具&#xff0c;快速傅里叶变换(FFT) 实现了时域到频域的转换&#xff0c;是数字信号分析中最常用的基本功能之一。FFT 频谱分析是否与传统的扫频式频谱仪类似&#xff0c;也具有分辨率带宽(RBW) 的概念&#xff1f;如果具有RBW &#xff0c;那么FFT 的…

前端食堂技术周刊第 63 期:Vite 4.0、State of CSS 2022、Rome v11、Web 性能日历、VueConf 2022 PPT

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;霜糖山楂 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 Vite 4.0State of CSS 2022 调查结果Rome v11HTMHell Advent Calendar 20…

虚幻引擎VR游戏开发基础教程

虚幻引擎VR游戏开发基础教程 了解如何使用 Oculus Quest 2 的蓝图在虚幻引擎 4 中从头开始构建基本的 VR 机制 课程英文名&#xff1a;Unreal Engine VR Development Fundamentals 此视频教程共4.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附…

推荐一些Python练手项目,了解完毕后才吃惊

前言 入门篇&#xff1a; 0.Python初学者一般都是那些根本没有编程基础的学生。做这个项目&#xff0c;你应该首先开始基本语法。教程中的几个实验可以让完全零基础的学生在一个下午学习Linux、python基础知识和GitHub命令。 1.Python-Python 图片转字符画50 行 Python 代码…

web前端期末大作业网页设计与制作 ——汉口我的家乡旅游景点 5页HTML+CSS+JavaScript

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

JDBC 入门

目录1 JDBC 快速入门1.1 JDBC 的概念1.2 JDBC 快速入门2 JDBC 功能类详解2.1 DriverManager2.2 Connection2.3 Statement2.4 ResultSet3 JDBC 工具类4 SQL 注入攻击5 JDBC 事务5.1 JDBC 管理事务6 连接池6.1 数据库连接池的概念6.2 自定义数据库连接池6.2.1 DataSource6.2.2 归…

嵌入式:ARM存储器组织、协处理器及片上总线

文章目录ARM存储器组织ARM存储数据类型和存储格式ARM的存储器层次简介存储器管理单元MMUARM协处理器ARM片上总线AMBAARM存储器组织 ARM存储数据类型和存储格式 ARM处理器支持以下6种数据类型 8位有符号和无符号字节。16位有符号和无符号半字&#xff0c;它们以两字节的边界定…

字符串匹配问题(KMP)

文章目录题目KMP 算法1&#xff09;例子演示2&#xff09;KMP算法思路3&#xff09;疑惑模型验证4&#xff09;求 next 数组5&#xff09;代码演示6&#xff09;复杂度分析题目 有字符串 str1 和 str2 &#xff0c;str1 中是否包含 str2&#xff0c;如果没有包含返回 -1&#…

电商行业用天翎低代码平台做客服管理系统

编者按&#xff1a;在市场竞争越来越激烈的今天&#xff0c;客服作为电商行业的重要组成部分&#xff0c;如何科学管理成为企业管理层不可避免的难题&#xff0c;做好客服管理对企业具有重要意义。本文通过唯品会金牌客服管理系统案例介绍了低代码平台在定制化和快速落地的特点…

python tkinter 登录 计算器

使用tkinter开发图形化小项目&#xff1a; 功能&#xff1a; 登录 &#xff1a;登录成功 跳转到 计算器 页面&#xff0c;否则登录失败计算器 &#xff1a;登录成功后&#xff0c;窗口标题栏显示当前登录的用户 技术&#xff1a; 面向对象标准模块SQLite数据库登录成功后页…

SpringCloud MQ介绍与使用

哈喽~大家好&#xff0c;这篇来看看SpringCloud MQ介绍与使用。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【微服务】 &#x1f949;与这篇相关的文章&#xff1a; SpringCloud Sentinel 使用…

基于Python+Django的银行取号排队系统 毕业设计

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

clickhouse集群搭建、SpringBoot集成及应用

前言 在日常工作中&#xff0c;日志查询是我们不可避免的业务场景&#xff0c;当项目访问量较小时&#xff0c;我们可以将日志存储在MySQL或其他行式数据库中&#xff0c;但是如果项目访问量很大&#xff0c;一次查询就会给数据库带来很大压力&#xff0c;也许你会采用elk等成…

测试框架Pytest-pytest测试用例的运行实操

一、单元测试框架 1、什么是单元测试框架 单元测试是指在软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数、方法&#xff09;进行正确性的检查测试。 2、单元测试框架 java&#xff1a;junit和testing python:unittest和pytest 3、单元测试框架主要做什么&a…

基于JSON的SQL注入攻击触发需要更新Web应用程序防火墙

©网络研究院 安全研究人员开发了一种通用的 SQL 注入技术&#xff0c;可以绕过多个 Web 应用程序防火墙 (WAF)。问题的核心是 WAF 供应商未能在 SQL 语句中添加对 JSON 的支持&#xff0c;从而使潜在的攻击者可以轻松隐藏其恶意负载。 Claroty Team82 的研究人员发现的绕…

绿盟SecXOps安全智能分析技术白皮书 思路方案

安全数据资产 统一管理DataOps&#xff0c;即 Data 和 Operations 的集成&#xff0c;于 2014 年首次提出。Gartner 将 DataOps 定义为“一种协作性的数据管理 实践&#xff0c;专注于改进组织内数据管道的通信、集成和自动化”[7]。DataOps 是一种面向流程的自动化方法&#x…

【C++笔试强训】第六天

文章目录选择题编程题选择题 1.十进制变量i的值为100&#xff0c;那么八进制的变量i的值为&#xff08;&#xff09; A 146 B 148 C 144 D 142 进制之间的转化&#xff0c;这不用多说了把 2.执行下面语句后的输出为 int I1; if(I<0)printf("****\n") ; els…