----❀❀❀-- YOLO V5 个人学习笔记 通俗易懂 --❀❀❀------

本博客根据博主的学习习惯总结编写,不喜勿喷。


目标检测的定义

目标检测(Object Detection)是计算机视觉领域中的一项重要任务,旨在从图像或视频中识别和定位特定目标对象。目标检测可以用于许多应用,如自动驾驶、视频监控、人脸识别、物体识别等。目标检测旨在对图象上的物体进行识别,对于识别到的物体给出类别的标签,并对归类给出相应的置信度得分(对于识别到的物体有多么确定),并且对识别到的物体用最小外接矩阵圈出来。

YOLO(You Only Look Once)是一种实时目标检测方法,通过将目标检测任务转化为回归问题,直接在图像上预测目标的边界框和类别。YOLOv1提出了全新的检测框架,随后的YOLOv2、YOLOv3和YOLOv4进一步改进了准确性和速度。


回归是一种有监督学习,主要是从中发现变量之间的相关性,确定变量间的关系式,从而预测输出的变量值。

定位 是找到检测图像中带有一个给定标签的单个目标

检测 是找到图像中带有给定标签的所有目标


目标检测中常用的数据集

pascal voc

PASCAL VOC挑战赛 (The PASCAL Visual Object Classes )是一个世界级的计算机视觉挑战赛, PASCAL全称:Pattern Analysis, Statical Modeling and Computational Learning,是一个由欧盟资助的网络组织。

     Pascal VOC数据集是PASCAL VOC挑战官方使用的数据集。该数据集包含20类的物体。每张图片都有标注,标注的物体包括人、动物(如猫、狗、岛等)、交通工具(如车、船飞机等)、家具(如椅子、桌子、沙发等)在内的20个类别。每个图像平均有2.4个目标,所有的标注图片都有目标检测需要的标签。

ms coco

MS COCO是一个非常大型且常用的数据集,其中包括了目标检测,分割,图像描述等。其主要特性如下:

Object segmentation:                       目标级分割
Recognition in context:                     图像情景识别
Superpixel stuff segmentation:         超像素分割
330K images (>200K labeled):         超过33万张图像,标注过的图像超过20万张
1.5 million object instances:              150万个对象实例
80 object categories:                         80个目标类别
91 stuff categories:                            91个材料类别
5 captions per image:                        每张图像有5段情景描述
250,000 people with keypoints:         对25万个人进行了关键点标注


目标检测的性能指标

Precision(精确率 / 查准率)和 Recall(召回率 / 查全率)是分类任务中常用的两种性能度量,它们用于评估模型在处理二分类或多分类问题时的表现。

Precision(精确率)
精确率衡量的是模型预测为正类的样本中,真正为正类的比例。


Recall(召回率)
召回率衡量的是实际为正类的样本中,被正确预测为正类的比例。

F1-score
精确率和召回率互相影响,理想状态下肯定追求两个都高,但是实际情况是两者相互“制约”:追求精确率高,则召回率就低;追求召回率高,则通常会影响精确率。我们当然希望预测的结果精确率越高越好,召回率越高越好, 但事实上这两者在某些情况下是矛盾的。这样就需要综合考虑它们,最常见的方法就是F-score。 也可以绘制出P-R曲线图,观察它们的分布情况。
F1值为算数平均数除以几何平均数,且越大越好,将Precision和Recall的上述公式带入会发现,当F1值小时,True Positive相对增加,而false相对减少,即Precision和Recall都相对增加,即F1对

Precision和Recall都进行了加权。


前传耗时
从输入一张图像到输出最终结果所消耗的时间,包括前处理耗时(如图像归一化)、网络前传耗时、后处理耗时(如非极大值抑制)

FPS (Frames Per Second)
FPS (Frames Per Second):每秒钟能处理的图像数量,FPS用来评估目标检测的速度,当然要对比FPS,你需要在同一硬件上进行。另外也可以使用处理一张图片所需时间来评估检测速度,时间越短,速度越快。

浮点运算量(FLOPS)
处理一张图像所需要的浮点运算数量, 跟具体软硬件没有关系,可以公平地比较不同算法之间的检测速度。越小越好。

  YOLOv5训练PASCAL VOC数据集

在Windows 10(Win10)下安装“NVIDIA图形驱动程序-显卡驱动”、“NVIDIA控制面板”、CUDA Toolkit、cuDNN Archive的详细过程记录_nvidia驱动 win10 19045-CSDN博客

Anaconda安装(过程详细)_anaconda安装教程-CSDN博客

YOLOV5学习笔记(二)——环境安装+运行+训练_yolov5环境安装-CSDN博客

YOLOv5-5.0 训练自己的数据集教程(附带YOLOv3教程)_yolov5s.pt-CSDN博客


YOLO目标检测的发展史

YOLO将特征图划分为SxS的格子(grid cells),每个格子负责对落入其中的目标进行检测,一次性预测所有格子所含目标的边界框、定位置信度、以及所有类别概率向量。

YOLO算法的基本思想

对图像进行网格划分 -->得到物体的边界框、执行度得分以及概率图-->结合两者得最终的检测结果

```首先通过特征提取网络对输入图像提取特征,得到一定大小的特征图比如13x13(相当于416x416图片大小),然后将输入图像分成13x13个grid cells

YOLOv3/v4:如果GT中某个目标的中心坐标落在哪个grid cell中,那么就由该grid cell来预测该目标。每个grid cell都会预测3个不同尺度的边界框.

YOLOv5:不同于yolov3/v4,其GT可以跨层预测,即有些bbox在多个预测层都算正样本;匹配数范围可以是3-9个。

预测得到的输出特征图有两个维度是提取到的特征的维度,比如13x13,还有一个维度(深度)是Bx(5+C)

注:

B表示每个grid cell预测的边界框的数量(YOLO v3/v4中是3个);

C表示边界框的类别数(没有背景类,所以对于VOC数据集是20);

5表示4个坐标信息和一个目标性得分(objectness score)。

不同的尺度  划分的越细 越有助于小目标的检测,经过卷积神经网络。可以得到不同大小的特征图。然后可以对不同大小的特征图进行融合 进行检测。

注:

锚框:目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。 不同的模型使用的区域采样方法可能不同。 这里我们介绍其中的一种方法:以每个像素为中心,生成多个缩放比和宽高比(aspect ratio)不同的边界框。 这些边界框被称为锚框(anchor box)。

使用锚框进行目标检测的大致思路为:先对图像的每个像素点生成sizes+ratios-1个锚框,再计算这些锚框与真实边界框的交并比,从而将真实的边界框分配给最接近的锚框,分配完成后,利用真实边界框对这些锚框进行标注,标签为偏移量,是否分配的布尔掩码以及类别,再根据标签信息生成预测的边界框,此时运用非极大值抑制预测,筛选出不重叠且置信度尽可能大的预测边界框,从而进行目标的锚定。

每个预测框的类别置信度得分(class confidence score)计算如下:

class confidence score = box confidence score  ×  conditional class probability

它测量分类和定位(目标对象所在的位置)的置信度。


YOLO网络架构图



YOLO v5 网络结构图

YOLO v5 网络结构图

YOLO v5主要由输入端、Backone、Neck以及Prediction四部分组成。其中:

(1) Backbone:在不同图像细粒度上聚合并形成图像特征的卷积神经网络。

(2) Neck:一系列混合和组合图像特征的网络层,并将图像特征传递到预测层。

(3) Head: 对图像特征进行预测,生成边界框和并预测类别。


YOLO的损失函数

classification loss:分类损失;

localization loss:定位损失(预测边界框与GT之间的误差)。

confidenceloss:置信度损失(框的目标性;objectness of the box)

总的损失函数:   classification loss +localization loss + confidence loss

YOLO网络可视化工具


深度学习模型可视化工具——Netron使用介绍-CSDN博客

注意:netron对pt格式的权重文件兼容性不好,直接使用netron工具打开,无法显示整个网络。
可使用YOLOv5代码中models/export.py脚本将pt权重文件转换为onnx格式再用netron工具打开,就可以看YOLOv5网络的整体架构。

导出ONNX文件


pip install onnx>=1.7.0 -i https://pypi.tuna.tsinghua.edu.cn/simple # for ONNX export

pip install coremltools==4.0 -i https://pypi.tuna.tsinghua.edu.cn/simple # for CoreML export

python models/export.py--weights weights/yolov5s.pt --img 640 --batch 1


❀YOLOv5学习❀对Focus的理解_yolov5的focus作用-CSDN博客

YOLO V5的SPP模块

SPP是空间金字塔池化,作用是一个实现一个自适应尺寸的输出。(传统的池化层如最大池化、平均池化的输出大小是和输入大小挂钩的,但是我们最后做全连接层实现分类的时候需要指定全连接的输入,所以我们需要一种方法让神经网络在某层得到一个固定维度的输出,而且这种方法最好不是resize(resize会失真),由此SPP应运而生,其最早是何凯明提出,应用于RCNN模型)当今的SPP在faster-rcnn上已经发展为今天的Multi-Scale-ROI-Align,而在Yolo上发展为SPPF。


YOLOv5 目标框回归与跨网格匹配策略

YOLOv5训练技巧

训练预热 Warmup

刚开始训练时,模型的权重(weiqhts)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡)

选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。

缓慢调整训练参数,从初始(更稳定)值逐渐调整到默认训练值。常见的做法是在前几次迭代中将学习率从0逐渐调整到某个初始值,以避免早期训练不稳定等问题。
预热效果在 Tensorboard 学习率图表中是可见的,这些效果是自动跟踪的。下面的示例显示了在自定义数据集上进行的大约 30 个周期的预热,每个参数组一个图表。最后一个图表显示了不同的预热策略(即不同的 hyp)

余弦退火调整学习率CosineAnnealing

可视化学习速率计划与热身。

顶部:余弦和步骤计划的批量大小1024。底部:关于两个计划的验证精度曲线。

自动计算锚框 Autoanchor


Anchor给出了目标宽高的初始值,需要回归的是目标真实宽高与初始宽高的偏移量,而不使用anchor的做法需要回归宽高的绝对量。

Autoanchor only runs when the best possible recall (BPR, 最大可能召回率) is under threshold


自动混合精度训练 Automatic mixed precision(AMP) training

AMP is enabled by default for all model training on GPU.
All YOLOv5 checkpoints are saved in FP16. All GPU inference is performed in FP16.


混合精度预示着有不止一种精度的Tensor,在PyTorch的AMP模块里有2种:torch.FloatTensor和torch.HalfTensor。

.torch.HalfTensor的优势就是存储小、计算快、更好的利用CUDA设备的Tensor Core。因此训练的时候可以.减少显存的占用(可以增加batchsize了),同时训练速度更快;

.torch.HalfTensor的劣势就是:数值范围小(更容易0verflow/Underflow)、舍入误差(Rounding Error
导致一些微小的梯度信息达不到16bit精度的最低分辨率,从而丢失)。


自动预示着Tensor的dtype类型会自动变化,也就是框架按需自动调整tensor的dtype(其实不是完全自动有些地方还是需要手工干预)

在PyTorch中使用自动混合精度

使用autocast+GradScaler。

1.autocast
使用torch.cuda.amp模块中的autocast类。当进入autocast的上下文后,可支持AMP的CUDAops 会把tensor的dtype转换为半精度浮点型,从而在不损失训练精度的情况下加快运算。

刚进入autocast的上下文时,tensor可以是任何类型,不需要在model或者input上手工调用,half(),框架会自动做,这也是自动混合精度中“自动一词的由来。另外一点就是,autocast上下文应该只包含网络的前向过程(包括loss的计算),而不要包含反向传播,因为BP的op会使用和前向op相同的类型。

2.GradScaler
使用torch.cuda.amp.GradScaler,需要在训练最开始之前实例化一个GradScaler对象。通过放大loss的值来防止梯度的underflow(这只是BP的时候传递梯度信息使用,真正更新权重的时候还是要把放大的梯度再unscale回去)。



 YOLO V5的目录结构

YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析-CSDN博客


回顾 激活函数:非线性处理单元

后期补充博客:

【YOLO系列】YOLOv1论文超详细解读(翻译 +学习笔记)_yolo论文-CSDN博客

【YOLO系列】YOLOv5超详细解读(源码详解+入门实践+改进)-CSDN博客

YOLOv5入门实践(1)——手把手带你环境配置搭建-CSDN博客

感谢作者!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值