《Libra R-CNN: Towards Balanced Learning for Object Detection》笔记

news/2024/7/9 23:50:19 标签: 目标检测

Introduction

这篇论文针对目标检测训练过程中的不平衡问题,提出了一种平衡化学习方法。关于目标检测中的不平衡问题,这篇博客有更详细的介绍。

这篇论文讨论的不平衡问题包括三种:

  • 样本级别的不平衡:对于二阶段的目标检测算法,样本是通过随机采样得到的,这会导致大多数样本都是容易样本(容易学习),缺乏难样本。
  • 特征级别的不平衡:由于低层的特征层主要包含内容描述信息,高层特征层主要包含语义信息,不同特征层的特征信息不平衡。
  • 目标级别的不平衡:目标检测是多任务学习任务,有识别和定位两个目标,对应两种目标函数,这两种目标函数的损失值是不平衡的。

论文针对上述的3中不平衡问题,分别提出了3中解决方法:IoU-balanced sampling, balanced feature pyramid 和 balanced L1 loss。三种方法结合在一起,组成了Libra R-CNN。

IoU-balanced sampling

IoU平衡采样提出来的思路是这样的。首先,论文统计了一下随机采样和Hard Negative采样得到的样本与gt的IoU,并制作了相应的统计直方图,如下
IoU distribution
作者发现,超过60%的难负样本的IoU大于0.05,而随机采样的样本中只有30%的样本的IoU大于0.05。这种极端的样本不平衡使得大量的难样本替换成了容易样本。

为了使得采样样本的IoU分布接近难负样本采样样本的IoU分布,作者提出了IoU平衡采样。假设我们需要从M个候选样本中选择N个负样本,那么每个样本随机被选择的概率是 p = N M p = \frac{N}{M} p=MN。为了提高难负样本被选择的概率,作者根据IoU平均地划分采样区间成K个bin。将N个所需的负样本平均分配到到每个bin中。我们再从这些bin中统一选择样本。这就是IoU平衡采样。现在,每个样本的采样概率是
p k = N K ∗ 1 M k , k ∈ [ 0 , K ) p_k = \frac{N}{K} * \frac{1}{M_k}, k \in [0, K) pk=KNMk1,k[0,K)
前一项表示bin被选择的概率,后一项表示再bin中被选择的概率, M k M_k Mk表示第k个bin的候选样本数量。因为难负样本被平均分配到每个bin,难负样本在bin中被选择的概率变大,而设置好K值,难负样本被选择的概率变大了。通过IoU平衡采样得到的样本的IoU分布如上图所示,可以看到和难负样本采样的IoU分布近似了。论文中K默认设置为3。

Balanced Feature Pyramid

作者的平衡特征金字塔的每一层的特征信息来自不同级别的特征层,不同级别的特征层的贡献度都一样,平衡特征金字塔的构造方式如下图所示
Balanced Feature Pyramid
如上图所示,作者先把所有的特征层聚合起来,低级别的层下采样,高级别的层上采样,大小变成C4的大小,然后所有层的特征进行平均,得到Integrate,再由Integrate反向操作生成不同级别的特征层。也可以对Integrate进行refine,加些卷积层,或者加入高斯non-local模块。

通过这种方法生成的Balanced Feature Pyramid的每个特征层都包含相等的低级和高级特征信息,达到特征平衡。

Balanced L1 Loss

目标检测使用的smooth L1 loss有些缺点,首先它还是很容易受到outlier的影响,作者发现,相比于outliers,inliers平均每样本只贡献30%的梯度。作者把smooth L1 loss大于等于1的样本称为outlier,其他是inlier。作者希望在回归损失中把inliers和outliers分开,截断outliers的大梯度为1,同时增大inliner的梯度,使得inliers和outliers的贡献的梯度平衡。样本的梯度贡献如下图a所示
balanced L1 loss的梯度和loss曲线图
regression error指样本的smooth L1损失,纵坐标表示Balanced L1 Loss的梯度和损失。

Balanced L1 Loss的公式如下
L loc = ∑ L b ( t i u − v i ) L_\text{loc} = \sum L_b(t_i^u - v_i) Lloc=Lb(tiuvi)
其中 L b L_b Lb表示每个样本的平衡L1损失。为了达到作者想要的梯度效果,作者设置了单个样本的损失梯度:
∂ L b ∂ x = { α ln ⁡ ( b ∣ x ∣ + 1 )  if  ∣ x ∣ < 1 γ otherwise \frac{\partial L_b}{\partial x} = \begin{cases} \alpha \ln (b |x|+1) & \text{ if } |x| \lt 1 \\ \gamma & \text{otherwise} \end{cases} xLb={αln(bx+1)γ if x<1otherwise
其中 γ \gamma γ控制着梯度的上限,论文默认设置为1.5。 α \alpha α控制着inliers的梯度, α \alpha α越小,inliers梯度越大,如上图a所示。论文默认设置 α = 0.5 \alpha=0.5 α=0.5

由上如的梯度公式可以推导出单个样本的平衡L1损失:
L b ( x ) = { α b ( b ∣ x ∣ + 1 ) ln ⁡ ( b ∣ x ∣ + 1 ) − α ∣ x ∣  if  ∣ x ∣ < 1 γ ∣ x ∣ + C otherwise L_b(x) = \begin{cases} \frac{\alpha}{b} (b |x|+1) \ln (b |x|+1) - \alpha |x| & \text{ if } |x| \lt 1 \\ \gamma |x| + C & \text{otherwise} \end{cases} Lb(x)={bα(bx+1)ln(bx+1)αxγx+C if x<1otherwise
参数的约束是
α ln ⁡ ( b + 1 ) = γ \alpha \ln (b + 1) = \gamma αln(b+1)=γ

Experiments

experiments


http://www.niftyadmin.cn/n/819487.html

相关文章

NOIP2017 心路历程

虽然没能去考试,但是在学弟们考试前后也发生了很多事情. 周四晚上.学弟们出发前最后一天.单独找几个人谈了谈.面对退役他们还是有点慌啊.这个时候给他们调整心态或许有点迟了. 21:45.最后一分钟.为他们送上祝福.挥手作别.走出机房.散向宿舍. 已经没什么能帮你们的了. 愿你们比赛…

《课后作业-阅读任务-阅读提问-3》

Page 363 如何衡量工作量&#xff1f; 转载于:https://www.cnblogs.com/iZyx/p/7839530.html

Hibernate框架学习之注解配置关系映射

上篇文章我们通过注解对映射了单个实体类&#xff0c;但是具体项目中往往实体类之间又是相互关联的&#xff0c;本篇文章就是从实体类之间存在的不同关联角度&#xff0c;具体学习下如何映射他们之间的关联&#xff0c;主要涉及内容如下&#xff1a; 单向的一对一关联关系映射单…

eclipse 创建Java web项目 Cannot change version of project facet Dynamic web module to xxx

问题描述&#xff1a; 用Eclipse创建Java web项目时选择的Artifact Id为maven-artchetype-webapp&#xff0c;由于这个archetype比较老&#xff0c;用的servlet还是2.3的。 而现在一般至少都是2.5&#xff0c;在Project Facets里面修改Dynamic web module为2.5 的时候就会出现C…

图像的局部墒速度优化

1、香农墒定义 信息论大师香农给出了信息随机性的度量&#xff0c;称为信息墒。信息的随机性越大&#xff0c;信息墒就越大。假定事件s1,s2,s3……sn&#xff0c;它们出现的概率为p(s1),p(s2)……p(sn)&#xff0c;则每个事件的平均不确定性用香农墒&#xff08;Shannon entrop…

201621123034 《Java程序设计》第9周学习总结

作业09-集合与泛型 1. 本周学习总结 1.1 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结集合与泛型相关内容。 答&#xff1a;Map的HashMap中使用嵌套类static class Node<K,V>来存放&#xff0c;在该类上实现了Map.Entry<K,V>接口&#xff0c;Ent…

算法复杂度+构建堆+十字链表补做

十字链表-题目 附件中有向图的十字链表 解答 算法复杂度3-题目 用 Java语言实现下列算法并进行单元测试&#xff0c; 请给出算法的时间复杂度。 &#xff08;1&#xff09;求一个整数二维数组Arr[N][N]的所有元素之和。 &#xff08;2&#xff09;对于输入的任意 3 个整数&…

字典函数

##字典的每个元素都是键、值对应user_info { "name":"test", "age":35, "sex":"nan"}#索引 是“name”,"age" 对应的值是:"test","35"print (user_info["sex"])返回值…