编程语言
首页 > 编程语言> > Rank & Sort Loss for Object Detection and Instance Segmentation 论文解读(含核心源码详解)

Rank & Sort Loss for Object Detection and Instance Segmentation 论文解读(含核心源码详解)

作者:互联网

♥ 第一印象

Rank & Sort Loss for Object Detection and Instance Segmentation 这篇文章算是我读的 detection 文章里面比较难理解的,原因可能在于:创新的点跟普通的也不太一样;文章里面比较多公式。但之前也有跟这方面的工作如 AP LossaLRPLoss 等。它们都是为了解决一个问题:单阶段目标检测器分类和回归在训练和预测不一致的问题。那么 Rank & Sort Loss 又在以上的工作进行了什么改进呢?又解决了什么问题呢?

关于训练预测不一致的问题

简单来说,就是在分类和回归在训练的时候是分开的训练,计算 loss 并进行反向优化。但是在预测的时候却是用分类分数排序来进行 nms 后处理。这里可能导致一种情况就是分类分数很高,但是回归不好(这个问题在 FCOS 中有阐述)。

之前的工作

常见的目标检测网络一般会使用 nms 作为后处理,这时我们常常希望所有正样本的得分排在负样本前面,另外我们还希望位置预测更准确的框最后被留下来。之前的 AP Loss 和 aLRP Loss 由于需要附加的 head 来进行分类精度和位置精度综合评价(其实就是为了消除分类和回归的不一致问题,如 FCOS 的 centerness、IoU head 之类的),确实在解决类别不均衡问题(正负样本不均衡)等有着不错的效果,但是需要更多的时间和数据增强来进行训练。

Rank & Sort Loss

Rank & Sort Loss (RS Loss) 并没有增加额外的辅助 head 来进行解决训练和预测不一致的问题,仅通过 RS Loss 进行简单训练:

由上图可以看出,一般的标签分配正样本之间是没有区分的,但是在 RS Loss 里面正样本全部大于负样本,然后在正样本之间也会有排序,排序的依据就是 Anchor 经过调整后跟 GT 的 IoU 值。

♠ 对基于 rank 的 loss 的回顾

由于基于排序的特性,它不是连续可微。因此,常常采用了误差驱动的方式来进行反向传播。以下来复习一下如何将误差驱动优化融进反向传播:

♦ Rank & Sort Loss

Loss 的定义

\[\mathcal{L}_{RS}=\frac{1}{|\mathcal{P}|}\underset{i \in \mathcal{P}}{\sum} (\ell_{RS}(i) - \ell_{RS}^{*}(i)) \]

其中 \(\ell(i)_{RS}\) 是当前 rank error 和 sort error 的累积起来的和,其可以用下式表示

\[\ell_{RS}(i) = \frac{rank^{-}(i)}{rank(i)} + \frac{\underset{j \in \mathcal{P}}{\sum} H(x_{ij})(1 - y_j)}{rank^{+}(i)} \]

前一项为 rank error,后一项为 sort error,后一项对分数大于 \(i\) 的样本乘以了一个 \(1-y\) 的权重,这里的 \(y\) 是分数标签(即该样本与 GT 的 IoU 值)。这里其实使得那些分数比样本 \(i\) 大,但是分数的标签又不是特别大(回归质量不是特别好)的样本进行了惩罚使其产生较大的 error。对于误差的标签,首先 rank error 我们希望所有正样本都排在负样本之前,而这时 rank error 为 0,而对于 sort error 我们则希望只有标签分数大于样本 \(i\) 的预测分数可以比它大,从而产生 error,此时产生期望的误差(也就是回归比 \(i\) 好的样本,我们是可以容忍分数比它高的),这部分样本由于有期望的误差,在计算 loss 时会产生更小的 loss。那些分数的标签不行,但预测分数又比较大的会产生更大的 loss:

\[\ell^{*}_{RS}(i) = 0 + \frac{\underset{j \in \mathcal{P}}{\sum} H(x_{ij})[y_j\ge y_i](1 - y_j)}{H(x_{ij})[y_j\ge y_i]} \]

同时论文还将 \(H(x_{ij})\) 平滑进入区间 \([-\delta_{RS},\delta_{RS}]\) 中,其中 \(x_{ij} = x_{ij}/2\delta_{RS} + 0.5\) 。

Loss 的计算

关于 loss 的计算同上面也是进行三部曲,最后得到:

\[L_{ij}=\begin{cases} (\ell_{R}(i) - \ell_{R}^{*}(i))p_{R}(j|i),\quad for\ i \in \mathcal{P},j\ \in \mathcal{N} \\ (\ell_{S}(i) - \ell_{S}^{*}(i))p_{S}(j|i),\quad for\ i \in \mathcal{P},j\ \in \mathcal{P} \\ 0, \quad \qquad \qquad \qquad \qquad \ ohterwise \end{cases} \]

其中

\[\begin{aligned} p_{R}(j|i)&=\frac{H(x_{ij})}{\underset{k \in \mathcal{N}}{\sum} H(x_{ik})} =\frac{H(x_{ij})}{rank^{-}(i)} \\ p_{S}(j|i)&=\frac{H(x_{ij})[y_j < y_i]}{\underset{k \in \mathcal{P}}{\sum} H(x_{ik})[y_k < y_i]} \end{aligned} \]

这里对于 rank 的概率质量函数只会统计分数大于 \(i\) 的样本,这里其实和之前没有什么区别;对于 sort 而言概率质量函数只会统计分数大于 \(i\) 且分数的标签小于 \(i\) 的样本。

以上的 loss 计算则变为:

\[L_{ij}=\begin{cases} \frac{rank^{-}(i)}{rank(i)}\frac{H(x_{ij})}{rank^{-}(i)},\quad \qquad \qquad \ \qquad \qquad \ \qquad \qquad \qquad \quad \ for\ i \in \mathcal{P},j\ \in \mathcal{N} \\ \Big(\frac{\underset{j \in \mathcal{P}}{\sum} H(x_{ij})(1 - y_j)}{rank^{+}(i)} - \frac{\underset{j \in \mathcal{P}}{\sum} H(x_{ij})[y_j\ge y_i](1 - y_j)}{H(x_{ij})[y_j\ge y_i]}\Big)\frac{H(x_{ij})[y_j < y_i]}{\underset{k \in \mathcal{P}}{\sum} H(x_{ik})[y_k < y_i]},\quad for\ i \in \mathcal{P},j\ \in \mathcal{P} \\ 0, \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \ ohterwise \end{cases} \]

Loss 的优化

对于 \(i \in \mathcal{N}\) 时,

根据上式中的 \(L_{ij}\) 的计算规则,实际上我们只需要计算 rank 产生的 loss 就好,因为 sort 产生的 loss 只会在正样本之间计算,而 rank 产生的 loss 需要正样本对所有负样本的计算,因此只有 \(j\ \in \mathcal{P}, i \ \in \mathcal{N}\) 符合(注意这里的顺序噢,\(i,j\) 就不行噢):

\[\begin{aligned} \frac{\partial L_{RS}}{\partial s_i} &= \frac{1}{|\mathcal{P}|} \Big(-\underset{j \in \mathcal{P}}{\sum}L_{ij}+\underset{j \in \mathcal{P}}{\sum}L_{ji}-\underset{j \in \mathcal{N}}{\sum}L_{ij}+\underset{j \in \mathcal{N}}{\sum}L_{ji}\Big) \\ &= \frac{1}{|\mathcal{P}|}\underset{j \in \mathcal{P}}{\sum}\Big(\ell_{R}(i)-\ell^{*}_{R}(i)\Big)p_{R}(i|j) \\ &= \frac{1}{|\mathcal{P}|}\underset{j \in \mathcal{P}}{\sum}\ell_{R}(i)p_{R}(i|j) \end{aligned} \]

对于 \(i \in \mathcal{P}\) 时,

这时候只有 \(j\ \in \mathcal{N}, i \ \in \mathcal{P}\) 这种情况是不行的(因为这样就是计算每一个负样本与所有正样本的 loss 了):

\[\begin{aligned} \frac{\partial L_{RS}}{\partial s_i} &= \frac{1}{|\mathcal{P}|} \Big(-\underset{j \in \mathcal{P}}{\sum}L_{ij}+\underset{j \in \mathcal{P}}{\sum}L_{ji}-\underset{j \in \mathcal{N}}{\sum}L_{ij}+\underset{j \in \mathcal{N}}{\sum}L_{ji}\Big) \\ &= \frac{1}{|\mathcal{P}|}\Big(-\underset{j \in \mathcal{P}}{\sum}(\ell_{S}(i) - \ell_{S}^{*}(i))p_{S}(j|i)+\underset{j \in \mathcal{P}}{\sum}(\ell_{S}(j) - \ell_{S}^{*}(j))p_{S}(i|j)-\underset{j \in \mathcal{P}}{\sum}(\ell_{R}(i) - \ell_{R}^{*}(i))p_{R}(j|i)+0\Big) \\ &= \frac{1}{|\mathcal{P}|}\Big(-(\ell_{S}(i) - \ell_{S}^{*}(i))\underset{j \in \mathcal{P}}{\sum}p_{S}(j|i)+\underset{j \in \mathcal{P}}{\sum}(\ell_{S}(j) - \ell_{S}^{*}(j))p_{S}(i|j)-(\ell_{R}(i) - \ell_{R}^{*}(i))\underset{j \in \mathcal{P}}{\sum}p_{R}(j|i)+0\Big) \\ &=\frac{1}{|\mathcal{P}|}\Big(-(\ell_{S}(i) - \ell_{S}^{*}(i))+\underset{j \in \mathcal{P}}{\sum}(\ell_{S}(j) - \ell_{S}^{*}(j))p_{S}(i|j)-(\ell_{R}(i) - \ell_{R}^{*}(i))+0\Big) \\ &=\frac{1}{|\mathcal{P}|}\Big((\ell_{RS}^{*}(i) - \ell_{RS}(i))+\underset{j \in \mathcal{P}}{\sum} \big(\ell(i)_{S} - \ell_{S}^{*}(i)\big)p_{S}(i|j)\Big) \end{aligned} \]

需要记住的是,rank 中的 loss \(L_{kl}\) 其中必须满足 \(k \in \mathcal{P},l\ \in \mathcal{N}\) ,sort 中的 loss \(L_{kl}\) 其中必须满足 \(k \in \mathcal{P},l\ \in \mathcal{P}\) 其余情况均为 0,因此一对样本要么产生 rank loss(一正样本一负),要么产生 sort (两正)

关于多任务的权重,使用下述方法避免了人工设置权重:

\[\mathcal{L}_{RS-model} = \mathcal{L}_{RS} + \lambda_{box}\mathcal{L}_{box} \]

其中 \(\lambda_{box} = \left|\mathcal{L}_{RS}/\mathcal{L}_{box} \right|\)

算法的表现

RS Loss 解决训练预测不一致以及类别不均衡等问题,思路还是挺新颖的,而且具有较好的表现。

可以看到还是在下游任务上还是又不小的提升的,只得大家借鉴其思路,创新自己的工作。

♣ 核心源码解读

元旦快乐明年见

标签:Sort,Loss,frac,ell,sum,样本,ij,源码,mathcal
来源: https://www.cnblogs.com/froml77/p/15754665.html