目标检测之Focal Loss

Focal Loss是一种改进的Log Loss,旨在解决目标检测中样本不均衡问题。它通过引入抑制参数,减少易分类样本的权重,使模型更关注难分类样本。在图像分割中,尤其适用于二分类任务,通过调整alpha和gamma参数,平衡类别不均衡和样本难度。

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

focal loss的提出是在目标检测领域,为了解决难分样本和易分样本不均衡的问题。主要思想就是添加一个一个抑制参数,使得在训练计算损失时,抑制容易分类的样本的权重,从而让模型能够重点学习辨别那些不易区分的样本。是由log loss改进而来的,为了于log loss进行对比,公式如下:
在这里插入图片描述
其基本思想就是,对于类别极度不均衡的情况下,如果添加 ( 1 − p i ) γ (1−p_i)^{\gamma} (1pi)γ则会使预测概率大的样本(易分样本)得到的loss变小,而预测概率小的样本(难分样本),loss变得大,从而加强对难分样本的关注度。可以改善目标不均衡的现象,对此情况比 binary_crossentropy 要好很多。
目前在图像分割上只是适应于二分类。
详情参考retinanet

有两个参数可调, alpha和gamma.
alpha是控制类别不平衡的.
gamma是控制难易样本的.

alpha越大,recall会越高,precision会越低.
文中alpha取0.25,即正样本要比负样本占比小,这是因为负例易分

  • 当alpha增大时,比如说增大到1, 以一个检测的二分类为背景, 这时候focal loss就不会包含负样本的loss了, 想要focal loss最小我只要全预测为正即可, 这时候自然recall就会100%, precision也会降低.

  • 当alpha减小,比如减小到0, 这时候focal loss中只有负样本的loss, 那只要网络对所有样本全预测成负的就可以了.这时候recall就变成了0, precision也就100%了.

gamma越大,易分类样本的重要性越低,通常取gamma=2。

### 目标检测Focal Loss原理 在目标检测任务中,类别不均衡是一个常见问题。具体来说,在一幅图像中有背景像素的数量远多于前景对象的像素数量。这种不平衡会导致模型倾向于预测大多数类(即背景),从而影响小物体或稀有类别的识别精度。 为解决这一挑战,RetinaNet引入了一种损失函数——Focal Loss (FL)[^1]。此损失旨在通过调整交叉熵损失来降低容易分类样本的影响并聚焦于困难负例的学习上。其核心思想是在标准二元交叉熵基础上加入两个调节因子: - **α平衡项**:用于处理正负样本之间的比例失衡; - **γ调制因子**:用来减少简单样例对总损失贡献的同时增加难分错例子的重要性权重; 公式表达如下所示: \[ FL(p_t)=−α(1−p_t)^γ\log⁡(p_t)\] 其中\( p_t \)表示真实标签对应的预测概率值;当实际类别为正类时取预测得分,反之则采用1减去该分数作为输入给定到上述方程里计算最终得到的结果就是针对单个实例所造成的惩罚程度[^3]。 ```python import torch.nn.functional as F def focal_loss(input, target, alpha=0.25, gamma=2.0): """ Args: input: tensor of shape (N,C), where N is the batch size and C is number of classes. The raw, unnormalized score for each class before passing through softmax or sigmoid activation function. target: tensor of same shape with `input`, containing ground truth labels encoded by one-hot vectors. alpha: float scalar representing weight factor to balance positive/negative samples during training process. gamma: float scalar that controls how much emphasis should be put on hard examples. Returns: Tensor: computed loss value averaged over all elements in mini-batch. """ prob = F.softmax(input, dim=-1) ce_loss = F.cross_entropy(input, target.argmax(dim=1)) pt = torch.sum(target * prob, dim=-1) fl = -alpha*(1-pt)**gamma*ce_loss return fl.mean() ``` ### 应用场景 Focal Loss最初是为了改善单一阶段的目标探测器而设计出来的解决方案之一。它被广泛应用于各种计算机视觉项目当中,尤其是在那些存在显著类别偏斜现象的任务环境中表现优异。除了经典的二维图片分析之外,还扩展到了视频理解、三维点云处理等领域内,并且对于自然语言处理中的序列标注也有借鉴意义[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值