【目标检测】YOLOv8算法实现(一):模型搭建

  本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github,删减了源码中部分内容,满足个人科研需求。
  本篇文章在YOLOv5算法实现的基础上,进一步完成YOLOv8算法的实现。YOLOv8相比于YOLOv5,最主要的不同之处如下:

  • 模型结构:将YOLOv5中的CSP模块替换为C2f模块,将Detect(耦合头 + Anchor-based)模块替换为Detect模块(解耦头 + Anchor-free + DFL)
  • 正样本匹配:采用TaskAlignedAssigner分配策略
  • 损失计算
    • 类别损失:二值交叉熵损失
    • 位置损失:Distribution Focal Loss(DFL) + CIOU Loss
    • 置信度损失:YOLOv8不预测模型的目标置信度,不再使用该损失

文章地址:
YOLOv8算法实现(一):模型搭建
YOLOv8算法实现(二):正样本匹配(TaskAlignedAssigner)与损失计算

1 模型结构

  YOLOv8的模型结构如图1所示,其包含以下几个模块:

  • CBS:卷积层、批标准化(BN)和SiLU激活函数
  • C2f:多梯度融合特征提取模块
  • SPPF:快速金字塔池化特征层
  • Detect:检测头(解耦头 + Anchor-free + Distribution)

在这里插入图片描述

2 模型模块实现(common.py)

2.1 C2f模块

class Bottleneck(nn.Module):
    '''
    残差连接瓶颈层, Residual block
    '''
    def __init__(self, c1, c2, shortcut=True, g=1, e=0.5, k=1):
        '''
        :param c1: 输入通道
        :param c2: 输出通道
        :param shortcut: 为True时采用残差连接
        :param g: groups 在输出通道上分组, c2 // g 分组后不同组之间的卷积核参数不同
        :param e: 中间层的通道数
        '''
        super(Bottleneck, self).__init__()
        c_ = int(c2 * e)  # 中间层的通道
        self.cv1 = Conv(c1, c_, k, 1)  # ch_in, ch_out, kereal_size, stride
        self.cv2 = Conv(c_, c2, 3, 1, g=g)
        self.add = shortcut and c1 == c2
    def forward(self, x):
        out = self.cv2(self.cv1(x))
        return x + out if self.add else out
        
class C2f(nn.Module):
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv((2 + n) * self.c, c2, 1)
        self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, e=1.0, k=3) for _ in range(n))

    def forward(self, x):
        y = list(self.cv1(x).split((self.c, self.c), 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.cv2(torch.cat(y, 1))

2.2 Detect模块(解耦头 + Anchor-free + Distribution)

  YOLOv8对结果的预测有如下特征:

  • 基于不同分辨率的特征图实现对不同大小的目标预测;
  • 每张特征图以像素为单位为单位,对中心点落在该像素单位的目标进行预测,每个单位负责得到一个预测结果;

  假设特征图数量为 n l nl nl,特征图中的分辨率为 ( g r i d _ x i , g r i d _ y i ) (grid\_xi,grid\_yi) (grid_xi,grid_y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初初初夏_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值