损失函数
1、边界框损失函数/回归损失函数bbox_loss
2、分类损失函数cls_loss
3、置信度损失函数obj_loss
YOLOv8损失函数
1、概述
通过YOLOv8-训练流程-正负样本分配的介绍,我们可以知道,经过预处理与筛选的过程得到最终的训练数据:
a. 网络输出值:pred_scores[bx8400xcls_num]、pred_bboxes[bx8400x4]
b. 训练标签值:
target_scoresbx8400xcls_num,在计算损失时与预测结果pred_scores[bx8400xcls_num],计算交叉熵损失,该损失是对每个类别计算BCE Loss,因为类别预测采用的sigmoid分类器。
target_bboxesbx8400x4,在计算损失时,分别与预测的pred_bboxes计算Ciou Loss, 同时与pred_regs(预测的anchors中心点到各边的距离)计算回归DFL Loss。
c. 训练mask值:fg_mask [bx8400],对8400个anchor进行正负样本标记,计算损失过程中通过fg_mask筛选正负样本。
2、损失函数
1、类别分类损失cls_loss
在yolov8中,类别损失最终采用的是交叉熵损失,该方法是我们非常熟知的,不再赘述。
代码如下:
self.bce = nn.BCEWithLogitsLoss(reduction='none')
loss[1] = self.bce(pred_scores,target_scores).sum()/target_scores_sum
其中预测pred_scores: b x 8400 x cls_num; target_scores: b x 8400 x cls_num, 相当于对于每个box,其cls_num个分类都视为二分类,并进行交叉熵运算。
2、边界框回归损失bbox_loss
边框回归,采用的是DFL Loss + CIOU Loss
target_bboxes /= self.stride_scales
loss[0],loss[2] = self.bbox_loss(pred_regs,pred_bboxes,self.anc_points,target_bboxes,
target_scores,target_scores_sum,fg_mask)
DFL loss:
weight = torch.masked_select(target_scores.sum(-1), fg_mask).unsqueeze(-1)
# DFL loss
if self.use_dfl:
target_ltrb = self.bbox2reg(anchor_points, target_bboxes, self.reg_max)
loss_dfl = self._df_loss(pred_regs[fg_mask].view(-1, self.reg_max + 1), target_ltrb[fg_mask]) * weight
FasterRCNN损失函数
1、由于frcnn的网络结构主要是两个网络组成,损失函数分为四个部分。
RPN分类损失:anchor是否为gt
RPN位置回归损失:anchor位置微调
ROI分类损失:ROI所属类别
ROI位置回归损失:继续对ROI位置微调
四个损失相加就是最后的损失,反向传播,更新参数。
2、RPN损失
1、分类损失:cross_entropy
2、回归损失:smooth L1 loss
3、ROI损失(与RPN类似)
1、分类损失
2、回归损失
在Faster R-CNN模型中,有两个主要的组件:区域提议网络(Region Proposal Network, RPN) 和 Fast R-CNN检测器。这两个组件分别负责生成候选区域(region proposals)和最终的目标检测,它们各自计算并优化不同的损失函数。
RPN的损失
RPN的目标是生成高质量的候选区域,它同时执行分类和回归任务:
分类损失:RPN需要判断每个锚框(anchor)是否包含目标物体,通常使用二元分类(前景vs背景)。损失函数通常采用交叉熵损失(Cross-Entropy Loss),有时也称为Log Loss。对于每个锚框,如果它与任一GT框的重叠超过阈值,则认为它是正样本(前景),否则为负样本(背景)。
回归损失:对于每个前景锚框,RPN需要预测边界框的偏移量,以便更准确地定位目标。回归损失通常采用Smooth L1损失(也称为Huber损失),因为它对大的残差(预测误差)更为稳健。
ROI的损失(Fast R-CNN部分的损失)
Fast R-CNN检测器接收RPN生成的候选区域,然后进行更详细的分类和边界框回归:
分类损失:对于每个候选区域(Region of Interest, ROI),Fast R-CNN需要预测物体的类别。这同样采用交叉熵损失,但是这次是多分类损失,因为它需要区分多个不同的物体类别。
回归损失:类似于RPN的回归损失,Fast R-CNN也需要优化边界框的位置。然而,这里的边界框回归是针对每个类别进行的,因为不同类别的物体可能有不同的形状和比例。这也通常使用Smooth L1损失。
总体损失
在训练过程中,RPN的损失和Fast R-CNN部分的损失会被加权求和,形成总损失函数。这是因为两个部分的目标是相关的,但又各自负责不同的任务。优化整个模型的总损失有助于同时改善区域提议的质量和最终的检测精度。
损失函数的细节
RPN的分类损失通常使用Sigmoid函数进行二元分类,而Fast R-CNN的分类损失使用Softmax函数进行多分类。
RPN的回归损失和Fast R-CNN的回归损失都采用Smooth L1损失,但Fast R-CNN的回归损失可能在每个类别上都有一个独立的分支,这意味着它实际上是多个Smooth L1损失的组合。
通过这种方式,Faster R-CNN模型能够在训练过程中同时优化区域提议和最终的检测结果,从而实现高效且准确的目标检测。
YOLOv8和RT-DETR(Real-Time DETR)是两种不同的目标检测框架,它们在设计哲学和损失函数的选择上存在一些关键的区别。下面我将概述这两种模型的损失函数及其差异。
YOLOv8的损失函数
YOLOv8是YOLO系列的一个最新版本,它采用了以下几种损失函数:
-
VFL Loss (Variational Focal Loss):用于分类损失,它结合了交叉熵损失和focal loss的优点,以解决类别不平衡问题,尤其是当小目标数量较少时。
-
CIOU Loss (Complete Intersection over Union Loss):用于边界框回归,CIOU Loss不仅考虑了IoU(交并比),还考虑了中心点的距离和长宽比,提供了更全面的边界框回归度量。
-
DFL Loss (Distribution Focal Loss):用于边界框坐标预测的细化,通过预测边界框坐标的分布来进一步优化回归。
RT-DETR的损失函数
RT-DETR是基于Transformer架构的实时目标检测模型,它借鉴了DETR的设计,但进行了优化以实现更快的速度。其损失函数包括:
-
分类损失:通常使用交叉熵损失,用于预测每个检测框的类别。
-
边界框回归损失:RT-DETR可能使用L1损失或GIoU(Generalized IoU)损失等,用于优化检测框的位置。
-
匈牙利匹配算法:这是DETR及其衍生模型的核心特点之一,用于在没有先验假设的情况下匹配预测框和真实框,从而确定哪些预测框应该被哪些真实框监督。
区别
-
匹配机制:YOLOv8采用Task-Aligned匹配策略,而RT-DETR则依赖于匈牙利算法进行预测框与真实框的匹配。Task-Aligned匹配考虑了任务的特性来优化匹配过程,而匈牙利算法则是一种全局最优的匹配策略。
-
损失函数:YOLOv8使用了更复杂的损失函数组合,如VFL和CIOU Loss,旨在提高小目标检测的性能和边界框回归的准确性。RT-DETR的损失函数相对简单,更侧重于速度和效率。
-
架构差异:YOLOv8继承了YOLO的一贯风格,使用卷积神经网络(CNN)进行特征提取和预测,而RT-DETR基于Transformer架构,这在模型结构和计算流程上有本质的不同。
这些区别反映了YOLOv8和RT-DETR在设计上的不同取向,YOLOv8追求在各种场景下的高性能,而RT-DETR则强调实时性和计算效率,两者在特定的应用场景下各有优势。