论文是发表在 C V P R 2020 {\rm CVPR\ 2020} CVPR 2020上的一篇关于提高目标检测模型的性能的方法。同 R e t i n a N e t {\rm RetinaNet} RetinaNet中的 F o c a l L o s s {\rm Focal\ Loss} Focal Loss一样,论文关注的点是一阶段目标检测算法中正负样本极不均衡的问题,提出一种新的损失函数, D R {\rm DR} DR L o s s {\rm Loss} Loss。
论文原文 源码
在介绍下一部分前,首先简要介绍 R e t i n a N e t {\rm RetinaNet} RetinaNet中提出的 F o c a l L o s s {\rm Focal\ Loss} Focal Loss。 R e t i n a N e t {\rm RetinaNet} RetinaNet一文指出,制约一阶段目标检测模型性能的部分集中在训练过程中正负样本的极不均衡。由于一阶段算法是直接回归目标类别及其边界框,没有两阶段算法中的过滤调优过程,加上一幅图像中目标可能仅占很小一部分区域,这就造成了前景候选框和背景候选框的数量极不均衡,从而降低了模型的学习能力。基于此,作者基于交叉熵损失函数提出了 F o c a l L o s s {\rm Focal\ Loss} Focal Loss,它的大致思路是降低易分类样本的损失权重而让模型集中训练难分样本。
首先介绍交叉熵损失函数,交叉熵损失函数一般应用于单分类学习任务中,即图像中的目标仅属于一个类别。它通常跟在 S o f t m a x {\rm Softmax} Softmax或 S i g m o i d {\rm Sigmoid} Sigmoid之后,以其计算结果作为输入。这里直接给出二分类任务中交叉熵损失函数的数学形式(多分类的情况类似,只是加上一个用于标识不同类别的标签): L C E = 1 N ∑ i − [ y i ⋅ l o g ( p i ) + ( 1 − y i ) ⋅ l o g ( 1 − p i ) ] (1) L_{CE}= \frac{1}{N}\sum_{i}-[y_i·log(p_i)+(1-y_i)·log(1-p_i)]\tag{1} LCE=N1i∑−[yi⋅log(pi)+(1−yi)⋅log(1−pi)](1)
式子中的 N N N表示图像中目标的数量, y y y表示样本标签(正为 1 1 1、负为 0 0 0), p p p表示模型预测为正的概率。对上式的直观解释是:当样本为正,即 y = 1 y=1 y=1时,损失函数可简化为 L = − l o g ( p ) L=-log(p) L=−log(p),当模型预测为正的概率 p p p越大,则 L L L越小;当样本为负时情况亦是如此。
多分类任务中交叉熵损失函数的数学形式: L C E = 1 N ∑ i − ∑ c y i c ⋅ l o g ( p i c ) (2) L_{CE}=\frac{1}{N}\sum_{i}-\sum_{c}y_{ic}·log(p_{ic})\tag{2} LCE=N1i∑−c∑yic⋅log(pic)(2)
由上可知,交叉熵损失函数仅关注正类的预测概率,只要其值足够大,就可以确保结果正确。再回到正负样本不均衡的问题,由于负样本远多于正样本,则模型更倾向于预测样本为负类且置信度较大,即这部分样本为易分样本。如果持续下去,势必会造成模型训练的不平衡。一种常用的解决方法是降低这部分样本的损失权重,而增大难分的正类样本的权重。
首先定义带权二分类交叉熵损失函数,其作用是调节正负样本的比例,数学形式为: L C E = 1 N ∑ i − [ α 1 ⋅ y i ⋅ l o g ( p i ) + α 2 ⋅ ( 1 − y i ) ⋅ l o g ( 1 − p i ) ] (3) L_{CE}= \frac{1}{N}\sum_{i}-[α_1·y_i·log(p_i)+α_2·(1-y_i)·log(1-p_i)]\tag{3} LCE=N1i∑−[α1⋅yi⋅log(pi)+α2⋅(1−yi)⋅log(1−pi)](3)
上式中 α α α是一个 0 0 0到 1 1 1之间的数,其解释为调节正负样本的比例。在论文的二分类交叉熵损失函数讨论中,对于前景样本 α α α取值为背景的概率(因为背景存在的概率远大于前景)、背景样本 α α α取值为前景的概率,以此达到调节正负样本数的目的。并且 α α α的取值依赖于 p p p值,定义为 α = 1 − p α=1-p α=1−p。而由于多分类中只考虑正样本,则乘以 α α α相当于只是减小了计算的损失值,并没有起到调节正负样本比例的作用。所以,多分类中一般不使用 α α α值。
接下来,为了使模型更倾向于选择难分样本用以训练,这里再为每个损失部分添加一个系数。无论对于正类还是负类,当预测概率 p p p越大,则 ( 1 − p ) (1-p) (1−p)越小,则乘上此系数就减弱了易分样本的损失。而因为大量易分样本来自于负类样本,所以乘以该项也可以在一定程度上调节正负样本的占比。则最终二分类任务中 F o c a l L o s s {\rm Focal\ Loss} Focal Loss损失函数的数学形式为: L F L = 1 N ∑ i − [ α 1 ⋅ y i ⋅ ( 1 − p i ) γ ⋅ l o g ( p i ) + α 2 ⋅ ( 1 − y i ) ⋅ ( 1 − p i ) γ ⋅ l o g ( 1 − p i ) ] (4) L_{FL}= \frac{1}{N}\sum_{i}-[α_1·y_i·(1-p_i)^γ·log(p_i)+α_2·(1-y_i)·(1-p_i)^γ·log(1-p_i)]\tag{4} LFL=N1i∑−[α1⋅yi⋅(1−pi)γ⋅log(pi)+α2⋅(1−yi)⋅(1−pi)γ⋅log(1−pi)](4)
上式中的 γ γ γ为大于 1 1 1超参数,用于调节 ( 1 − p ) (1-p) (1−p)系数的权重。
这里论文中简化写为 F L ( p t ) = − α t ( 1 − p t ) γ l o g ( p t ) (5) {\rm FL}(p_t)=-α_t(1-p_t)^γ{\rm log}(p_t)\tag{5} FL(pt)=−αt(1−pt)γlog(pt)(5)
最后给出 R e t i n a N e t {\rm RetinaNet} RetinaNet同其他目标检测算法的对比:
摘要部分指出一阶段检测算法模型的性能受限于训练过程中正负样本不均衡。针对此问题,论文提出一种新的损失函数, D i s t r i b u t i o n a l R a n k i n g ( D R ) L o s s {\rm Distributional\ Ranking(DR)\ Loss} Distributional Ranking(DR) Loss。它的大致思路是:首先将分类问题转化为置信度排序问题,每次考虑图像中的样本对(包含一个正样本和一个负样本),以此解决不平衡问题;然后根据前景框和背景框的置信度作决策;最后对样本置信度分布进行优化。(后面会有详细介绍)该方法不仅解决了候选框中的不平衡问题,还提高了排序算法的效率。实验结果为,在 M S C O C O {\rm MS\ COCO} MS COCO数据集上,单纯地将 R e t i n a N e t {\rm RetinaNet} RetinaNet中的 F o c a l L o s s {\rm Focal\ Loss} Focal Loss替换为 D R L o s s {\rm DR\ Loss} DR Loss, A P {\rm AP} AP从 39.1 % {\rm 39.1\%} 39.1%提升至 41.7 % {\rm 41.7\%} 41.7%。
论文贡献:(一)提出新的目标检测模型中新的分类损失, D R L o s s {\rm DR\ Loss} DR Loss;(二)该方法具有较强的理论证明,且实验证明能够很好地提高模型性能。
引言部分首先介绍了两阶段检测算法和一阶段算法的工作流程,并提出一阶段算法存在以下不平衡性:前景和背景候选框的数量不平衡;背景框本身存在的不平衡,即大多数背景框易于从前景中分离出来但其中只有少数难以分类,这体现了背景框的分布不均衡。
为了解决不平衡问题, S S D {\rm SSD} SSD采取的是难例负样本挖掘( H N M {\rm HNM} HNM),即按照损失将负样本排序,选择损失值较大的负样本而丢弃容易分类的负样本,保持正负样本比例约为 1 : 3 {\rm 1:3} 1:3,以此平衡正负样本的数量。但这种方法可能会丢掉某些重要的背景信息。 R e t i n a N e t {\rm RetinaNet} RetinaNet保留了所有的背景框,而采取给不同候选框的损失赋予不同权重的方法。论文指出, F o c a l L o s s {\rm Focal\ Loss} Focal Loss通过启发式地赋予损失函数权重并没有有效解决不平衡性问题。同时指出, F o c a l L o s s {\rm Focal\ Loss} Focal Loss是针对一幅图像中的单个候选框,没有将一幅图像看作整体,可能会得到次优解。
论文提出一种依赖于图像的排序损失函数,以处理不平衡问题。首先,为了解决类内(候选框数量)不平衡问题,将分类问题转化为一个排序问题。将一个背景框和一个前景框作为排序对,以此解决类间不平衡问题。其次,针对类间(识别难度)不平衡问题,使用 D R L o s s {\rm DR\ Loss} DR Loss对前景框和背景框的置信度分布优化。如下图:
在子图 ( 1 ) (1) (1)中是候选框的原始分布;为了平衡候选框的数量,对候选框的置信度排序,并每次采样样本对(包含一个正样本和一个负样本);子图 ( 2 ) (2) (2)表示对原始分布进行调整;子图 ( 3 ) (3) (3)表示引入间隔后对原始分布排序。
相关工作部分首先介绍了两阶段检测算法和一阶段检测算法,同时指出一阶段算法中存在的不平衡问题。最后介绍解决不平衡问题所采取的方法,如 H N M {\rm HNM} HNM、 F o c a l L o s s {\rm Focal\ Loss} Focal Loss、 A P L o s s {\rm AP\ Loss} AP Loss等。
给定一系列候选框,模型首先将前景框分类出来。首先是针对分类器 θ θ θ的定义: min θ ∑ i N ∑ j , k l ( p i , j , k ) (3.1) \mathop{\min}\limits_{\theta}\sum_{i}^{N}\sum_{j,k}l(p_{i,j,k})\tag{3.1} θmini∑Nj,k∑l(pi,j,k)(3.1)
其中 N N N表示图的数量, p i , j , k p_{i,j,k} pi,j,k表示第 i i i幅图中第 j j j个候选框属于第 k k k类的概率, l ( ⋅ ) l(·) l(⋅)表示交叉熵损失函数。
针对类内不平衡的问题,上述等式可以改写为: min θ ∑ i N ( ∑ j + n + l ( p i , j + ) + ∑ j − n − l ( p i , j − ) ) (3.2) \mathop{\min}\limits_{\theta}\sum_{i}^{N}(\sum_{j_+}^{n_+}l(p_{i,j_+})+\sum_{j_-}^{n_-}l(p_{i,j_-}))\tag{3.2} θmini∑N(j+∑n+l(pi,j+)+j−∑n−l(pi,j−))(3.2)
其中 j + j_+ j+和 j − j_- j−分别表示正样本、负样本, n + n_+ n+和 n − n_- n−表示相应样本的数量。
当 n − ≫ n + n_-\gg n_+ n−≫n+时,总的损失函数以后部分为主。一种常用的解决方法是增大正类样本部分的损失权重,论文提出了另一种解决办法:
为了缓解类内不平衡的问题,考虑将正负样本的排序优化。对于任意一对样本(一个正样本、一个负样本),一个理想的模型是正样本的置信度大于负样本的置信度,即满足: ∀ j + , j − p j + − p j − ≥ γ {\forall}j_+,j_- \ \ p_{j_+}-p_{j_-}≥γ ∀j+,j− pj+−pj−≥γ
其中 γ γ γ是一个非负常数,表示间隔( m a r g i n {\rm margin} margin)常数。
这样,排序模型很好地优化了单个正负样本(一对样本)的关系。则单幅图像的排序问题写为: min θ ∑ j + n + ∑ j − n − l ( p j − − p j + + γ ) (3.3) \mathop{\min}\limits_{\theta}\sum_{j_+}^{n_+}\sum_{j_-}^{n_-} l(p_{j_-}-p_{j_+}+γ)\tag{3.3} θminj+∑n+j−∑n−l(pj−−pj++γ)(3.3)
上述等式的含义是:保证所有样本对的损失最小,即样本对排序正确。
其中损失函数定义为折页损失的变种:
l h i n g e ( z ) = [ z ] + = { z z > 0 0 o . w . (3.4) l_{hinge}(z)=[z]_+= \begin{cases} z& \ z>0\\ 0& \ o.w. \end{cases}\tag{3.4} lhinge(z)=[z]+={z0 z>0 o.w.(3.4)
折页损失函数可用于”最大间隔分类“,其中最常用为作为 S V M {\rm SVM} SVM的损失函数。原折页损失函数数学表达式为 l h i n g e ( y ) = m a x ( 0 , 1 − y ^ y ) (3.5) l_{hinge}(y)=max(0,1-\hat{y}y)\tag{3.5} lhinge(y)=max(0,1−y^y)(3.5)
其中 y ^ \hat{y} y^表示预测的软结果, y y y表示正确的类别。则式 ( 3.3 ) (3.3) (3.3)中对应的损失函数表达式为: l h i n g e ( z ) = m a x ( 0 , p j − − p j + + γ ) (3.6) l_{hinge}(z)=max(0,p_{j_-}-p_{j_+}+γ)\tag{3.6} lhinge(z)=max(0,pj−−pj++γ)(3.6)上式的含义是我们希望正样本分数越高越好、负样本分数越低越好,但二者得分之差大于设定的 γ γ γ值即可。超过设定的阈值,不必再增大该部分损失(即设置为 0 0 0),而使模型关注整体的损失。
则式 ( 3.3 ) (3.3) (3.3)可进一步写为: 1 n + n − ∑ j + n + ∑ j − n − l ( p j − − p j + + γ ) = E j + , j − [ l ( p j − − p j + + γ ) ] (3.7) \frac{1}{n_+n_-}\sum_{j_+}^{n_+}\sum_{j_-}^{n_-}l(p_{j_-}-p_{j_+}+γ)=E_{j_+,j_-}[l(p_{j_-}-p_{j_+}+γ)]\tag{3.7} n+n−1j+∑n+j−∑n−l(pj−−pj++γ)=Ej+,j−[l(pj−−pj++γ)](3.7)
上式反映了最小化分类损失等价于最小化随机采样对的排序损失的期望。
但上式 ( 3.7 ) (3.7) (3.7)也存在如下问题:上式没有解决类间的平衡问题;上式的计算量大,总共需计算 n + × n − n_+×n_- n+×n−个排序对。
在检测任务中,大部分负样本能够很好地排序(负样本占总样本的大部分,且候选框内不含前景目标,则),也就是说,随机采样不会显著增加分类损失。这里,为了解决上面提到的问题:将折页损失更改为: min θ l ( max j − { p j − } − min j + { p j + } + γ ) (3.8) \mathop{\min}\limits_{\theta}l(\mathop{\max}\limits_{j_-}\{p_{j_-}\}-\mathop{\min}\limits_{j_+}\{p_{j_+}\}+γ)\tag{3.8} θminl(j−max{pj−}−j+min{pj+}+γ)(3.8)
上式表明,如果模型能够将最低置信度的正样本和最高置信度的负样本对排序,则整个样本对都能够很好地排序,即表示最坏的情况(得到最大的损失值)。
对比式 ( 3.7 ) (3.7) (3.7), ( 3.8 ) (3.8) (3.8)将计算量简化为 1 1 1,并且能够很好地解决类间不平衡的问题(整幅图像只采样一个样本对)。但同时这种方法对噪音非常敏感(可能采样到噪声)。为了增强模型的鲁棒性,首先定义正负样本的置信度分布: P + = ∑ j + n + q j + p j + P − = ∑ j − n − q j − p j − P_+=\sum_{j_+}^{n_+}q_{j_+}p_{j_+}\ P_-=\sum_{j_-}^{n_-}q_{j_-}p_{j_-} P+=j+∑n+qj+pj+ P−=j−∑n−qj−pj−
其中 q + , q − ∈ Δ {\rm q}_+,{\rm q}_-∈Δ q+,q−∈Δ分别表示正负样本的分布, P + P_+ P+和 P − P_- P−表示相应分布下预期的置信度, Δ Δ Δ值定义为: Δ = { q : ∑ j q j = 1 , ∀ j , q j ≥ 0 } Δ=\{q:\sum_{j}q_j=1,\ {\forall}j,q_j≥0\} Δ={q:j∑qj=1, ∀j,qj≥0}
有以上定义,则式 ( 3.8 ) (3.8) (3.8)中样本所对应的分布可写为: P + = min q + ∈ Δ ∑ j + n + q j + p j + P − = max q − ∈ Δ ∑ j − n − q j − p j − P_+=\mathop{\min}\limits_{\ {\rm q}_+∈Δ}\sum_{j_+}^{n_+}q_{j_+}p_{j_+}\ P_-=\mathop{\max}\limits_{\ {\rm q}_-∈Δ}\sum_{j_-}^{n_-}q_{j_-}p_{j_-} P+= q+∈Δminj+∑n+qj+pj+ P−= q−∈Δmaxj−∑n−qj−pj−
则可以继续重写式 ( 3.8 ) (3.8) (3.8): min θ l ( P − − P + + γ ) \mathop{\min}\limits_{\theta}l(P_--P_++γ) θminl(P−−P++γ)
上式表示在最坏情况下对正负样本的分布排序。
另一方面,如果不对上述分布进行约束的话,上面的优化仍不具有鲁棒性。因此对分布采取如下限制: P − = max q − ∈ Δ , Ω ( q − ∣ ∣ o − ) ≤ ε − ∑ j − n − q j − p j − − P + = max q + ∈ Δ , Ω ( q + ∣ ∣ o + ) ≤ ε + ∑ j + n + q j + ( − p j + ) P_-=\mathop{\max}\limits_{{\rm q}_-∈Δ,Ω({\rm q}_-||{\rm o}_-)≤ε_-}\sum_{j_-}^{n_-}q_{j_-}p_{j_-}\\ -P_+=\mathop{\max}\limits_{{\rm q}_+∈Δ,Ω({\rm q}_+||{\rm o}_+)≤ε_+}\sum_{j_+}^{n_+}q_{j_+}(-p_{j_+}) P−=q−∈Δ,Ω(q−∣∣o−)≤ε−maxj−∑n−qj−pj−−P+=q+∈Δ,Ω(q+∣∣o+)≤ε+maxj+∑n+qj+(−pj+)
其中 o + {\rm o}_+ o+和 o − {\rm o}_- o−表示正负样本的原始分布, Ω ( ⋅ ) {\rm Ω(·)} Ω(⋅)表示一个正则化器, ε + ε_+ ε+和 ε − ε_- ε−用于控制生成分布的自由度。
为了得到约束分布,考虑子问题: max q − ∈ Δ ∑ j − q j − p j − s . t . Ω ( q − ∣ ∣ o − ) ≤ ε − \mathop{\max}\limits_{{\rm q}_-∈Δ}\sum_{j_-}q_{j_-}p_{j_-} \\s.t.\ \ \ \ \ Ω({\rm q}_-||{\rm o}_-)≤ε_- q−∈Δmaxj−∑qj−pj−s.t. Ω(q−∣∣o−)≤ε−
使用对偶法将上式转化为: max q − ∈ Δ ∑ j − q j − p j − − λ − Ω ( q − ∣ ∣ o − ) \mathop{\max}\limits_{{\rm q}_-∈Δ}\sum_{j_-}q_{j_-}p_{j_-}-λ_-Ω({\rm q}_-||{\rm o}_-) q−∈Δmaxj−∑qj−pj−−λ−Ω(q−∣∣o−)
有约束的函数优化问题。
这里采用 K L {\rm KL} KL散度正则化方法: max q − ∈ Δ ∑ j − q j − p j − − λ − K L ( q − ∣ ∣ o − ) \mathop{\max}\limits_{{\rm q}_-∈Δ}\sum_{j_-}q_{j_-}p_{j_-}-λ_-{\rm KL}({\rm q}_-||{\rm o}_-) q−∈Δmaxj−∑qj−pj−−λ−KL(q−∣∣o−)
K L {\rm KL} KL散度用于衡量二者部分分布是否相近。
然后利用 K K T {\rm KKT} KKT条件求得: q j − = 1 Z − o j − e x p p j − λ − ; Z − = ∑ j − o j − e x p p j − λ − q_{j_-}=\frac{1}{Z_-}o_{j_-}{\rm exp}{\frac{p_{j_-}}{λ_-}};\ \ Z_-=\sum_{j_-}o_{j_-}{\rm exp}{\frac{p_{j_-}}{λ_-}} qj−=Z−1oj−expλ−pj−; Z−=j−∑oj−expλ−pj−
这里涉及函数优化问题,具体内容还需要补一补。
对于正类样本的情况: max q + ∈ Δ ∑ j + q j + ( − p j + ) − λ + K L ( q + ∣ ∣ o + ) \mathop{\max}\limits_{{\rm q}_+∈Δ}\sum_{j_+}q_{j_+}(-p_{j_+})-λ_+{\rm KL}({\rm q}_+||{\rm o}_+) q+∈Δmaxj+∑qj+(−pj+)−λ+KL(q+∣∣o+)
求得相应的结果: q j + = 1 Z + o j + e x p ( − − p j + λ + ) ; Z + = ∑ j + o j + e x p ( − − p j + λ + ) q_{j_+}=\frac{1}{Z_+}o_{j_+}{\rm exp}(-{\frac{-p_{j_+}}{λ_+}});\ \ Z_+=\sum_{j_+}o_{j_+}{\rm exp}(-{\frac{-p_{j_+}}{λ_+}}) qj+=Z+1oj+exp(−λ+−pj+); Z+=j+∑oj+exp(−λ+−pj+)
最后,带入以上公式,得到最终分布的置信度: P ^ − = ∑ j − n − q j − p j − = ∑ j − n − 1 Z − e x p ( p j − λ − ) p j − P ^ + = ∑ j + n + q j + p j + = ∑ j + n + 1 Z + e x p ( − p j + λ + ) p j + (3.9) \hat{P}_-=\sum_{j_-}^{n_-}q_{j_-}p_{j_-}=\sum_{j_-}^{n_-}\frac{1}{Z_-}{\rm exp}({\frac{p_{j_-}}{λ_-}})p_{j_-}\\\hat{P}_+=\sum_{j_+}^{n_+}q_{j_+}p_{j_+}=\sum_{j_+}^{n_+}\frac{1}{Z_+}{\rm exp}({\frac{-p_{j_+}}{λ_+}})p_{j_+}\tag{3.9} P^−=j−∑n−qj−pj−=j−∑n−Z−1exp(λ−pj−)pj−P^+=j+∑n+qj+pj+=j+∑n+Z+1exp(λ+−pj+)pj+(3.9)
为了简化计算,论文将原始分布 o o o设置为 1 n \frac{1}{n} n1。
为了保证非凸函数收敛性,这里引入平滑因素,这里有两种可能的选择用以代替折页损失: l q u a d ( z ) = { z z ≥ ρ ( z + ρ ) 2 4 ρ − ρ < z < ρ 0 z ≤ − ρ (3.10) l_{quad(z)}= \begin{cases} z& \ z≥ρ\\ \frac{({z+ρ})^2}{4ρ}& \ -ρ<z<ρ\\ 0& \ z≤-ρ \end{cases}\tag{3.10} lquad(z)=⎩⎪⎨⎪⎧z4ρ(z+ρ)20 z≥ρ −ρ<z<ρ z≤−ρ(3.10) l l o g i s t i c ( z ) = 1 L l o g ( 1 + e x p ( L z ) ) (3.11) l_{logistic(z)}=\frac{1}{L}{\rm log}(1+{\rm exp}(Lz))\tag{3.11} llogistic(z)=L1log(1+exp(Lz))(3.11)
最终,实验对比后论文选用的是 l o g i s t i c {\rm logistic} logistic损失,则最终的分类损失为: min θ L D R ( θ ) = ∑ i N l l o g i s t i c ( P ^ i , − − P ^ i , + + γ ) (3.12) \mathop{\min}\limits_{θ}L_{DR}(θ)=\sum_{i}^{N}l_{logistic}(\hat{P}_{i,-}-\hat{P}_{i,+}+γ)\tag{3.12} θminLDR(θ)=i∑Nllogistic(P^i,−−P^i,++γ)(3.12)
使用 S G D {\rm SGD} SGD更新参数 θ θ θ: θ t + 1 = θ t − η 1 m ∑ s = 1 m ▽ l t s θ_{t+1}=θ_{t}-η\frac{1}{m}\sum_{s=1}^{m}▽l_t^s θt+1=θt−ηm1s=1∑m▽lts
最终模型的损失函数为: m i n ∑ i N τ l D R i + l R e g i {\rm min}\sum_{i}^{N}τl_{DR}^i+l_{Reg}^i mini∑NτlDRi+lRegi
其中回归损失部分沿用 R e t i n a N e t {\rm RetinaNet} RetinaNet中的形式。
如公式 ( 3.12 ) (3.12) (3.12)所示, D R L o s s {\rm DR\ Loss} DR Loss共有三个参数 λ + λ_+ λ+、 λ − λ_- λ−和 L L L。其中 λ {\rm λ} λ位于对偶条件中,用于对正负样本的置信度分布正则化; L L L用于控制损失函数的平滑性。
论文本部分介绍了大量针对超参数设置的消融实验,详细内容请参考原文。
可以看到,在 R e t i n a N e t {\rm RetinaNet} RetinaNet中仅将 F o c a l L o s s {\rm Focal\ Loss} Focal Loss替换为 D R L o s s {\rm DR\ Loss} DR Loss就能够获得不错的提升。
本文提出的 D R L o s s {\rm DR\ Loss} DR Loss致力于解决一阶段算法中样本不平衡的问题。首先将原始的分类问题转化为排序问题,然后对置信度分布进行优化。实验结果为仅将检测模型的分类损失替换为 D R L o s s {\rm DR\ Loss} DR Loss就能获得不错的提升。
由于论文对检测模型的改进仅针对分类损失部分,对现有模型的可修改性较强。同时,该方法具有较强的理论证明,且实验效果很好,后续可以考虑使用该损失进行实验。由于本文涉及很多函数的优化问题,还有一部分没有弄清楚。最后,下面是官方给出的用 P y T o r c h {\rm PyTorch} PyTorch实现 S i g m o i d + D R L o s s {\rm Sigmoid+DR\ Loss} Sigmoid+DR Loss的源码:
import torch
from torch import nn
import torch.nn.functional as F
import math
class SigmoidDRLoss(nn.Module):
# 几个超参数,依次对应γ、λ、L(最后一个参数不清楚,它乘在损失函数前)
def __init__(self, pos_lambda=1, neg_lambda=0.1/math.log(3.5), L=6., tau=4.):
super(SigmoidDRLoss, self).__init__()
self.margin = 0.5
self.pos_lambda = pos_lambda
self.neg_lambda = neg_lambda
self.L = L
self.tau = tau
def forward(self, logits, targets):
# 标注相关信息
num_classes = logits.shape[1]
dtype = targets.dtype
device = targets.device
class_range = torch.arange(1, num_classes + 1, dtype=dtype, device=device).unsqueeze(0)
t = targets.unsqueeze(1)
# 获得正负样本id
pos_ind = (t == class_range)
neg_ind = (t != class_range) * (t >= 0)
# 概率p使用sigmoid求得
pos_prob = logits[pos_ind].sigmoid()
neg_prob = logits[neg_ind].sigmoid()
# 对应于式(3.9)
neg_q = F.softmax(neg_prob/self.neg_lambda, dim=0)
neg_dist = torch.sum(neg_q * neg_prob)
# 论文中提到,如果图像中没有正样本,则正样本的P使用1代替
if pos_prob.numel() > 0:
# 对应于式(3.9)
pos_q = F.softmax(-pos_prob/self.pos_lambda, dim=0)
pos_dist = torch.sum(pos_q * pos_prob)
# 对应于式(3.12)
loss = self.tau*torch.log(1.+torch.exp(self.L*(neg_dist - pos_dist+self.margin)))/self.L
else:
# 对应于式(3.12)
loss = self.tau*torch.log(1.+torch.exp(self.L*(neg_dist - 1. + self.margin)))/self.L
return loss