在计算机视觉(CV)任务里常常会碰到类别不平衡的问题, 例如:
1. 图片分类任务,有的类别图片多,有的类别图片少
2. 检测任务。现在的检测方法如SSD和RCNN系列,都使用anchor机制。 训练时正负anchor的比例很悬殊.
3. 分割任务, 背景像素数量通常远大于前景像素。
从实质上来讲, 它们可以归类成分类问题中的类别不平衡问题:对图片/anchor/像素的分类。
再者,除了类不平衡问题, 还有easy sample overwhelming的问题。easy sample如果太多,可能会将有效梯度稀释掉。
这两个问题通常都会一起出现。 如果不处理, 可能会对模型性能造成很大伤害。用Focal Loss里的话说,就是训练不给力, 且会造成模型退化。
常见的解决办法介绍
常见的方法有online的, 也有非online的;有只处理类间不平衡的,有只处理easy example的, 也有同时处理两者的。
非online:
- Hard Negative Mining, 非online的mining/boosting方法, 以‘古老’的RCNN(2014)为代表, 但在CV里现在应该没有人使用了(吧?)。若感兴趣,推荐去看看OHEM论文里的related work部分。
online:
- Mini-batch Sampling,以Fast R-CNN(2015)和Faster R-CNN(2016)为代表。Fast RCNN在训练分类器, Faster R-CNN在训练RPN时,都会从N = 1或2张图片上随机选取mini_batch_size/2个RoI或anchor, 使用正负样本的比例为1:1。若正样本数量不足就用负样本填充。 使用这种方法的人应该也很少了。(解决类别不平衡)
- Online Hard Example Mining, OHEM(2016)。将所有sample根据当前loss排序,选出loss最大的N个,其余的抛弃。(解决easy example )
- Online Hard Negative Mining, OHNM, SSD(2016)里使用的一个OHEM变种, 在Focal Loss里代号为OHEM 1:3。在计算loss时, 使用所有的positive anchor, 使用OHEM选择3倍于positive anchor的negative anchor。(同时考虑了类间平衡与easy sample)。
- Class Balanced Loss。计算loss时,正负样本上的loss分别计算, 然后通过权重来平衡两者。暂时没找到是在哪提出来。(它只考虑了类间平衡)
- Focal Loss(2017), 最近提出来的。不会像OHEM那样抛弃一部分样本, 而是和Class Balance一样考虑了每个样本, 不同的是难易样本上的loss权重是根据样本难度计算出来的。(同时考虑了类间平衡和easy example问题)
Hard Negative Mining:
RCNN中将重叠阈值设置为0.3,小于这个阈值认为是负类,大于这个阈值认为是正类。而不是0.5 或者其他的。阈值的选取对于最终的性能有很大影响。文中从(0.1–0.5)中进行选取的。
https://www.cnblogs.com/nowgood/p/Hardexamplemining.html
一般来说, 负样本远多于正样本, 如 99% 的负样本, 那么算法不需要训练直接输出为负例, 准确率也会有 99%, 那么正负样本不均衡时, 预测偏向于样本多的一方, 对于目标检测而言, 负例多, 所以被预测为 false negative(即预测为负例的正样本) 可能性比较大.
Mini-batch Sampling:
Fast RCNN 采用的是随机抽样, 使得正负样本的比例为 1:3, 为何是1:3, 而不是1:1呢? 可能是正样本太少了, 如果 1:1 的话, 一张图片处理的 ROI 就太少了, 不能充分的利用 Roi Pooling 前一层的共享计算, 训练的效率就太低了, 但是负例比例也不能太高了, 否则算法会出现上面所说的 false negative 太多的现象, 选择 1:3 这个比例是算法在性能和效率上的一个折中考虑, 同时 OHEM(online hard example mining)一文中也提到负例比例设的太大, Fast RCNN 的 mAP将有很大的下降.
Online Hard Example Mining(OHEM):
1、之前是随机选择ROI进行之后roi net的操作,论文中则可以通过OHEM选择那些检测困难的样本,并进行之后的roi net。
2、在OHEM中,所有的proposal都先通过roi net进行forward操作,在backward的过程中,因为只对那些loss很大的roi进行了bp,因此计算量没有增加太多。
3、在使proposal经过roi net之前,使用NMS去除重叠的bbox。
4、在这里因为只使用那些loss很大的roi做bp,因此不需要设置fg-bg ratio,因为那些被忽视的正例的loss会越来越高,在之后样本选择的过程中会有更大的概率被选中进行bp。
implementation details:
1、在实现的过程中,我们可以将所有non-hard roi的loss修改为0,但是这种方法仍然会对所有的roi进行bp的运算,这回造成大量的内存损耗。
2、针对以上问题,使用下列解决方案:使用2个RoI network,它们之间共享参数,一个roi network只用于forward,它是只读的,计算loss之后,选取hard example之后,将其作为另外一个roi network的输入,这个network是用于forward与backward的,整体的流程图如下

4、Class Balanced Loss
CELoss:
In the above y ∈ {±1} specifies the ground-truth class and p ∈ [0, 1] is the model’s estimated probability for the class with label y = 1.
For notational convenience, we define pt:
and rewrite
where
Class Balanced Loss:
为交叉熵,加入权重。正负类加入各自的权重
A common method for addressing class imbalance is to introduce a weighting factor α ∈ [0, 1] for class 1 and 1 − α for class −1.
5、Focal Loss:
接着4,定义FocalLoss。
where 见公式(4),
见公式(2)。
主要是针对较难分的 样本产生的损失值,容易划分的样本损失值小。作用于所有的正负样本上。为每一个样本都定义了一个权重,根据每个样本的值。
gamma = 2 , alpha = 0.25
Refference:
https://blog.csdn.net/weixin_35653315/article/details/78327408
网友评论