yolov5源码解析

前言

第一次写博客,为了方便每次隔一段时间重看yolov5源码都会忘记很多细节,都要重新找然后看很多文章,直接自己写博客记录下来。
参考文章:YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml
YOLOv5源码逐行超详细注释与解读(7)——网络结构(2)common.py
万字长文!YOLO算法模型yaml文件史上最详细解析与教程!小白也能看懂!掌握了这个就掌握了魔改YOLO的核心!

1、两个重要图片

YOLOv5有四个版本n,s,m,l,输入图片尺寸都为640×640,经过32倍下采样,输出3个预测特征层。
各个版本模型网络结构相同,只是网络深度和宽度不同。
在这里插入图片描述
在这里插入图片描述

2、Neck部分——FPN+PANet

3、common.py文件

Bottleneck子模块

	在CNN中,卷积层和池化层等操作会影响特征图的空间尺寸。例如:
卷积层:
如果使用1x1卷积核,通常不会改变特征图的空间尺寸,但会改变通道数。
如果使用3x3卷积核,且步长为1,填充为1,则输出特征图的空间尺寸保持不变。
如果使用3x3卷积核,且步长为2,则输出特征图的空间尺寸会减半。
池化层:
如果使用最大池化或平均池化,通常会减少特征图的空间尺寸
	因此,以下模块中的cv1,cv2两个卷积操作仅仅改变特征图通道数,不会改变尺寸。
class Bottleneck(nn.Module):
    # Standard bottleneck
    def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_, c2, 3, 1, g=g)
        self.add = shortcut and c1 == c2

    def forward(self, x):
        return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
C3模块中,三个卷积操作cv1,cv2,cv3和n*Bottleneck操作均不会改变特征图尺寸大小,
因此C3模块不会改变特征图尺寸大小。

C3模块

class C3(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))

    def forward(self, x):
        return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

4、yolov5s.yaml文件

网络深度:C3模块中的子模块Bottleneck数量 实际Bottleneck数量=number×深度因子
网络宽度:网络每层输出通道数 实际输出通道数=channels×宽度因子

锚框和预测框

参考文章:YOLO中锚框,预测框,产生候选区域及对候选区域进行标注详解
在YOLOv5的检测过程中,每个特征图上的网格单元会预测多个边界框,每个边界框与一组锚框尺寸相关联。模型会根据预测的偏移量和尺度调整这些锚框,以定位目标。使用多尺度预测和不同尺寸的锚框可以提高模型检测不同大小目标的能力。

在目标检测任务中,通常会以某种规则在图片上生成一系列锚框,将这些锚框当成可能的候选区域。模型对这些候选区域是否包含物体进行预测,如果包含目标物体,则还需要进一步预测出物体所属的类别。还有更为重要的一点是,由于锚框位置是固定的,它不大可能刚好跟物体边界框重合,所以需要在锚框的基础上进行微调以形成能准确描述物体位置的预测框,模型需要预测出微调的幅度。

简单的说,锚框对于预测框来说,就相当于网络对其的初始化权重。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值