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
13class 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
参考: