论文(3) Focal Loss

Focal Loss由KaiMing大神提出,旨在解决目标检测中类别不均衡问题,尤其是在One-Stage网络中。它通过修改Cross Entropy Loss,增加调制系数(1−pt)γ(1−pt)γ和平衡因子αtαt,优化了对难例的关注。Focal Loss在RetinaNet中得到应用,显著提升了COCO数据集上的检测效果。

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

Focal Loss

@(目标检测)

Focal Loss是KaiMing大神提出来的,这篇文章的重点在于分析了one-stage网络的检测精度为什么会弱于two-stage的网络。当原理分析出来之后,其实公式的更改就很简单了。这篇paper也自建了一个网络RetinaNet [1] [ 1 ] ,在COCO数据集上的检测效果达到了40%的效果,提升效果非常明显。
这里写图片描述


这篇文章提出One-Stage网络检测精度较于Two-Stage网络差的原因主要是Class Imbalance,类别不均衡。

这个类别不均衡包括了一个数据集里面,
- 不同类的物体数量差距巨大(比如一个数据集里面每张图片车很多人很少);
- 同类物体的图片里前景和背景的数量差距巨大(比如一张图片本身很大,但是里面只有一个孤零零的小人);
- 样本与样本检测的难易(easy exampling 和 hard example,有些图片里面的人可能比较大很好检测,有些图片里的人比较小就难检测了);

等等,数据集自带的数据不平衡的弊端,会严重影响数据集训练出来的网络效果。

One-Stage的网络,会对每个图片预测出成千上万个备选框 (作者举例如DPMs,SSD等,但是Yolo好像不是这样啊。Yolo v1一共预测98个框子,Yolo v2倒是上千了。),备选框多了会导致两个问题。
1. 负例样本数远超正例样本数会导致网络训练不到足够的正例样本的特征,这使得训练没有什么效果。
2. 负例样本数量多,容易学习,会导致训练方向完全导向学习负例样本的方向。

这两个问题很好理解。其实就是负例样本贡献的loss太多,会把正例样本贡献的loss给淹没掉,所以模型训练就跑偏了。

为什么Two-Stage的网络就不会出这种问题呢?
因为它们在生成预测框的时候,首先控制了数量,其次控制了正负样例的比例,还有诸如OHEM等方法去控制样本难易程度等,所以就不会,详情见RCNN系列。

回到文章,那面对样本类别不均衡,难易不均衡的问题,应该如何解决呢?

Focal Loss Definition

作者的想法很简单:既然用的是不平衡的数据集,那么为什么要用平衡的loss函数呢?
首先给出公式。

FL(pt)=αt(1pt)γlog(pt) F L ( p t ) = − α t ( 1 − p t ) γ l o g ( p t )

其中,
pt={ p,1p,if y=1
### 关于 Focal Loss论文及其相关内容 Focal Loss 是一种专为解决一阶段目标检测器中的类别不平衡问题而设计的损失函数[^1]。其核心思想在于重新调整标准交叉熵损失,以降低那些容易被分类的样本(即简单示例)对总损失的影响,从而使模型能够更加专注于难以分类的样本(困难示例)。这一方法显著提高了密集对象检测器的效果。 #### RetinaNet: 使用 Focal Loss 的经典案例 在《Focal Loss for Dense Object Detection》这篇论文中,作者提出了 RetinaNet 架构并引入了 Focal Loss 来应对前景与背景之间的极端类别不平衡问题[^4]。具体而言,当面对诸如 1:1000 这样的严重比例失衡时,传统的交叉熵损失会倾向于忽略少数类别的正样本,因为大量负样本主导了整个优化过程。通过应用 Focal Loss,可以有效缓解此类问题,并提升检测精度。 以下是该算法的一些关键技术要点: - **动态加权机制**: 对于每一个预测框, focal loss 动态地赋予不同难度级别的样例不同的权重值. - **γ参数控制聚焦程度**: γ是一个超参量用来调节难易区分度之间差异的重要性. 较高的gamma意味着更加强调困难例子. ```python def focal_loss(prediction_tensor, target_tensor, alpha=0.25, gamma=2): r""" Compute the focal loss between `logits` and the golden `target` values Args: prediction_tensor: The predicted outputs (before sigmoid). target_tensor: The ground truth labels {0 or 1}. alpha: A balancing factor to handle class imbalance problem. gamma: Modulating factor that focuses on hard negatives. Returns: Weighted cross entropy loss with modulation term added. """ zeros = tf.zeros_like(target_tensor) pos_p_sub = tf.where(tf.equal(target_tensor , 1), prediction_tensor - zeros, zeros) neg_p_sub = tf.where(tf.less(target_tensor, 1), zeros - prediction_tensor, zeros ) per_entry_cross_ent = -(alpha * ((pos_p_sub)**gamma) * tf.log(tf.clip_by_value(pos_p_sub,1e-8,1.)) + (1-alpha)*((neg_p_sub)**gamma ) *tf.log(1.-prediction_tensor)) return tf.reduce_sum(per_entry_cross_ent) ``` 此代码片段展示了如何实现基于 TensorFlow 的焦损计算逻辑。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值