目标检测任务中对正负样本的理解

本文探讨了目标检测任务中正负样本的定义、作用以及优化策略,如FocalLoss如何处理类别不平衡和困难样本。同时提到了ATSS自适应样本选择机制,它能自动划分正负样本,减少对超参数的依赖。
摘要由CSDN通过智能技术生成

本文内容是自己关于目标检测任务中对正负样本的理解供自己学习使用,内容是从网络中收集资料整理,侵删,如果有理解不对的地方也请大家指正。

二分类交叉熵损失

交叉熵损失

交叉熵损失的通用公式为:
在这里插入图片描述

二分类交叉熵损失

二分类交叉熵损失一般写为以下格式:
在这里插入图片描述
其实本质上与通用的交叉熵损失公式一致,这里只是进行了展开和一部分替换。
可以视为 -p1 * log(q1) - p2 * log(q2),因为是二分类,q2 = 1- q1。当样本为正样本时,p1=1,p2 = 0,负样本时候p1 = 0,p2 =1。 将这里的q转换为代表正样本概率的p(不是通用公式中的p),就可得到以上公式。
这种省略的好处就是不需要[0,1],[1,0]这样的label 标签存在,,只需要知道该样本是正样本还是负样本,也只需要训练一个预测模块来预测样本为正样本的概率即可。
在多分类中,预测模块必须预测每个种类的概率。

目标检测中正负样本

什么是正负样本

目标检测任务中,无论是二阶段还是一阶段模型大多都是基于锚框(anchor)的结构,只有DETR相关的一些模型是直接预测边界框。而基于锚框结构的目标检测模型,都会存在正负样本的概念。

锚框是为了能够更好的预测图片中物体的位置,在图片中以每个像素为中心提前设定了不同尺寸的预备边界框,这些预备边界框被成为锚框。基于锚框的目标检测模型从本质上来说,就是从这些锚框中选择出最贴近真实边界框的锚框a,并预测锚框a 与真实边界框的偏移量,结合锚框a 和 预测的偏移量得到模型预测的边界框。
在这里插入图片描述
显而易见,在图像中充斥着大量的锚框,这些锚框中一些与真实边界框相差很远,一些则很相近,我们称前者为负样本,后者为正样本。

正负样本的作用

负样本: 负样本是模型用来区分目标对象和背景的参考。通过对负样本的识别,模型可以学习到背景区域的特征,从而在目标检测中排除背景干扰,提高检测的准确性。负样本只参与类别预测的损失计算,不参与边界框回归预测的损失计算。

正样本:过对正样本的识别和定位,模型可以学习到目标对象的特征,从而实现准确的目标检测。正样本同时被用来计算类别预测损失和边界框回归预测损失。
通俗一点说,负样本主要是在从锚框中筛选候选边界框起作用,正样本告诉模型哪些锚框是候选边界框,负样本则告诉模型哪些不是,训练模型对锚框分类的二分类能力。而正样本除了告诉模型表现是候选边界框外,还需要用来训练模型预测候选框到真实框的偏移量,因此正样本的选择至关重要。在ATSS提出的论文中指出,选择合理的正样本选择策略可以提升所有基于锚框机制的目标检测模型。

有关正负样本的问题

从正负样本的定义中就可知,一般情况下,正样本的数量远远少于负样本的数量,这就导致了类别不平衡的问题。为了解决这个问题,通常会采用一些策略来平衡正负样本的比例,例如引入正负样本加权、在线困难样本挖掘等技术。

正负样本的优化策略

Focal Loss

何恺明团队提出了Focal Loss ,是一种用于处理类别不平衡和困难样本的损失函数,用于解决一般交叉熵损失函数在处理类别不平衡问题时的不足之处。

在训练过程中,通常存在大量容易分类的样本和少量困难样本。虽然容易分类的样本损失值小,而困难样本的损失值大,但是由于两者数目极度不平衡,所以损失值还是主要受易分类样本影响。传统的交叉熵损失函数会平等地对待所有样本,这可能导致容易分类的样本主导了梯度更新,而困难样本的梯度信息被稀释了。Focal Loss 通过引入一个调节因子来解决这个问题,使得模型更加关注困难样本,从而提高模型对于困难样本的学习效果。

Focal Loss 的定义如下:

在这里插入图片描述
其中,FL(p t) 是模型预测的概率,通常使用 softmax 或 sigmoid 函数得到,
-αt 是一个权重参数,用于平衡类别不平衡,γ 是一个调节因子,用于调整困难样本的权重。
(1−pt) γ 部分使得容易分类的样本在损失中的贡献被减小,而困难样本的贡献增加。

而由于关于正负样本的问题都是二分类问题,所以以上式子在实际中也会如何二分类交叉熵一样表示。实现Focal Loss 的代码一般写为:

def sigmoid_focal_loss(logits, targets, gamma, alpha):
    num_classes = logits.shape[1]
    dtype = targets.dtype
    device = targets.device
    class_range = torch.arange(1, num_classes + 1, dtype=dtype, device=device).unsqueeze(0)

    t = targets.unsqueeze(1)
    p = torch.sigmoid(logits)
    term1 = (1 - p) ** gamma * torch.log(p)
    term2 = p**gamma * torch.log(1 - p)
    #可以看到通过正负样本分为两种情况,类似于二分类交叉熵
    return -(t == class_range).float() * term1 * alpha - ((t != class_range) * (t >= 0)).float() * term2 * (1 - alpha)

ATSS 自适应样本选择机制(Adaptive Training Sample Selection)

以往的正负样本选择策略通常依赖于敏感的超参数,比如IOU阈值或尺度范围。即使在这些超参数设置好的情况下,可以找到大多数的正样本,但仍然会忽略一些超出范围的目标。由于超参数的不同,导致了产生的结果差异很大。因此,研究人员提出了ATSS算法,它根据目标的统计特性自动划分正负样本,几乎不需要任何超参数。
ATSS 的伪代码如下:
在这里插入图片描述
可以看出,ATSS的思路就是根据锚框和真实框的IOU进行统计分析得到合适的IOU阈值,然后通过该阈值来选正负样本。

  • 19
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值