首页 > 其他分享 >机器视觉入门学习:YOLOV5自定义数据集部署、网络详解、损失函数(学习笔记)

机器视觉入门学习:YOLOV5自定义数据集部署、网络详解、损失函数(学习笔记)

时间:2024-06-15 22:31:14浏览次数:11  
标签:YOLOV5 定义数据 卷积 YOLOv5 损失 学习 模块 中心点 预测

 前言


源码学习资源:YOLOV5预处理和后处理,源码详细分析-CSDN博客

网络学习资源:YOLOv5网络详解_yolov5网络结构详解-CSDN博客

YOLOv5-v6.0学习笔记_yolov5的置信度损失公式-CSDN博客

 本文为个人学习,整合各路大佬的资料进行V5-6.0版本的网络分析,在开始学习之前最好先去学习YOLO前面几个系列,B站有大佬讲了V1-V3:【精读AI论文】YOLO V1目标检测,看我就够了_哔哩哔哩_bilibili

YOLOV5网络分析

分析一个网络是如何的进行的,先找网络图最为直观,一目了然的知道主干、颈部、头部网络是如何进行的,下面是YOLOV5的网络图: 

        本次分析的是YOLOv5官方文档6.0版本 把整个过程看成黑箱,输入为640x640x3,输出为三个,分别为80x80x256,40x40x256,20x20x1024。80x80检测小物体,40x40检测中物体,20x20检测大物体。
把黑箱分为Backbone、Neck、Head进行分析
Backbone主要为CONV模块、CSPDarkNet53和SPFF模块
Neck主要分为FPN和PANet
Head主要为三个检测层,不同的尺度,可以进行小目标检测 

主干网络

        YOLOv5在Conv模块中封装了三个功能:包括卷积(Conv2d)、Batch Normalization和激活函数,同时使用autopad(k, p)实现了padding的效果。其中YOLOv5-6.0版本使用Swish(或者叫SiLU)作为激活函数,代替了旧版本中的Leaky ReLU。

        Conv/BN/SiLU 组合中的 SiLU 激活函数的主要作用是引入平滑的非线性,使网络能够学习和表示更复杂的特征,并且在训练过程中保持较好的梯度特性,从而提升网络的整体性能 K6,S2,P2,C64分别代表着卷积核的大小6x6、滑动步长2、padding填充行列数2、输出通道64(也就是这一层有64个卷积核). 640x640x3,经过k6,s2,p2,c64,怎么变成的320x320x64,首先是知道它的卷积核是6x6,通道数就是卷积核个数,64就是它的卷积核个数,其次步长为2,那么一个卷积核只会遍历三次,而且它又填充了0有2行2列,所以输出的320是( 640+2*p(乘2是考虑上下或左右两边的填充)-k(卷积核大小)/s)+1(+1是在卷积操作中,即使经过步长和填充调整,卷积核可能仍然可以在输入特征图的边缘上再放置一次,+1 就是用于这种情况,以确保不漏掉边缘上的卷积操作),即640+2X2-6=638,638/2=319如果是有小数就向下取整(不过一般长宽取32的倍数,不会出现小数),319+1=320

padding补0操作:为什么补一行0一列0,原因:因为不补的时候,最左上角的值105,跟卷积核操作的时候只参与了一次,而中间的值104,却每次操作都参与了,这是不公平的,这样会缺失边缘信息,所以需要补偿,补0以后左上角就参与的更多了,对于后续的特征提取就相对公平一些。 至于补多少行0是自己决定的,可以补到输入和输出的维度是一样的

用一张图可以清晰的观察到为什么进行补0操作:

Batch Normalization,批量归一化、BN层,把神经元的输出给减去均值,除于标准差,变成以0为均值,1为标准差的一个分布,正态分布,原因:因为很多激活函数(sigmoid、tahn)在0的附近是非饱和区,如果输出太大或者太小,就陷入了激活函数的饱和区,饱和区:梯度消失、难以训练 所以BN层的作用:把神经元的输出强行集中在0附近,这是YOLOv2就提出的改进了。

主干网络中:YOLOv5-6.0版本中使用了尺寸大小为6×6,步长为2,padding为2的卷积核代替了Focus模块,便于模型的导出,且效率更高。两个东西结果是一样的,但实验证明6x6降低了CUDA的显存,效果更好。

Bottleneck模块

        每个C3模块都有,Bottleneck模块借鉴了ResNet的残差结构,其中一路先进行1 ×1 卷积将特征图的通道数减小一半,从而减少计算量,再通过3 ×3 卷积提取特征,并且将通道数加倍,其输入与输出的通道数是不发生改变的。而另外一路通过shortcut进行残差连接,与第一路的输出特征图相加,从而实现特征融合。 在YOLOv5的Backbone中的Bottleneck都默认使shortcut为True(1),而在Head中的Bottleneck都不使用shortcut。

C3模块

        YOLOv4和YOLOv5均借鉴了CSPNet的思想,将其运用于DarkNet53骨干网络。YOLOv5-6.0版本中使用了C3模块,替代了早期的BottleneckCSP模块。v3是DarkNet53模型、v2是DarkNet19模型、而v1是传统的DarkNet模型。 在Neck部分另外一个不同点就是New CSP-PAN了,在YOLOv4中,Neck的PAN结构是没有引入CSP结构的,但在YOLOv5中作者在PAN结构中加入了CSP。每个C3模块里都含有CSP结构。 CSP:是将原输入分成两个分支,分别进行卷积操作使得通道数减半,然后一个分支进行Bottleneck * N操作,然后concat(相当于矩阵拼接)两个分支,使得BottlenneckCSP的输入与输出是一样的大小,这样是为了让模型学习到更多的特征。

concat是一个比较重要的操作,类似矩阵拼接,但其实是张量拼接,会扩充两个张量的维度,需要区别一下ADD操作,两个是不同的概念

SPPF模块

        YOLOv5-6.0版本使用了SPPF模块来代替V4版本的SPP模块,其中SPP是Spatial Pyramid Pooling的简称,即空间金字塔池化,YOLOv5借鉴了SPPNet的思想。 SPPF模块采用多个小尺寸池化核级联代替SPP模块中单个大尺寸池化核,从而在保留原有功能,即融合不同感受野的特征图,丰富特征图的表达能力的情况下,进一步提高了运行速度。

颈部网络

        YOLOv5的Neck与YOLOV4相似,均借鉴了FPN和PANet的思想。 PANet在FPN的基础上又引入了一个自底向上(Bottom-up)的路径。经过自顶向下(Top-down)的特征融合后,再进行自底向上(Bottom-up)的特征融合,这样底层的位置信息也能够传递到深层,从而增强多个尺度上的定位能力。同时,与FPN相比(如红色线条所示),PANet中的底层特征传递所需要穿越的feature map数量大大减少(如绿色线条所示),使得底层的位置信息更容易传递到顶部。

头部网络

        YOLOv5的Head对Neck中得到的不同尺度的特征图分别通过1×1卷积将通道数扩展,扩展后的特征通道数为(类别数量+5)× 每个检测层上的anchor数量,其中5分别对应的是预测框的中心点横坐标、纵坐标、宽度、高度和置信度,这里的置信度表示预测框的可信度,取值范围为( 0 , 1 ),值越大说明该预测框中越有可能存在目标。 Head中包含3个检测层,分别对应Neck中得到的3种不同尺寸的特征图。YOLOv5根据特征图的尺寸在这3种特征图上划分网格,并且给每种特征图上的每个网格都预设了3个不同宽高比的anchor,用来预测和回归目标,因此上述的通道维度可以理解为在特征图的通道维度上保存了所有基于anchor先验框的位置信息和分类信息,如下图所示。

        这是YOLOv3提出来的预测框公式,但是V4作者觉得不合理。原因:当真实目标中心靠近左上角点或者右下角点(σ ( t x ) 和σ ( t y  )的取值需要为0或者1),直接预测出非常接近0或1的精确值是非常困难的,为了解决这个问题,V4作者引入了一个大于1的缩放系数(Scale) 

 

YOLOV4的公式:

YOLOV5的公式:

        为了将预测框的中心点约束到当前网格中,使用Sigmoid函数处理偏移量,使预测的偏移值保持在 (0,1)范围内。而V5中,根据目标框回归计算公式,预测框中心点坐标的偏移量保持在(-0.5,1.5)范围内,如上图所示,scale曲线比sigmoid曲线更好,y的取值更大。

        假设某个Ground Truth的中心点落在某个检测层上的某个网格中,除了中心点所在的网格之外,其左、上、右、下4个邻域的网格中,靠近Ground Truth中心点的两个网格中的anchor也会参与预测和回归,即一个目标会由3个网格的anchor进行预测,如下图所示 :

        正是因为前面目标框回归做出的改进,这里才能进行邻域网格也参与预测和回归,因为左图的红点在中心点偏左上,达到了目标框范围的都需要参与检测。

YOLOV5损失函数 

        YOLOv5的损失函数跟V4并没有多大区别,YOLOv5的损失主要包含三个方面:边界框损失(bbox_loss)、分类损失(cls_loss)、置信度损失(obj_loss)。总损失的表达式为:

边界框损失 

边界框损失IOU,交并比,它的作用是衡量目标检测中预测框与真实框的重叠程度。假设预测框为A,真实框为B

        在原v3、v4基础上考虑宽高比进行改进,YOLOv5默认使用CIoU来计算边界框损失,直到V8版本,边界框损失默认依然是CIOU,CIoU的损失计算公式为:

其中b和bgt 分别表示预测框和真实框的中心点,ρ表示两个中心点之间的欧式距离,c表示预测框和真实框的最小闭包区域的对角线距离,如下图所示:

分类损失

YOLOv5默认使用二元交叉熵函数来计算分类损失,直到V8,分类损失默认依然是二元交叉熵。二元交叉熵函数的定义为:

其中y为输入样本对应的标签(正样本为1,负样本为0),p为模型预测该输入样本为正样本的概率

置信度损失

        YOLOv5默认使用二元交叉熵函数来计算置信度损失。除此以外,对于不同尺度的检测层上得到的置信度损失,YOLOv5分配了不同的权重系数,按照检测层尺度从大到小的顺序,对应的默认的权重系数分别为4.0、1.0、0.4,即用于检测小目标的大尺度特征图上的损失权重系数更大,从而使得网络在训练时更加侧重于小目标。

        每个预测框的置信度表示这个预测框的可靠程度,值越大表示该预测框越可靠,也表示越接近真实框。如图所示,红点A 、B、C、D表示真实框的中心点,那么每个红点所在网格对应的anchor所预测和回归得到的预测框置信度应该比较大甚至接近1,而其它网格对应的预测框置信度则会比较小甚至接近0。

YOLOV5部署

我自定义的数据集是PCB的缺陷检测,数据集名称:PKU-Market-PCB(包含6种缺陷类型),首先需要了解YOLOV5的数据集是如何放置的,如下图:

YOLO标注格式:

• 目标类别的整数编号:从0开始计数,这个编号需要与模型训练时使用的类别编号一致。

• 目标中心点的归一化图像坐标(x, y):这两个值是浮点数,范围在0到1之间,表示目标中心点在图像中的相对位置。具体来说,x是目标中心点的横坐标除以图像的宽度,y是目标中心点的纵坐标除以图像的高度。

• 目标宽度和高度的归一化值(w, h):这两个值也是浮点数,范围在0到1之间,表示目标在图像中的相对大小。具体来说,w是目标的宽度除以图像的宽度,h是目标的高度除以图像的高度。

按照自定义的格式进行训练即可,epoch选择100次,结果如下图:

同样的操作,我又去YOLOV8进行了训练,同样的数据集,同样的平台,出来的效果是不一样的:

个人感觉V5的效果是比V8的效果好,并不是说版本越新越好,最近2024年5月24号已经发布了YOLOV10版本,所以有些时候版本经典更好用!下面展示验证效果图:

可以看到效果还是不错的,训练结果图也并没有过拟合,再次感叹YOLO系列写的实在是太好了,小白入门可以尝到甜头,增加对深度学习的学习兴趣,强烈推荐入门学习! 

结论

本人纯入门小白,不懂底层代码,如有错误请各位网友批评指正。也写的太多了,有关注的话后续更新一下如何自定义数据集、训练流程、推理源码分析!

标签:YOLOV5,定义数据,卷积,YOLOv5,损失,学习,模块,中心点,预测
From: https://blog.csdn.net/hong745124359/article/details/139708737

相关文章

  • YOLOv5改进策略|YOLOv5鸟类检测,准确率可以达到 87.40%,提升了21.25%,实时检测⻛力发电
    订阅专栏后私信获取完整源码+远程部署目录简介材料和数据收集实验环境实验数据方法YOLOv5RetinexNet模型测试结果与分析结论        ⻛力发电机组的安全是海上⻛电场稳定运行的前提。然而,⻦害对⻛力发电机和⻛力发电机叶片的安全运行构成直接威胁。此......
  • 泰山派学习11--字符设备驱动
    1、字符设备定义应用程序按字节/字符来读写数据的设备,不支持随机存取数据,系统直接从设备读取/写入每一个字符。2、字符设备抽象Linux内核中将字符设备抽象成一个具体的数据结构(structcdev),理解为字符设备对象。字符设备的打开、读写、关闭等操作接口(file_operation......
  • 全站首发!2024最新大模型LLM学习路线图来了!
    ChatGPT的出现在全球掀起了AI大模型的浪潮,2023年可以被称为AI元年,AI大模型以一种野蛮的方式,闯入你我的生活之中。从问答对话到辅助编程,从图画解析到自主创作,AI所展现出来的能力,超出了多数人的预料,让不少人惊呼:“未来是属于AI的”。AI大模型——成为互联网从业者必备技能。......
  • 机器学习的研究进展随着科技的飞速发展,机器学习领域的研究也在不断进步,为人类生活带来
    机器学习的研究进展随着科技的飞速发展,机器学习领域的研究也在不断进步,为人类生活带来了诸多便利。近年来,机器学习技术在各个领域取得了显著的研究成果,从基础算法的创新到应用场景的拓展,都展现出强大的生命力和广泛的应用前景。在算法层面,研究者们不断探索新的机器学习方法,以......
  • 学习C语言两个月后的收获(篇目二) #超详细的scanf() 讲解-->基本用法、scanf() 的返回值
    一.scanf1.基本用法:scanf()读取用户的键盘输入 ---->程序在运行到这个语句的时候,会停下来,等待用户从键盘输入。当用户输入数据之后按下回车,scanf()就会处理用户的输入,将其存入变量。 scanf()是库函数,其头文件是<stdio.h>    (注:标准输入一般是键盘;标准输出......
  • 基于RandLA-Net深度学习模型的激光点云语义分割
    一、场景要素语义分割部分的文献阅读笔记        RandLA-Net是一种高效、轻量级的神经网络,其可直接逐点推理大规模点云的语义标签。RandLA-Net基于随机点采样获得了显著的计算和内存效率,并采用新的局部特征聚合模块有效地保留了几何细节,弥补了随机采样可能丢失关键特......
  • k8s学习--Traffic Shifting 流量接入
    文章目录应用环境一、Argorollouts安装1.在Kubernetes集群中安装argorollouts2.安装argorollouts的kubectlplugin3.Argo-RolloutsDashboard二、负载均衡器metallb部署1.修改kube-proxy代理模式2.metallb部署3.IP地址池准备4.开启二层通告三、TrafficShifting......
  • [转]考试 PL-500 学习指南:Microsoft Power Automate RPA 开发人员
    考试PL-500学习指南:MicrosoftPowerAutomateRPA开发人员|MicrosoftLearn技能概览设计自动化(25-30%)开发自动化(45-50%)部署和管理自动化(20-25%)设计自动化(25-30%)使用PowerAutomate特性和功能设计自动化利用PowerAutomate生态系统区......
  • Python学习笔记8:入门知识(八)
    前言本篇是元组的知识点学习以及知识点的补充元组概念不可变的列表,叫做元组。在之前列表的特性中,我们就说过列表是可变的,但是在实际使用过程中,我们有时候仍然需要一系列不可变的元素,这个时候就需要元组出场了。定义元组看起来犹如列表,但使用圆括号而不是方括号来标识......
  • Linux 并发与竞争实验学习
    Linux并发与竞争实验学习原子操作实验这里原子操作就是采用原子变量来保护一个程序运行的完整过程,使用atomic来实现一次只能允许一个应用访问LED,创建atomic.c文件,其实改动内容就是添加原子变量,要在设备结构体数据添加原子变量,具体代码如下:structgpioled_dev{dev_td......