FreeAnchor: Learning to Match Anchors for Visual Object Detection论文详解

介绍FreeAnchor算法,一种改进的目标检测方法,通过自定义检测似然函数优化召回率和精度,无需人工设置锚点,网络自主学习最佳匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:https://arxiv.org/abs/1909.02466
项目代码:https://github.com/zhangxiaosong18/FreeAnchor

问题

在基于anchor的目标检测算法中,训练时,通常通过anchor和真实object 框之间的IoU来决定该anchor是否用来预测object (包括类别和位置),通常IoU超过某一阈值则认为该anchor为正例(即作为预测object ),小于某一阈值则认为该anchor为背景。本文的思想就是通过修改loss函数去除人工参与指定anchor的过程,使网络能够自主学习选择哪个anchor和真实object 进行匹配。

通用loss函数

基于anchor算法常用的loss函数如下所示,A表示anchor集,每一个anchor aj∈Aa_{j} \in AajA包含了一个类别预测项ajcls∈Rka_{j}^{cls} \in R^{k}ajclsRk和一个位置预测项ajloc∈R4a_{j}^{loc} \in R^{4}ajlocR4kkk指的是object 类别的数目。B表示object 集,bi∈Bb_{i} \in BbiB表示一个object。公式中的Cij∈0,1C_{ij} \in {0,1}Cij0,1表示object bib_{i}bi和anchor aja_{j}aj是否匹配。

通常,bib_{i}biaja_{j}aj的IoU大于某个阈值,则Cij=1C_{ij}=1Cij=1(当有多个bib_{i}bi满足条件时,取最大IoU最大的,这样就保证了一个anchor只能匹配一个object),否则Cij=0C_{ij}=0Cij=0

在这里插入图片描述

公式1

从该loss函数可以看出,只优化了分类和位置回归,忽视了对object-anchor匹配的优化。

自定义检测似然函数

**目标 :**该似然函数能够与召回率、精度和NMS算法兼容。

为了理解,假设一张图像anchors数目为20000,object数目为2。

为了定义优化似然函数,对于每一个object bib_{i}bi选择n(实验中取50最佳,后续为了便于理解,直接取50)个候选anchors,这些候选anchors是通过20000个anchors与bib_{i}bi计算iou,选取iou最大的前50个,所有候选anchor集记为AiA_{i}Ai

  1. 为了优化召回率(正确预测的object 数目/真实的object 数目),对于每一个object bib_{i}bi我们需要保证至少存在一个anchor aj∈Aia_{j} \in A_{i}ajAi使得预测的类别和位置与ground-truth相近,则定义召回似然函数如下:
    P(θ)recall=∏imax⁡aj∈Ai(P(θ)ijclsP(θ)ijloc)(公式2) P(\theta)_{recall}=\prod_{i}\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc}) (公式2) P(θ)recall=iajAimax(P(θ)ijclsP(θ)ijloc)2
    P(θ)ijclsP(\theta)_{ij}^{cls}P(θ)ijcls: 表示分类置信度,取值范围为[0,1],size(2,50) ,网络类别估计层经过Sigmoid函数输出,第一行表示object b1b_{1}b1对应的50个候选anchors属于该object 类的概率。

    P(θ)ijlocP(\theta)_{ij}^{loc}P(θ)ijloc: 表示定位置信度。取值范围为[0,1],size(2, 50), 第一行表示object b1b_{1}b1对应的50个候选anchors定位该object 的置信度。其计算是将公式1中的位置损失函数L(θ)ijlocL(\theta)_{ij}^{loc}L(θ)ijloc改写为似然概率的形式:
    P(θ)ijloc=e−βL(θ)ijloc P(\theta)_{ij}^{loc}=e^{-\beta L(\theta)_{ij}^{loc}} P(θ)ijloc=eβL(θ)ijloc

    L(θ)ijloc=smoothL1(ajloc,biloc) L(\theta)_{ij}^{loc}=smoothL1(a_{j}^{loc},b_{i}^{loc}) L(θ)ijloc=smoothL1(ajloc,biloc)

smoothL1损失函数请参看:https://blog.youkuaiyun.com/weixin_41940752/article/details/93159710

定义上述似然函数后,再回头看看P(θ)recall=∏imax⁡aj∈Ai(P(θ)ijclsP(θ)ijloc)P(\theta)_{recall}=\prod_{i}\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc})P(θ)recall=iajAimax(P(θ)ijclsP(θ)ijloc)的含义:

  • max⁡aj∈Ai(P(θ)ijclsP(θ)ijloc)\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc})ajAimax(P(θ)ijclsP(θ)ijloc): 对一个object bib_{i}bi,其有50个候选anchors,将每个anchor的分类置信度和定位置信度相乘,作为该anchor的置信度,选取置信度最高的anchor。

  • ∏imax⁡aj∈Ai(P(θ)ijclsP(θ)ijloc)\prod_{i}\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc})iajAimax(P(θ)ijclsP(θ)ijloc):将每个object 对应的最高置信度相乘。此处优化的object 是希望P(θ)recallP(\theta)_{recall}P(θ)recall越大越好。

2.为了提高检测精度(正确预测的object 数目/预测为object 的数目),检测器需要将定位较差的anchor分为背景类,精度似然概率函数定义如下:
P(θ)precision=∏j(1−P{aj∈A−}(1−P(θ)jbg))(公式3) P(\theta)_{precision}=\prod_{j}(1-P\{a_{j} \in A_{-}\}(1-P(\theta)_{j}^{bg})) (公式3) P(θ)precision=j(1P{ajA}(1P(θ)jbg))3

  • (1−P(θ)jbg)(1-P(\theta)_{j}^{bg})(1P(θ)jbg):反应分类置信度,不属于背景类的置信度。size(20000)。
  • P{aj∈A−}P\{a_{j} \in A_{-}\}P{ajA}:反应定位置信度,属于背景类的置信度。

为了提高检测精度,我们需要当anchor属于背景类的定位置信度比较高时(及anchor定位较差),属于背景类的分类置信度比较高,即不属于背景类的置信度比较低。P(θ)precisionP(\theta)_{precision}P(θ)precision的定义能满足该需要。

接下来就要定义anchor aja_{j}aj属于背景类的定位置信度:
P{aj∈A−}=1−max⁡iP{aj−>bi} P\{a_{j} \in A_{-}\}=1-\max \limits_{i}P\{a_{j} -> b_{i}\} P{ajA}=1imaxP{aj>bi}
其中P{aj−>bi}P\{a_{j} -> b_{i}\}P{aj>bi}表示anchor aja_{j}aj能够正确匹配object bib_{i}bi的概率(不要着急问为什么,目前只是理论定义,接下来会讲如何定义该函数才能表达此意义),那么P{aj∈A−}P\{a_{j} \in A_{-}\}P{ajA}就反应了aja_{j}aj与所有object 都不匹配的概率,即属于背景类的概率。

那么接下来就要开始研究如何定义P{aj−>bi}P\{a_{j} -> b_{i}\}P{aj>bi}才能表示anchor aja_{j}aj能够正确匹配object bib_{i}bi的概率,另外需要注意的一点是,该概率是从定位角度出发的。

P{aj−>bi}P\{a_{j} -> b_{i}\}P{aj>bi}定义

为了能够与NMS兼容,P{aj−>bi}P\{a_{j} -> b_{i}\}P{aj>bi}应该满足三个性质:

(1)P{aj−>bi}P\{a_{j} -> b_{i}\}P{aj>bi}应是ajloca_{j}^{loc}ajlocbilocb_{i}^{loc}biloc之间IOU(即IoUijlocIoU_{ij}^{loc}IoUijloc)的单调递增函数,即两者之间IoU越大,概率应该越大,这与我们的直观认知是一样的;

(2)当IoUijlocIoU_{ij}^{loc}IoUijloc小于某个阈值时,此概率应该接近于0;

(3)对于每个object bib_{i}bi,应该有且只有一个anchor aja_{j}aj满足 P{aj−>bi}=1P\{a_{j}->b_{i}\}=1P{aj>bi}=1


P{aj−>bi}=Saturatedlinear(IoUijloc,t,maxj(IoUijloc)) P\{a_{j}->b_{i}\}=Saturated linear(IoU_{ij}^{loc},t,max_{j}(IoU_{ij}^{loc})) P{aj>bi}=Saturatedlinear(IoUijloc,t,maxj(IoUijloc))

Saturatedlinear(x,t1,t2)={0x≤t1x−t1t2−t1t1<x<t21x≥t2 Saturated linear(x,t1,t2)=\begin{cases} 0 & x\leq t1 \\ \frac{x-t1}{t2-t1} & t1<x<t2 \\ 1 & x \geq t2 \end{cases} Saturatedlinear(x,t1,t2)=0t2t1xt11xt1t1<x<t2xt2

损失函数

回忆开头讲的自定义检测似然函数的目标 是:该似然函数能够与召回率、精度和NMS算法兼容。

则检测似然函数为:
P(θ)=P(θ)recall×P(θ)precision=∏imax⁡aj∈Ai(P(θ)ijclsP(θ)ijloc)×∏j(1−P{aj∈A−}(1−P(θ)jbg)) P(\theta)=P(\theta)_{recall}\times P(\theta)_{precision} =\prod_{i}\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc}) \times \prod_{j}(1-P\{a_{j} \in A_{-}\}(1-P(\theta)_{j}^{bg})) P(θ)=P(θ)recall×P(θ)precision=iajAimax(P(θ)ijclsP(θ)ijloc)×j(1P{ajA}(1P(θ)jbg))
转换为损失函数为:
L(θ)=−log(P(θ))=−∑ilog(max⁡aj∈Ai(P(θ)ijclsP(θ)ijloc))−∑jlog(1−P{aj∈A−}(1−P(θ)jbg))(公式4) L(\theta)=-log(P(\theta))=-\sum_{i}log(\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc}) )-\sum_{j}log(1-P\{a_{j} \in A_{-}\}(1-P(\theta)_{j}^{bg})) (公式4) L(θ)=log(P(θ))=ilog(ajAimax(P(θ)ijclsP(θ)ijloc))jlog(1P{ajA}(1P(θ)jbg))(4)
式中max函数是用来为每个object 选择最匹配的anchor,初始训练阶段,所有anchors的置信度都比较低,而且因为网络的参数是随机初始化的,具有最高置信度的anchor不一定是最匹配的anchor,为了解决这个问题,将max函数换为Mean-max函数:
Mean−max(X)=∑xj∈Xxj1−xj∑xj∈X11−xjMean-max(X)=\frac{\sum_{x_j\in X}\frac{x_j}{1-x_j}}{\sum_{x_j\in X}\frac{1}{1-x_j}}Meanmax(X)=xjX1xj1xjX1xjxj
其示意图如下:

[外链图片转存失败(img-EipZBiAn-1568808708223)(/home/zy/.config/Typora/typora-user-images/1568792263319.png)]

可以看出,当初始anchors置信度比较低的时候, Mean-max函数接近取平均值,即所有候选anchor都参与训练;随着不断训练,一些候选anchors的置信度增加,Mean-max函数越接近max函数,训练充足时,就可以从候选anchors中选出一个最好的anchor来匹配object 。

除此之外,还做了两项修改:公式4的第二项采用focalloss,第一项和第二项分别乘以权重因子w1,w2w_1,w_2w1,w2,最终的loss函数为:
L(θ)=−w1∑ilog(Mean_max(Xi))+w2∑jFL_(P{aj∈A−}(1−P(θ)jbg))(公式5) L(\theta)=-w_1\sum_{i}log(Mean\_max(X_i))+w_2 \sum_{j}FL\_(P\{a_{j} \in A_{-}\}(1-P(\theta)_{j}^{bg})) (公式5) L(θ)=w1ilog(Mean_max(Xi))+w2jFL_(P{ajA}(1P(θ)jbg))(5)
其中Xi={P(θ)ijclsP(θ)ijloc)∣aj∈Ai}X_i=\{P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc})|a_j \in A_i\}Xi={P(θ)ijclsP(θ)ijloc)ajAi}FL_(p)=−pγlog(1−p)FL\_(p)=-p^{\gamma}log(1-p)FL_(p)=pγlog(1p)w1=α∣∣B∣∣w_1=\frac{\alpha}{||B||}w1=Bαw2=1−αn∣∣B∣∣w_2=\frac{1-\alpha}{n||B||}w2=nB1α∣∣B∣∣||B||B为object 数目,nnn为候选anchor数目。

实验

  1. 数据:CoCo

  2. 网络:RetinaNet

  3. 效果:

    [外链图片转存失败(img-YFFjflnI-1568808708223)(/home/zy/.config/Typora/typora-user-images/1568793807824.png)]

细长object :FreeAnchor效果更好,这是因为FreeAnchor至少会从候选anchors中选出一个来正确的预测类别和位置,所选的anchor不一定是空间最匹配的,但是其特征肯定是最具有代表性的。

[外链图片转存失败(img-zcF2Ut1F-1568808708224)(/home/zy/.config/Typora/typora-user-images/1568794110063.png)]

拥挤object :在一张中含有object 比较多时,本文算法效果明显好于手动筛选anchor的方法。

[外链图片转存失败(img-QkhBjoFd-1568808708224)(/home/zy/.config/Typora/typora-user-images/1568794346553.png)]

本文算法与NMS兼容性更好:NR=采用NMS后的召回率未用NMS的召回率NR=\frac{采用NMS后的召回率}{未用NMS的召回率}NR=NMSNMS

[外链图片转存失败(img-VVF0a64C-1568808708224)(/home/zy/.config/Typora/typora-user-images/1568794505513.png)]

本文learning-to-matching机制提高AP。

[外链图片转存失败(img-Bm06zOnp-1568808708224)(/home/zy/.config/Typora/typora-user-images/1568794772370.png)]

与其他算法对比。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤劳的凌菲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值