目标检测中的样本不平衡处理方法——OHEM, Focal Loss, GHM, PISA

GitHub
简书
优快云

1. 前言

目前。计算机视觉中的性能最好的目标检测方法主要分为两种: one-stage 和two-stage 方法。two-stage方法分为两步,第一步为候选区域生成阶段(Proposal stage),通过如Selective Search、EdgeBoxes等方法可以生成数量相对较小候选目标检测框;第二步为分类与回归阶段,对第一阶段生成的 Candiate Proposal 进行分类和位置回归。one-stage 代表性的方法是R-CNN系列,如 R-CNN, Fast R-CNN, Faster R-CNN。 而one-stage 方法直接对图像的大量 Candiate Proposals 进行分类与回归。

这两类方法中均存在类别不平衡问题,two-stage 方法通过第一步已经将当量的候选区域降低到一个数量较小的范围,同时又在第二步通过一些启发式原则,将正负样本的比例降低到一定程度。而 one-stage 优于没有这降低候选框的步骤,因此,候选区域的数量大大超过 two-stage 方法,因此,在精度上,two-stage 仍然优于 one-stage 方法,但是在速度和模型复杂度上, one-stage 占优势。

类别不平衡会使检测器评估 1 0 4 − 1 0 6 10^4-10^6 104106 的候选位置,但是通常只有少量的位置存在目标,这回导致两个问题:

  1. 由于大量的 easy negative 对模型的训练没有提供很大的作用,因此训练很低效;
  2. 由于在训练中 easy negatives 在数据中占主导,因此这些样本会覆盖少量的正样本的损失(即负样本的损失梯度占主导),从而导致模型退化。

因此,解决样本不平衡问题是提高目标检测精度的一个关键技术之一。

2. OHEM

论文题目:Training Region-based Object Detectors with Online Hard Example Mining

OHEM 是通过改进 Hard Example Mining 方法,使其适应online learning算法特别是基于SGD的神经网络方法。Hard Example Mining 通过交替地用当前样本集训练模型,然后将模型固定,选择 False Positive 样本来重新组建用于下一次模型训练的样本集。但是因为训练神经网络本事就是一个耗时的操作,这样在训练中固定模型,这样会急剧降低模型的训练进程。

Hard Examples Mining通常有两种方法:

  1. 用于优化 SVM 的方法: 该方法首先需要一个工作的样本集,用来训练 SVM, 使其在该样本集上收敛,然后通过某些原则来添加或删除某些样本以更新该样本集。该原则是:删除那些简单样本(Easy Examples), 即分类正确的概率高与某个阈值(个人理解,原话The rule removes examples that are “easy” in the sense that they are correctly classified beyond the current model’s margin. Conversely), 添加那些困难那样本,即分类正确的概率低于某个阈值(the rule adds new examples that are hard in the sense that they violate the current model’s margin)

  2. 用于非SVM的方法:该方法首先用完整的数据集中的正样本和一个随机的负样本及来构成开始的训练样本集,然后训练模型使其在该训练集上收敛,然后完整的数据集中选择 False Positive 添加到训练样本集中。

OHEM算法的大致流程是: 首先计算出每个ROI的loss, 然后按loss从高到低来排列每个 ROI, 然后为每张图片选择 B / N B/N B/N 个损失最高的 ROI 作为Hard Examples,其中 B 表示总的 ROI 数量, N N N 表示batch-size 的大小,在 Fast R-CNN 中, N=2, B=128时,效果很好。

但是如果直接按照 loss 对所有的 ROI 进行选择,会有一个缺点,由于 ROI 很多,这样 很多 ROI 的位置就会相关并重叠,如果和某个高 Loss 的 ROI 重合度很高的其它 ROI很多, 这样, 这些 ROI 的 Loss 通常也会很多,这样这些样本都会被选择,但是它们可以近似认为时同一个,这样就会给其它较低 Loss 的 ROI 更少的选择余地,这样就会存在冗余。为了消除这种冗余,作者提出先使用 NMS (non-maximum suppression) 删除部分重合度很高的 ROI, 在使用上述方法进行 选择 Hard Example。

实现技巧:

论文,作者将该方法是现在 Fsat R-CNN 目标检测方法中。最简单做法是更改损失函数层,损失函数层首先计算所有 ROI 的 loss, 然后根据 loss 对 ROI 进行排序,并选择 hard RoIs, 让 那些 non-RoIs的损失变为0. 这种方法虽然很简单,但是非常不高效,因为还需要为所有的 RoIs 分配进行反向传播时需要的内存空间。

为了克服这个缺点,作者对下面的 Figure 1 进行改进, 如下面的 Figure 2.该改进时使用两份同样的 RoI network。 其中一个是只读的(readonly), 即只进行前向计算,不进行反向传播优化,所以只需要为前向传播分配内存,它的参数实时保持和另一个 RoI network(regular RoI network)保持一样。在每次迭代时,首先使用 readonly RoI network 对每个 ROI 计算起 loss,然后用上面描述的选择 hard RoIs 的方法选择 hard RoIs. 然后利用 regular RoI network来对选择的 hard RoIs 进行前向和后向计算来优化网络。

在这里插入图片描述
在这里插入图片描述

3. Focal Loss

论文题目 Focal Loss for Dense Object Detection

3.1 Cross Entropy

在改论文中,作者认为样本类别的不平衡可以归结为难易样本的不平衡,从而更改交叉熵损失函数,重新对样本赋予不同的权值,之前的模型这些样本都是同等重要的,从而使模型训练更加关注 hard examples。

首先引入交叉熵的公式:

(公式1) C E ( p , y ) = { − log ⁡ ( p ) , i f y = = 1 − log ⁡ ( 1 − p ) , o t h e r w i s e CE(p, y)=\begin{cases} -\log (p), \quad if \quad y == 1 \\ -\log(1-p), \quad otherwise \end{cases} \tag{公式1} CE(p,y)={ log(p),ify==1log(1p),otherwise(1)

其中, y ∈ { − 1 , 1 } y\in\{-1, 1\} y{ 1,1},表示真实类别, p ∈ [ 0 , 1 ] p\in[0,1] p[0,1]表示我们预测的概率,为了方便,我们定义:

(公式2) p t = { p , i f y = = 1 1 − p , o t h e r w i s e p_t=\begin{cases} p, \quad if \quad y == 1 \\ 1-p, \quad otherwise \end{cases} \tag{公式2} pt={ p,ify==11p,otherwise(2)

因此, C E ( p , y ) = C E ( p t ) = − log ⁡ ( p t ) CE(p,y)=CE(p_t)=-\log(p_t) CE(p,y)=CE(pt)=log(pt),该方法在 p t p_t pt 较大时,该loss是一个较小的量级, 如下图的连线所示所示,因为存在大量的易分类样本,相加后会淹没正样本的loss。

在这里插入图片描述

3.2 Balanced Cross Entropy

一个常见的解决类别不平衡的方式是引入一个加权因子 α ∈ [ 0 , 1 ] \alpha \in [0,1] α[0,1] 来表示正样本的权重, 1 − α 1-\alpha 1α表示负样本的权重。我们按照定义 p t p_t pt 的方法重新定义 α \alpha α α t \alpha_t αt, α − b a l a n c e C E l o s s \alpha-balance\quad CE \quad loss αbalanceCEloss 定义如下:

(公式3) C E ( p , y ) = C E ( p t ) = − α t log ⁡ ( p t ) CE(p,y)=CE(p_t)=-\alpha_t\log(p_t) \tag{公式3} CE(p,y)=CE(pt)=αtlog(pt)(3)

3.3 Focal Loss

α − b a l a n c e C E l o s s \alpha-balance\quad CE \quad loss αbalanceCEloss 虽然可以平衡 positive和negative的重要性,但是对 easy/hard 样本还是无法区分, Focal loss 通过更 Cross loss来达到区分easy/hard的目的:

(公式4) F L ( p t ) = − ( 1 − p t ) γ log ⁡ ( p t ) FL(p_t)=-(1-p_t)^\gamma\log(p_t) \tag{公式4} FL(pt)=(1pt)γlog(pt)(4)

上图展示了不同 γ \gamma γ 取值对应的 loss,通过分析上述公式,我们发现,当 p t p_t pt 非常小时,即样本被分类错误,此时 ( 1 − p t ) γ (1-p_t)^\gamma (1pt)γ 接近1, loss几乎不受影响,当 p t p_t pt 接近于1时,即样本被分类正确,此时 ( 1 − p t ) γ (1-p_t)^\gamma (1pt)γ 接近0,此时降低了该样本的权重,比如,取 γ = 2 \gamma=2 γ=2, 当时 p t = = 0.9 p_t==0.9 pt==0.9时,该样本的 loss 会降低100倍,

在实际应用中,作者使用了该 Focal loss的变体,即加入了 α \alpha α 平衡因子:

(公式5) F L ( p t ) = − α t ( 1 − p t ) γ log ⁡ ( p t ) FL(p_t)=-\alpha_t(1-p_t)^\gamma\log(p_t) \tag{公式5} FL(pt)=αt(1pt)γlog(pt)(5)

3.4 模型初始化

作者提出,对于二分类,一般模型的模型初始化会同概率的对待正负样本,由于类别不平衡,负样本的 loss 会占主导,作者提出在训练初始阶段对正样本的概率估计“prior”的概念,用 π \pi π 表示, 通过设置它来达到正样本的输出概率低的效果,比如为0.01,从而使模型更加关注正样本。实际操作中,出了最后一个用于分类的卷积层,其余卷积层的参数初始化为bias b = 0 b=0 b=0 ,而最后一层 b = − log ⁡ ( ( 1 − π ) / π ) b=-\log((1-\pi)/\pi) b=log((1π)/π), 实验中设置为 0.01.

两个实现细节

  1. 计算 total loss 时,是对一张图片上所有的 ~100k 的anchors 的 focal loss求和,而并不像使用启发式的 RPN 和 OHEM 使用部分小的anchors来计算 loss。 然后通过拥有 gt box 的anchors的数量来进行归一化,不适用所有 anchors 的数量进行归一化的原因是: 由于anchors 存在大量的 easy examples, 因此得到的 Focal loss非常小,如果使用所有 anchors 的数量进行归一化,回导致归一化后的 loss 非常小。

  2. 当只使用 α \alpha α 时, 将 α \alpha α 偏向样本少的类别,当同时使用 α 和 γ \alpha 和 \gamma αγ 时,他们需要向相反方向变化,论文中设置为 α = 0.25 , γ = 2 \alpha=0.25,\gamma=2 α=0.25γ=2.

4.GHM(Gradient Harmonizing Mechanism)

论文题目: Gradient Harmonized Single-stage Detector

改论文提出 Focal Loss 存在两个缺点:

  1. loss 存在两个超参数,调节该参数是一个费力的操作;
  2. 该 loss 是一个不会随着数据分布变化而变化的静态 loss。

该论文有一句概括该篇论文的核心思想的一句话: 类别的不平衡可以归结为难易样本的不平衡,难易样本的不平衡可以归结为梯度的不平衡原话如下:

In this work, we first point out that the class imbalance can be summarized to the imbalance in difficulty and the imbalance in difficulty can be summarized to the imbalance in gradient norm distribution.

如下图所示:

在这里插入图片描述

左边是样本数量关于梯度的分布,中间表示各个修正后的函数的梯度(使用了log scale)对原始梯度的,右边表示所有样本集的梯度贡献的分布。

4.1 Cross Entropy

(公式6) L C E ( p , p ∗ ) = { − log ⁡ ( p ) , i f p ∗ = = 1 − log ⁡ ( 1 − p ) , i f p ∗ = = 0 L_{CE}(p, p^*)=\begin{cases} -\log (p), \quad if \quad p^* == 1 \\ -\log(1-p), \quad if \quad p^* == 0 \end{cases} \tag{公式6} LCE(p,p)={ log(p),ifp==1log(1p),ifp==0(6)

定义 x x x 是模型未经过 sigmoid 之前的输出, 则 p = s i g m o i d ( x ) p = sigmoid(x) p=sigmoid(x),得出该损失函数对 x x x 的梯度为:

(公式7) ∂ L C E ( p , p ∗ ) ∂ x = {

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值