本系列文章记录本人硕士阶段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)与损失计算
0 引言
YOLOv8
的正样本匹配和损失计算流程如图1所示。
1 正样本匹配
YOLOv8
基于TaskAlignedAssigner分配策略
实现正样本的匹配,其匹配过程如下:
- 对齐分数计算,得到实际目标类别标签
gt_labels
在所有预测类别分数pred_labels
中对应的分数 s s s,计算目标位置标签gt_bboxes
和所有位置预测信息pred_bboxes
的CIoU值 u u u,计算对齐分数:
t = s α + u β t=s^α + u^β t=sα+uβ
其中 α α α和 β β β为权重超参数; - 初筛正样本,选取中心点在
gt_bboxes
内的预测点作为正样本匹配位置; - 精选正样本,根据对齐分数 t t t在初步筛选的正样本中进一步选取 t o p K topK topK个预测点作为正样本匹配位置;
- 过滤正样本,若一个预测点匹配到多个
gt_bboxs
,则选取具有最大CIoU
的gt
作为该预测点匹配的正样本;
2 损失计算
YOLOv8
的损失计算方法如下:
类别损失(仅计算正样本
):BCE Loss(基于对齐分数 t t t和 C I o U CIoU CIoU的soft ont-shot
)
y = t × C I o U max / t max y = t \times CIo{U_{\max }}/{t_{\max }} y=t×CIoUmax/tmax
YOLOv8
中采用基于对齐分数 t t t和 C I o U CIoU CIoU的soft labels
,如上式所示。
C l s L o s s ( y , p ) = ∑ i = 0 n a ( − y i log ( σ ( p i ) ) − ( 1 − y i ) log ( σ ( p i ) ) ) / ∑ i n a y i ClsLoss(y,p) = \sum\limits_{ {\rm{i}} = 0}^{na} {( - {y_i}\log (\sigma ({p_i})) - (1 - {y_i})} \log (\sigma ({p_i})))/\sum\limits_i^{na} { {y_i}} ClsLoss(y,p)=i=0∑na(−yilog(σ(pi))−(1−yi)log(σ(pi)))/i∑nayi
n a na na表示所有正样本匹配预测点位置损失(仅计算正样本)
P o s L o s s = C I o U L o s s + D F L PosLoss = CIoULoss + DFL PosLoss=CIoULoss+DFL
C I o U L o s s = ∑ i n a l i ( 1 − C I o U i ) / ∑ i = 1 n a l i CIoULoss = \sum\limits_i^{na} { {l_i}(1 - CIo{U_i})} /\sum\limits_{i = 1}^{na} { {l_i}} CIoULoss=i∑