【目标检测】YOLOv8算法实现(二):正样本匹配(TaskAlignedAssigner)和损失计算

本文记录硕士阶段YOLO系列目标检测算法自学及代码实现过程,重点介绍YOLOv8正样本匹配与损失计算。正样本匹配基于TAA,经对齐分数计算、初筛、精选、过滤等步骤;损失计算包括类别、位置、置信度损失,还给出了代码实现思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  本系列文章记录本人硕士阶段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所示。

在这里插入图片描述

YOLOv8损失计算流程

1 正样本匹配

  YOLOv8基于TaskAlignedAssigner分配策略实现正样本的匹配,其匹配过程如下:

  1. 对齐分数计算,得到实际目标类别标签gt_labels在所有预测类别分数pred_labels中对应的分数 s s s,计算目标位置标签gt_bboxes和所有位置预测信息pred_bboxes的CIoU值 u u u,计算对齐分数:
    t = s α + u β t=s^α + u^β t=sα+uβ
    其中 α α α β β β为权重超参数;
  2. 初筛正样本,选取中心点在gt_bboxes内的预测点作为正样本匹配位置;
  3. 精选正样本,根据对齐分数 t t t在初步筛选的正样本中进一步选取 t o p K topK topK个预测点作为正样本匹配位置;
  4. 过滤正样本,若一个预测点匹配到多个gt_bboxs,则选取具有最大CIoUgt作为该预测点匹配的正样本;

2 损失计算

  YOLOv8的损失计算方法如下:

  • 类别损失(仅计算正样本):BCE Loss(基于对齐分数 t t t C I o U CIoU CIoUsoft 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 CIoUsoft 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=0na(yilog(σ(pi))(1yi)log(σ(pi)))/inayi
    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
关于YOLOv11中的置信度损失函数的具体实现细节,在当前可获得的信息中并没有直接提及YOLOv11版本的内容。不过,可以基于YOLO系列模型的一般特性来推测其可能的设计思路。 ### YOLO系列模型中的置信度损失YOLO系列模型中,置信度损失用于衡量预测边界框与真实边界框之间的重叠程度以及是否存在目标物体。对于YOLOv3而言,该框架计算三个不同尺度下的三种不同的损失,并汇总这些损失以进行反向传播[^1]。然而,具体到置信度损失部分: - **对象存在时的置信度损失**:当网格单元内确实含有目标中心点时,期望网络能够输出较高的置信度分数。此时,置信度损失反映了预测边界框与实际地面真值(ground truth)之间IOU(Intersection over Union)的距离。 - **无对象情况下的置信度损失**:如果某个网格单元不包含任何目标,则希望对应的置信度接近于零。这种情况下,即使有多个候选框被激活,也应尽可能降低它们的权重影响整体性能。 虽然上述描述主要针对较早版本的YOLO架构,但对于后续改进版如假设存在的YOLOv11来说,基本理念应该保持一致——即通过优化算法使得模型能够在检测到目标时给出高分而在空白区域维持低分。 ```python def compute_confidence_loss(pred_boxes, target_boxes, object_mask): """ 计算置信度损失 参数: pred_boxes (Tensor): 预测的目标边框坐标 target_boxes (Tensor): 实际的目标边框坐标 object_mask (Tensor): 表明哪些位置应当视为有效目标 返回: Tensor: 置信度损失值 """ ious = calculate_ious(pred_boxes, target_boxes) # IOUs between predicted and true boxes conf_loss_obj = tf.reduce_sum((object_mask * (ious - pred_boxes[..., 4])**2)) / (tf.reduce_sum(object_mask)+1e-6) conf_loss_noobj = tf.reduce_sum(((1-object_mask) * pred_boxes[..., 4]**2)) / (tf.reduce_sum(1-object_mask)+1e-6) return conf_loss_obj + conf_loss_noobj ``` 此代码片段展示了如何根据预测框真实框计算置信度损失的一个简化例子。请注意这只是一个示意性的实现方式;真实的YOLOv11可能会采用更复杂的机制或额外的技术手段提升效率及准确性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

初初初夏_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值