YOLOv8

YOLOv 8 是一个 anchor-free 模型,并通过 TAA 标签分配和 DFL 损失提升模型效果

什么是 YOLOv8 ?

  • 在 YOLOv 7 的基础上提出 anchor-free 目标检测模型,并通过 TAA 标签分配和 DFL 损失提升模型效果

YOLOv8 的网络结构?

  • BackBone&Neck: YOLOv7 ELAN 设计思想,将 YOLOv5 的 C3 结构换成了梯度流更丰富的 C2f 结构,并对不同尺度模型调整了不同的通道数
  • Head: Head 部分较 yolov5 而言有两大改进:1)换成了目前主流的解耦头结构 (Decoupled-Head),将分类和检测头分离 2)同时也从 Anchor-Based 换成了 Anchor-Free

YOLOv8 的正样本匹配策略?

  • 使用 Task-Aligned Assigner,其简单总结为: 根据分类与回归的分数加权的分数选择正样本

YOLOv8 的损失函数?

  • Loss 计算包括 2 个分支: 分类和回归分支,没有了之前的 objectness 分支。
  • 分类分支依然采用 BCE Loss
  • 回归分支需要和 Distribution Focal Loss 中提出的积分形式表示法绑定,因此使用了 Distribution Focal Loss,同时还使用了 CIoU Loss。3 个 Loss 采用一定权重比例加权即可
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class DFL(nn.Module):
    # Integral module of Distribution Focal Loss (DFL) proposed in Generalized Focal Loss
    def __init__(self, c1=16):
    super().__init__()
    self.conv = nn.Conv2d(c1, 1, 1, bias=False).requires_grad_(False)
    x = torch.arange(c1, dtype=torch.float)
    self.conv.weight.data[:] = nn.Parameter(x.view(1, c1, 1, 1))
    self.c1 = c1

    def forward(self, x):
    b, c, a = x.shape # batch, channels, anchors
    return self.conv(x.view(b, 4, self.c1, a).transpose(2, 1).softmax(1)).view(b, 4, a)
    # return self.conv(x.view(b, self.c1, 4, a).softmax(1)).view(b, 4, a)

YOLOv 8 的训练?

  • 参考 YOLOX,训练最后 10 次,关闭 Mosiac

参考:

  1. YOLOv8 详解 【网络结构 + 代码 + 实操】-CSDN 博客