[论文解读] A Ranking-based, Balanced Loss Function Unifying Classification and Localisation in Object De
文章内容
- 相关研究现状
- 1. 定位任务和分类任务的平衡/耦合
- 2. 基于排名的目标检测算法
- 本文工作
- 基于排序损失的误差驱动优化方法推广
- 定理1:基于概率分布的损失函数重定义
- 定理2:正负样本梯度总和相等
- aLRP Loss 定义
- aLRP的反向传播
- 代码解读
论文链接:A Ranking-based, Balanced Loss Function Unifying Classification and Localisation in Object Detection
基于mmdet实现代码:aLRP Loss
相关研究现状
主流损失函数定义为L=Lc+wrLrL=L_c+w_rL_rL=Lc+wrLr,存在如下缺点:
- 定位任务和分类任务之间缺乏关联,难以兼顾定位精度和分类精度
- 存在超参wrw_rwr,对于需要花较长时间训练的网络来说调参困难
- 受到正负样本不均衡/异常值的影响较大,需要设计合理的采样策略或特殊的损失函数(通常需要调参)
1. 定位任务和分类任务的平衡/耦合
- Classification-aware regression loss 使用锚框的分类得分对定位损失进行加权;
- LapNet 基于任务的同方差不确定性将超参wrw_rwr定义为一个可学习调优的参数
- 其他方法在NMS步骤中对分类和定位分支的输出进行融合
2. 基于排名的目标检测算法
基于排名的损失计算方法能够一定程度缓解正负样本不平衡问题,但目前的算法大都仅限于分类任务,并没有改变定位分支
- AP Loss 使用误差驱动的更新机制来计算梯度
- DR Loss 使用Hinge Loss来增加正负样本之间的差值
本文工作
- 基于AP Loss的误差驱动优化算法,扩展出一个能够优化不可导的排序损失的通用框架
- 证明基于排序的损失函数能够自然平衡正负样本
- 提供aLRP Loss及其梯度传播的实现,能够替换AP loss、SmoothL1 loss等损失函数并提高网络性能
基于排序损失的误差驱动优化方法推广
定理1:基于概率分布的损失函数重定义
在AP Loss排序损失L=1Z∑i∈Pl(i)L=\frac{1}{Z}\sum_{i\in P}l(i)L=Z1∑i∈Pl(i)中,ZZZ是标准化常量。
定义LijL_{ij}Lij是对正样本iii和负样本jjj的损失计算,可以看作正样本iii经由概率p(j∣i)p(j|i)p(j∣i)在负样本jjj上的损失,即
Lij={l(i)p(j∣i)fori∈P,j∈N0otherwiseL_{ij}=\begin{cases} l(i)p(j|i)& for\space i\in P,j\in N\\ 0& otherwise \end{cases} Lij={l(i)p(j∣i)0for i∈P,j∈Notherwise
因此,AP Loss排序损失可表示为L=1Z∑i∈Pl(i)=1Z∑i∈P∑j∈NLijL=\frac{1}{Z}\sum_{i\in P}l(i)=\frac{1}{Z}\sum_{i\in P}\sum_{j\in N}L_{ij}L=Z1∑i∈Pl(i)=Z1∑i∈P∑j∈NLij。
这个表达方式更为灵活,可以通过定义p(i∣j)p(i|j)p(i∣j)改变损失函数的分布,或使之侧重于困难样本。
定理2:正负样本梯度总和相等
∑i∈P∣∂L∂si∣=∑j∈N∣∂L∂sj∣\sum_{i\in P}|\frac{\partial L}{\partial s_i}|=\sum_{j\in N}|\frac{\partial L}{\partial s_j}| i∈P∑∣∂si∂L∣=j∈N∑∣∂sj∂L∣
aLRP Loss 定义
将AP Loss的扩展成aLRP Loss以解决上述三个不足。参考检测准确度(precision)和AP Loss之间的关联,我们将aLRP Loss定义为PR曲线上正样本的LRP均值:
LaLRP:=1∣P∣∑i∈PlLRP(i)L^{aLRP}:=\frac{1}{|P|}\sum_{i\in P}l^{LRP}(i) LaLRP:=∣P∣1i∈P∑lLRP(i)
假定锚框足够密集,能够覆盖所有gt,即NFN=0N_{FN}=0NFN=0(没有gt被忽略/检测为负样本),正样本集合PPP即TPTPTP,负样本集合NNN即FPFPFP,FNFNFN不参与损失函数的计算。因此参考LRP评价指标的定义:
LRP(s)=1NFN+NTP+NFP(NFN+NFP+∑k∈TPεloc(k))LRP(s)=\frac{1}{\cancel{N_{FN}}+N_{TP}+N_{FP}}\left(\cancel{N_{FN}}+N_{FP}+\sum_{k\in TP}\varepsilon_{loc}(k)\right) LRP(s)=NFN+NTP+NFP1(NFN+NFP+k∈TP∑εloc(k))
对于正样本iii,损失值lLRP(i)l^{LRP}(i)lLRP(i)定义如下,其中NFP(i)N_{FP}(i)NFP(i)和rank(i)=NTP(i)+NFP(i)rank(i)=N_{TP}(i)+N_{FP}(i)rank(i)=NTP(i)+NFP(i)分别表示样本iii在负样本和全体正负样本中的排名:
lLRP(i)=1rank(i)(NFP(i)+εloc(i)+∑k∈P,k≠iεloc(k)H(xik))l^{LRP}(i)=\frac{1}{rank(i)}\left(N_{FP}(i)+\varepsilon_{loc}(i)+\sum_{k\in P,k\neq i}\varepsilon_{loc}(k)H(x_{ik})\right) lLRP(i)=rank(i)1⎝⎛NFP(i)+εloc(i)+k∈P,k=i∑εloc(k)H(xik)⎠⎞
该式也可以拆分为两部分,分别表示分类损失和定位损失:
lLRP(i)=NFPrank(i)+1rank(i)(εloc(i)+∑k∈P,k≠iεloc(k)H(xik))l^{LRP}(i)=\textcolor{orangered}{\frac{N_{FP}}{rank(i)}}+\textcolor{blue}{\frac{1}{rank(i)}\left( \varepsilon_{loc}(i)+\sum_{k\in P,k\neq i}\varepsilon_{loc}(k)H(x_{ik})\right)} lLRP(i)=rank(i)NFP+rank(i)1⎝⎛εloc(i)+k∈P,k=i∑εloc(k)H(xik)⎠⎞
可以发现,aLRP Loss只对分类正确的样本计算定位损失,因此在网络训练初始阶段,分类效果不佳时,损失函数由分类损失主导,网络很难对定位分支进行优化。为了缓解这个问题,引入一个自平衡参数,参考定理2可知正负样本的梯度贡献相等,对定位框梯度∂LaLRP∂B\frac{\partial L^{aLRP}}{\partial B}∂B∂LaLRP乘以该epoch的均值LaLRPLlocaLRP\frac{L^{aLRP}}{L_{loc}^{aLRP}}LlocaLRPLaLRP,从而使得分类得分和定位梯度对aLRP Loss的贡献相近。
- 如图(a)所示,正样本的梯度会受到(1)得分更高的正样本的定位精度和(2)得分更高的负样本的影响,图中p1p_1p1得分更高但定位精度较差,导致p2p_2p2的梯度增大以压制p1p_1p1;
- 如图(b)所示,负样本的梯度会受到比其得分更低的全部正样本的均匀影响,以其总和构成梯度;
- 如图©所示,根据定义,得分最高的正样本定位损失会出现在所有样本的定位损失中。
aLRP的反向传播
与AP Loss同样,aLRP Loss可以定义为LijaLRP=lLRP(i)p(j∣i)L_{ij}^{aLRP}=l^{LRP}(i)p(j|i)LijaLRP=lLRP(i)p(j∣i),其目标值定义如下:
LijaLRP∗=LaLRP(i)∗⋅p(j∣i)=1rank(i)(NFP(i)+εloc(i)+∑k∈P,k≠iεloc(k)H(xik))⋅p(j∣i)=εloc(i)rank(i)⋅p(j∣i)\begin{aligned} L_{ij}^{aLRP^*}&=L^{aLRP}(i)^*·p(j|i)\\ &=\frac{1}{rank(i)}\left( \cancel{N_{FP}(i)}+\varepsilon_{loc}(i)+ \cancel{\sum_{k\in P,k\neq i}\varepsilon_{loc}(k)H(x_{ik})} \right)·p(j|i) \\&=\frac{\varepsilon_{loc}(i)}{rank(i)}·p(j|i) \end{aligned} LijaLRP∗=LaLRP(i)∗⋅p(j∣i)=rank(i)1⎝⎛NFP(i)+εloc(i)+k∈P,k=i∑εloc(k)H(xik)⎠⎞⋅p(j∣i)=rank(i)εloc(i)⋅p(j∣i)
从而有xijx_{ij}xij的误差驱动更新量如下,进而可求∂LaLRP∂si\frac{\partial L^{aLRP}}{\partial s_i}∂si∂LaLRP。
Δxij=(lLRP(i)∗−lLRP(i))p(j∣i)=−1rank(i)(NFP(i)+∑k∈P,k≠iεloc(k)H(xik))H(xij)NFP(i)\begin{aligned} \Delta x_{ij}&=\left( l^{LRP}(i)^*-l^{LRP}(i) \right)p(j|i) \\&=-\frac{1}{rank(i)}\left( N_{FP}(i)+\sum_{k\in P,k\neq i}\varepsilon_{loc}(k)H(x_{ik}) \right)\frac{H(x_{ij})}{N_{FP}(i)} \end{aligned} Δxij=(lLRP(i)∗−lLRP(i))p(j∣i)=−rank(i)1⎝⎛NFP(i)+k∈P,k=i∑εloc(k)H(xik)⎠⎞NFP(i)H(xij)
Highlight
- 在分类任务和定位任务中都使用排名策略,即分类和定位分支都用到了检测器的全部输出,而不是像传统方法中彼此独立工作,从而能够兼顾高检测精度和高定位质量
- 只有一个不需要调试的超参数(来自软化的阶跃函数H(⋅)H(·)H(⋅)),相比于state-of-the-art方法的六个超参数更容易训练
- 该网络由单个损失函数训练,在正负样本间提供可证明的平衡策略
代码解读
代码结构与AP Loss相似,输出一个classification_gradsclassification\_gradsclassification_grads作为反向传播的依据。
其中正样本的损失值由该样本的排序质量和回归质量决定,torch.sum(fg_relations * regression_losses)
表示所有相对于该样本排序不正确的正样本的回归损失,FP_num/rank[ii]
表示该正样本的排名损失;
而负样本的损失值由所有与之排序错误的正样本共同决定,relevant_bg_grad += (bg_relations*(-fg_grad[ii]/FP_num))
,其中正样本总损失值越大,排名损失越小,对这个负样本的损失值影响越大。
class aLRPLoss(torch.autograd.Function):@staticmethoddef forward(ctx, logits, targets, regression_losses, delta=1., eps=1e-5): classification_grads = torch.zeros(logits.shape).cuda()# ---------------------## Filter fg logits# ---------------------#fg_labels = (targets == 1)fg_logits = logits[fg_labels]fg_num = len(fg_logits)rank = torch.zeros(fg_num).cuda()prec = torch.zeros(fg_num).cuda()fg_grad = torch.zeros(fg_num).cuda()# --------------------------------------## Filter non-trivial negative samples# --------------------------------------## Do not use bg with scores less than minimum fg logit# since changing its score does not have an effect on precisionthreshold_logit = torch.min(fg_logits)-delta# Get valid bg logitsrelevant_bg_labels = ((targets == 0) & (logits >= threshold_logit))relevant_bg_logits = logits[relevant_bg_labels]relevant_bg_grad = torch.zeros(len(relevant_bg_logits)).cuda()# -----------------------------## Loop on posivite indices# -----------------------------## sort the fg logits and loop over each positive following the orderorder = torch.argsort(fg_logits)for ii in order:# x_ij s as score differences with fgsfg_relations = fg_logits - fg_logits[ii]# Apply piecewise linear function and determine relations with fgs (H(x_ij))fg_relations = torch.clamp(fg_relations/(2*delta)+0.5, min=0, max=1)# Discard i=j in the summation in rank_posfg_relations[ii] = 0# x_ij s as score differences with bgsbg_relations = relevant_bg_logits - fg_logits[ii]# Apply piecewise linear function and determine relations with bgsbg_relations = torch.clamp(bg_relations / (2 * delta) + 0.5, min=0, max=1)# Compute the rank of the example within fgs and number of bgs with larger scores rank^+(i)rank_pos = 1 + torch.sum(fg_relations)FP_num = torch.sum(bg_relations)# Store the total since it is normalizer also for aLRP Regression error rank(i)rank[ii] = rank_pos + FP_num# Compute precision for this example to compute classification lossprec[ii] = rank_pos/rank[ii]# For stability, set eps to an infinite small value (e.g. 1e-6), then compute grads# no AP interpolation hereif FP_num > eps:# fg_grad = regression_loss + ranking_lossfg_grad[ii] = -(torch.sum(fg_relations * regression_losses) + FP_num)/rank[ii]# bg_grad += fg_grad/N_FPrelevant_bg_grad += (bg_relations*(-fg_grad[ii]/FP_num))# aLRP with grad formulationclassification_grads[fg_labels] = fg_gradclassification_grads[relevant_bg_labels] = relevant_bg_gradclassification_grads /= fg_numcls_loss = 1-prec.mean()ctx.save_for_backward(classification_grads)return cls_loss, rank, order@staticmethoddef backward(ctx, out_grad1, out_grad2, out_grad3):g1, = ctx.saved_tensorsreturn g1*out_grad1, None, None, None, None
[论文解读] A Ranking-based, Balanced Loss Function Unifying Classification and Localisation in Object De相关推荐
- 论文阅读-2 | Meta-Learning with Task-Adaptive Loss Function for Few Shot Learning
论文目录 0 概述 0.1 论文题目 0.2 摘要 1 简介 2 相关的工作 3 提出的方法 3.1 前言 3.1.1 提出问题 3.1.2 模型无关元学习 Model-agnostic meta-l ...
- 【论文解读】深度学习目标检测的开山鼻祖 |R-CNN详解 | 两阶段目标检测代表
目录 前言 目标检测近年里程碑 深度学习目标检测 1 R-CNN简介 1.1 何为R-CNN? 1.2 摘要 1.2.1 论文综述 1.2.2 优点汇总 1.2.3 缺点汇总 2. RCNN网络结构解 ...
- 论文解读《Structured Pruning for Deep Neural Networks with Adaptive Pruning Rate Derivation Based on Con》
论文:Structured Pruning for Deep Neural Networks with Adaptive Pruning Rate Derivation Based on Connec ...
- 机器学习笔记 soft-DTW(论文笔记 A differentiable loss function for time-series)
1 soft-DTW来由 DTW 算法通过动态规划求解了两个序列的相似度.这个过程1是离散的,不可微的.如果要将其应用作为神经网络的损失函数,这是不行的.因为神经网络通过对损失函数结果进行梯度下降的方 ...
- 论文解读 Greedy Function Approximation:A Gradient Boosting Machine
论文链接: https://xueshu.baidu.com/usercenter/paper/show?paperid=ab7165108163edc94b30781e51819e0c Abstra ...
- 论文阅读笔记------iTM-Net: Deep Inverse Tone Mapping Using Novel Loss Function Considering TMO
Kinoshita Y, Kiya H. iTM-Net: Deep Inverse Tone Mapping Using Novel Loss Function Considering Tone M ...
- 论文阅读:Parameters Sharing Exploration and Hetero-Center based Triplet Loss for Visible-Thermal Person
1.问题 跨模态行人重识别解决模态差异问题的传统方法是将不同模态的特性映射到一个共享子空间中提取与模态无关的共享的特征,后来出现了双流网络提取模态特有特征和共享特征,这种方式对于鉴别特征的提取更有效. ...
- Semantic Instance Segmentation with a Discriminative Loss Function【论文详解】
PAPER:https://arxiv.org/abs/1708.02551 CODE:https://github.com/DavyNeven/fastSceneUnderstanding 一.整体 ...
- CVPR2020论文分方向整理之检测篇(代码/论文解读/136篇打包下载)
z CVPR2020论文分方向整理之检测篇(代码/论文解读/136篇打包下载) 极市平台(微信公众号ID:extrememart):专注计算机视觉前沿资讯和技术干货.本文由极市平台首发,转载需获授权. ...
最新文章
- 开机BIOS语言(转载)
- js判断是iOS还是Android
- 并发下常见的加锁及锁的PHP具体实现-转载
- 首次安装Revit失败
- Coolite Toolkit学习笔记系列文章
- 怎样安装python在桌面_在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程...
- java 异常练习题_java入门异常处理练习题问题
- 个人永久性免费-Excel催化剂插件功能修复与更新汇总篇之七
- 使用Adobe Acrobat提取PDF签章图片
- oracle数据库xsb创建,在Linux下安装oracle数据库
- 锐捷wifi魔盒自动优选服务器,锐捷校园网用python实现自动登录(需要有自己的账号)...
- 区块链重要基础知识2——哈希函数的原理以及应用于区块头部
- OpenTCS打造移动机器人交通管制系统(十)
- Unity3D自学笔记
- 电子书下载:Adobe PDF 文档格式开发参考 PDF Reference 1.7
- ABP EF Core多数据库支持
- 如果阿里、华为们的智慧城市只是停留顶层设计,那么我们终将会被抛下
- 教你如何轻松搞定云上打印管理
- python 创建app 报重复app名报错解决
- 原声js 的兼容(屏幕尺寸、事件处理程序、阻止事件冒泡、事件目标等等)