目录

  • 重新思考 Anchor
    • Anchor 的弊端
    • Anchor-Free
  • 基于角点的检测: CornerNet
    • 沙漏结构 Hourglass
    • 角点池化 Corner Pooling
    • 预测输出
  • 检测中心点: CenterNet
    • Keypoint Heatmap
    • Local offset
    • Objects as Points: A general purpose object detector
      • Object detection
      • 3D detection
      • Human pose estimation
  • 锚框自学习: Guided Anchoring
    • Guided Anchoring
    • Anchor Generation
    • Feature Adaption (特征自适应)
    • 高质量 proposal 的正确打开方式
    • 谈谈 Anchor 设计准则
  • 参考文献

重新思考 Anchor

Anchor 的弊端

  • (1) 正、负样本不均衡:我们通常在特征图所有点上均匀采样 Anchor,而在大部分地方都是没有物体的背景区域,导致简单负样本数量众多,这部分样本对于我们的检测器没有任何作用
  • (2) 超参难调:Anchor 需要数量、大小、宽高等多个超参数,这些超参数对检测的召回率和速度等指标影响极大。此外,人的先验知识也很难应付数据的长尾问题,这显然不是我们乐意见到的
  • (3) 匹配耗时严重:为了确定每个 Anchor 是正样本还是负样本,通常要将每个 Anchor 与所有的标签进行 IoU 的计算,这会占据大量的内存资源与计算时间

Anchor-Free

在各种 Anchor-Free 的算法中,根据其表征一个物体的方法,大体可以分为以下两类

  • (1) 直接预测边框:根据网络特征直接预测物体出现的边框位置。典型算法如 YOLO、自动学习在 FPN 上分配标签的 FSAF (Feature Selective Anchor-Free)、利用分割思想解决检测的 FCOS (Fully Convolutional One-Stage),以及改善了边框回归方式的 Foveabox 算法
  • (2) 关键点的思想:使用边框的角点或者中心点进行物体检测,这类算法通常是受人体姿态的关键点估计启发,开辟了物体检测算法的一个新天地,典型有 CornerNetExtremeNetCenterNet

基于角点的检测: CornerNet

  • paper: CornerNet: Detecting Objects as Paired Keypoints

  • CornerNet 实际是受多人体姿态估计的方法启发。在多人体姿态估计领域中,一个重要的解决思路是 Bottom-Up,即先使用卷积网络检测整个图像中的关键点,然后对属于同一个人体的关键点进行拼接,形成姿态。CornerNet 将这种思想应用到了物体检测领域中,将传统的预测边框思路转化为了预测边框的左上角与右下角两个角点问题,然后再对属于同一个边框的角点进行组合

沙漏结构 Hourglass

  • Hourglass 为特征提取的 Backbone,能够为后续的网络预测提供很好的角点特征图。Hourglass 结构是从人体姿态估计领域中借鉴而来,通过多个 Hourglass 模块的串联,可以十分有效地提取人体姿态的关键点。在下图中,左半部分表示传统的卷积与池化过程,语义信息在增加,分辨率在减小。右半部分表示上采样与融合过程,深层的特征通过上采样操作与浅层的特征进行融合,在增大分辨率的同时,保留了原始的细节信息。CornerNet 首先通过一个步长为 2 的 7 × 7 7 ×7 7×7 卷积层,以及步长为 2 的残差模块,将图像尺寸缩小为原图的 1/4,然后将得到的特征图送入两个串联的 Hourglass 模块

角点池化 Corner Pooling

  • 在传统卷积网络中,通常使用池化层来进行特征融合,扩大感受野,也可以起到缩小特征图尺寸的作用。但标准池化层只是融合了当前位置周围点的特征信息,而 CornerNet 的思想是利用左上与右下两个关键点进行物体检测,对于一个物体的左上点,其右下区域包含了物体的特征信息,同样对于物体的右下点,其左上区域包含了物体的特征信息,这时角点的周围只有四分之一的区域包含了物体信息,其他区域都是背景,因此传统的池化方法就显然不适用
  • 为了达到想要的池化效果,CornerNet 提出了 Corner Pooling,左上点的池化区域是其右侧与下方的特征点,右下点的池化区域是其左侧与上方的特征点,下图为左上点的 Corner Pooling,分别在两个不同的特征图上计算 ( x , y ) (x,y) (x,y)( x , H ) (x,H) (x,H) 的最大值以及 ( x , y ) (x,y) (x,y)( W , y ) (W,y) (W,y) 的最大值,将两个最大值相加即得到了 Corner Pooling 输出特征图上的 ( x , y ) (x,y) (x,y)
    工程实现时,可以分别从下到上、从右到左计算最大值,这样效率会更高

预测输出


如上图所示,CornerNet 在 Corner Pooling 层之后输出了 3 个预测量:

  • (1) Heatmaps:角点热图,预测特征图中可能出现的角点,大小为 C × W × H C×W×H C×W×HC C C 代表类别数 (当某个位置的 C C C 个通道均输出 0 时就表示背景类,因此不需要单独设置背景类),以左上角点的分支为例,坐标为 ( c , x , y ) (c,x,y) (c,x,y) 的预测点代表了在特征图上坐标为 ( x , y ) (x,y) (x,y) 的点是第 c c c 个类别物体的左上角点的分数。假设有 N N N 个 GT 框,角点热图上就有 N N N 个正样本和 C × W × H − N C×W×H-N C×W×HN 个负样本,这就带来了正负样本的不均衡。为此,CornerNet 借鉴了 Focal Loss 的思想,对于不同的负样本给予了不同的权重。设 p c i j p_{cij} pcij 为角点热图上通道 c c c 位置 ( i , j ) (i,j) (i,j) 的预测值, y c i j y_{cij} ycij 为角点热图的真值。具体而言,作者以标签角点为中心,根据 GT 框大小划定了一个半径为 r r r 的区域,使得落在其中的角点仍然可以生成有效的预测框 (i.e. IoU ≥ \geq 0.7)。根据半径 r r r 和标签角点的位置可以定义一个非归一化的二元高斯分布 e − x 2 + y 2 2 σ 2 e^{-\frac{x^2+y^2}{2\sigma^2}} e2σ2x2+y2,其中 σ = r / 3 \sigma=r/3 σ=r/3。然后利用该高斯分布去修改负样本标签 y c i j y_{cij} ycij 从而降低接近标签角点的负样本权重
    y c i j = { e − x 2 + y 2 2 σ 2 , x 2 + y 2 ≤ r 2 0 , o.  w y_{c i j}= \begin{cases}e^{-\frac{x^{2}+y^{2}}{2 \sigma^{2}}}, & x^{2}+y^{2} \leq r^{2} \\ 0, & \text { o. } w\end{cases} ycij={e2σ2x2+y2,0,x2+y2r2o.w如果两个高斯分布区域重叠,就去最大的 Y c i j Y_{cij} Ycij。由此得到角点检测的损失
  • (2) Offsets:设网络的下采样率为 n n n,则原图像的 ( x , y ) (x,y) (x,y) 会被映射到角点热图的 ( ⌊ x n ⌋ , ⌊ y n ⌋ ) (\lfloor\frac{x}{n}\rfloor,\lfloor\frac{y}{n}\rfloor) (nx,ny)。当我们重新将角点热图上的点映射回原图像时就会产生坐标精度损失,这尤其会影响小目标的检测精度。因此,作者增加了 Offsets 来表示在取整计算时丢失的精度,以进一步提升检测的精度,其大小为 2 × W × H 2×W×H 2×W×H,坐标偏差为
    其中, k k k 表示第 k k k 个标签角点。损失函数采用 smooth L1 函数:
  • (3) Embeddings:Heatmaps 中的预测角点都是独立的,而一个物体需要一对角点。Embeddings 分支负责为每个标签角点生成一个 Embedding 向量,使得同一对标签角点的 Embedding 向量差的 L1 范数足够小,从而将左上角点的分支与右下角点的分支进行匹配,找到属于同一个物体的角点,完成检测任务,其大小为 1 × W × H 1×W×H 1×W×H训练阶段,作者设计了 “pull” loss 使得属于同一个物体的两个标签角点对应 Embedding 向量尽量接近,“push” loss 使得不属于同一个物体的两个标签角点对应 Embedding 向量尽量远离。设 e t k e_{tk} etk 为第 k k k 个物体左上标签角点的 Embedding 向量, e b k e_{bk} ebk 为第 k k k 个物体右下标签角点的 Embedding 向量,则两种损失为:
    其中, e k = ( e t k + e b k ) / 2 e_k=(e_{tk}+e_{bk})/2 ek=(etk+ebk)/2Δ = 1 \Delta=1 Δ=1
  • 最终的训练损失为
    其中, α = β = 0.1 , γ = 1 \alpha=\beta=0.1,\gamma=1 α=β=0.1,γ=1
  • 测试时,首先根据角点热力图选出 top- k k k 的左上角点和右下角点,然后两两计算左上角点和右下角点 Embedding 向量之差的 L1 范数,如果该范数小于阈值,则生成一个预测框,该预测框的置信度为左上角点和右下角点置信度的均值 (缺点:匹配耗时长、易误检)

检测中心点: CenterNet

  • paper: Objects as Points

  • CornerNet 虽然实现了利用关键点做物体检测,但其需要两个角点进行匹配,匹配过程耗时较长,并且容易出现误检的样本。而 CenterNet 则更进一步,仅使用物体中心点这一个关键点做检测,将物体检测问题变成了一个关键点估计问题,物体的宽高则可以通过物体中心点处的图像特征回归得到
  • CenterNet 实现了当时检测精度与速度最好的权衡,整体结构相当优雅 (CenterNet 分别使用 ResNet-18、DLA-34、Stacked Hourglass-104 作为 backbone,依次增加了网络复杂度,提高了检测精度)

Keypoint Heatmap

  • I ∈ R W × H × 3 I\in \R^{W\times H\times 3} IRW×H×3 为输入图像,我们的目标是使用关键点预测网络生成 Y ^ ∈ [ 0 , 1 ] W R × H R × C \hat Y\in[0,1]^{\frac{W}{R}\times\frac{H}{R}\times C} Y^[0,1]RW×RH×C关键点热力图,其中 R = 4 R=4 R=4 为下采样率 (与 CornerNet 的下采样率相同), C C C 为关键点的类别数,对于物体检测而言, C = 80 C=80 C=80 为物体的类别数, Y ^ x , y , c \hat Y_{x,y,c} Y^x,y,c 代表 ( x , y ) (x,y) (x,y) 属于 c c c 类关键点的置信度
  • 关键点预测网络的训练方式与 CornerNet 一样,对于 c c c 类 GT 关键点 p ∈ R 2 p\in\R^2 pR2,首先将其映射到特征图上得到 p ~ = ⌊ p R ⌋ \tilde p=\lfloor\frac{p}{R}\rfloor p~=Rp,接着使用高斯核函数 Y x y c = exp ⁡ ( − ( x − p ~ x ) 2 + ( y − p ~ y ) 2 2 σ p 2 ) Y_{xyc}=\exp\left(-\frac{(x-\tilde p_x)^2+(y-\tilde p_y)^2}{2\sigma_p^2}\right) Yxyc=exp(2σp2(xp~x)2+(yp~y)2) 降低 GT 关键点周围负样本的训练权重。如果两个高斯分布区域重叠,就去最大的 Y x y c Y_{xyc} Yxyc。最终的训练损失penalty-reduced pixel-wise logistic regression with focal loss
    其中 N N N 为输入图像 I I I 中关键点的数量,超参 α = 2 , β = 4 \alpha=2,\beta=4 α=2,β=4

Local offset

  • 与 CornerNet 一样,为了抵消取整计算时丢失的精度,CenterNet 同样为关键点热力图上的每个点预测了 local offset O ^ ∈ R W R × H R × 2 \hat O\in\R^{\frac{W}{R}\times\frac{H}{R}\times2} O^RRW×RH×2,训练损失采用 L1 loss

Objects as Points: A general purpose object detector

Object detection

  • 当将 CenterNet 用于物体检测时,除了预测中心点,还输出了 S ^ ∈ R W R × H R × 2 \hat S\in\R^{\frac{W}{R}\times\frac{H}{R}\times2} S^RRW×RH×2 用于预测物体的真实宽高 s k s_k sk,训练损失采用 L1 loss
    注意,这里预测的是物体的真实宽高而非归一化后的宽高
  • 最终的训练损失为:
    其中, λ s i z e = 0.1 , λ o f f = 1 \lambda_{size}=0.1,\lambda_{off}=1 λsize=0.1,λoff=1

keypoints Y ^ \hat Y Y^, offset O ^ \hat O O^, size S ^ \hat S S^ 都共享一个 backbone,只是使用了不同的 heads (i.e. 3 × 3 3\times3 3×3 Conv + ReLU + 1 × 1 1\times1 1×1 Conv)

  • 推理时,首先对于每个类别提取出关键点热力图中的 peaks (i.e. 值比周围 8 个点都大),然后保留 top 100 peaks 作为检测出的物体中心点 (peak keypoint extraction 相当于一个高效的 NMS 过程,可以通过 3 × 3 3\times 3 3×3 的最大值池化来高效地实现)。对于中心点 ( x i , y i ) (x_i,y_i) (xi,yi),其检测置信度为 Y ^ x i y i c \hat Y_{x_iy_ic} Y^xiyic对应的预测框位置
    其中 ( x ^ i , y ^ i ) = ( R x i , R y i ) (\hat x_i,\hat y_i)=(Rx_i,Ry_i) (x^i,y^i)=(Rxi,Ryi) 为预测的该中心点映射回原图像的位置, ( δ x ^ i , δ y ^ i ) = O ^ x ^ i , y ^ i (\delta\hat x_i,\delta\hat y_i)=\hat O_{\hat x_i,\hat y_i} (δx^i,δy^i)=O^x^i,y^i 为预测的 local offset, ( w ^ i , h ^ i ) = S ^ x ^ i , y ^ i (\hat w_i,\hat h_i)=\hat S_{\hat x_i,\hat y_i} (w^i,h^i)=S^x^i,y^i 为预测的物体宽高。可以看到,所有的输出预测框都是直接由中心点生成的,不存在 NMS,先验框与标签的匹配,正、负样本的筛选等过程

3D detection

  • CenterNet 不仅可以用于 2D 物体检测,还可以用于其他任务。与 2D 检测不同,单目 3D 物体检测需要预测物体相对于当前相机的距离 (depth)、物体的长宽高 (3D size) 及朝向信息 (orientation),这些可以在 CenterNet 网络的基础上通过增加 Head 分支来实现,相比起其他 3D 物体检测,CenterNet 的实现更为简洁快速
  • (1) depth d d d: CenterNet 通过额外的 head 输出 D ^ ∈ [ 0 , 1 ] W R × H R \hat D\in[0,1]^{\frac{W}{R}\times\frac{H}{R}} D^[0,1]RW×RH 来预测深度信息。值得注意的是,我们很难直接对深度 d d d (in meter) 进行回归,为此,CenterNet 转而回归 d ^ \hat d d^,其中 d = 1 / σ ( d ^ ) − 1 d=1/\sigma(\hat d)-1 d=1/σ(d^)1σ \sigma σ 为 sigmoid 函数,损失函数为原始深度域中的 L1 loss,也就是在 sigmoid 之后再计算损失
  • (2) 3D size: CenterNet 通过额外的 head 输出 Γ ^ ∈ R W R × H R × 3 \hat \Gamma\in\R^{\frac{W}{R}\times\frac{H}{R}\times 3} Γ^RRW×RH×3 来预测物体的长宽高,直接使用 L1 loss 回归以米为单位的 3D size
  • (3) Orientation θ \theta θ: CenterNet 通过额外的 head 输出 A ^ ∈ R W R × H R × 8 \hat A\in\R^{\frac{W}{R}\times\frac{H}{R}\times 8} A^RRW×RH×8 来预测朝向信息。值得注意的是,朝向信息本来也只是一个标量 ( [ 0 , 2 π ] [0,2\pi] [0,2π]),但和深度信息类似,同样也很难直接对它进行回归。为此,CenterNet 使用了一个 8 维向量对朝向信息进行编码,这 8 个标量可以分为两组,一组用来回归 [ − 7 π 6 , π 6 ] [-\frac{7\pi}{6},\frac{\pi}{6}] [67π,6π] 的角度,另一组用来回归 [ − π 6 , 7 π 6 ] [-\frac{\pi}{6},\frac{7\pi}{6}] [6π,67π] 的角度,每一组都包含 4 个标量。在 i ∈ { 1 , 2 } i\in\{1,2\} i{1,2}α i = [ b i , a i ] \alpha_i=[b_i,a_i] αi=[bi,ai] 内, b i ∈ R 2 b_i\in\R^2 biR2 用于 softmax 分类预测物体角度属于该组的得分, a i ∈ R 2 a_i\in\R^2 aiR2 用于预测 ( sin ⁡ ( θ − m i ) , cos ⁡ ( θ − m i ) ) (\sin(\theta-m_i),\cos(\theta-m_i)) (sin(θmi),cos(θmi)),其中 m i m_i mi 为改组的中心角度。总的 8 维向量即为 α ^ = [ b ^ 1 , a ^ 1 , b ^ 2 , a ^ 2 ] \hat\alpha=[\hat b_1,\hat a_1,\hat b_2,\hat a_2] α^=[b^1,a^1,b^2,a^2],训练损失如下所示:
    其中, c i = I ( θ ∈ B i ) , a i = ( sin ⁡ ( θ − m i ) , cos ⁡ ( θ − m i ) ) c_i=\mathbb I(\theta\in B_i),a_i=(\sin(\theta-m_i),\cos(\theta-m_i)) ci=I(θBi),ai=(sin(θmi),cos(θmi))。最终的朝向信息 θ \theta θ
    其中 j j j 为具有更大分类得分的组编号

Human pose estimation

  • 人体姿态估计需要对每个人物预测出 k k k 个 2D 人体关节点 ( k = 17 k=17 k=17 for COCO)。CenterNet 的做法是将每一个关节点作为中心点的偏移量,直接在中心点位置回归出这些偏移量的值,也就是使用额外的 head 输出 J ^ ∈ R W R × H R × k × 2 \hat J\in\R^{\frac{W}{R}\times\frac{H}{R}\times k\times 2} J^RRW×RH×k×2 来预测关节点相对中心点的偏移量 (in pixels),损失函数采用 L1 loss
  • 为了进一步精修关节点位置,CenterNet 还使用了额外的 head 输出 Φ ^ ∈ R W R × H R × k \hat \Phi\in\R^{\frac{W}{R}\times\frac{H}{R}\times k} Φ^RRW×RH×k 来预测关节点热力图,训练损失与中心点热力图一样,采用 penalty-reduced pixel-wise logistic regression with focal loss。有了关节点热力图之后,对于每个关节点类别 j j j,CenterNet 提取出所有置信度大于 0.1 的点组成集合 L j L_j Lj 作为可能的关节点。假设由相对中心点偏移得到的关节点位置为 l j l_j lj ( j ∈ { 1 , . . . , k } j\in\{1,...,k\} j{1,...,k}),CenterNet 将 l j l_j lj 移动到了 L j L_j Lj 中离它最近的点 arg min ⁡ l ∈ L j ( l − l j ) 2 \argmin_{l\in L_j}(l-l_j)^2 lLjargmin(llj)2 来对 l j l_j lj 进行精修 (considering only joint detections within the bounding box of the detected object)

锚框自学习: Guided Anchoring

  • paper: Region Proposal by Guided Anchoring

  • Anchor 的弊端之一是超参的人工设计与正负样本不均衡,并且无法很好地处理极端大小宽高物体,如果能自动地设计出更加优越高效的 Anchor,也是一种解决思路。基于此思想,商汤提出了锚框自学习 (Guided Anchoring) 算法,能够根据图像的特征自动地预测 Anchor 的位置和形状,生成一组稀疏但高效的 Anchor,全程无须人工的设计,并且还设计了 Feature Adaption 模块来修正特征图使之与 Anchor 形状更加匹配
  • 在使用 ResNet-50-FPN 作为 backbone 的情况下,Guided Anchoring 将 RPN 的 recall (AR@1000) 提高了 9.1 个点,将其用于不同的物体检测器上,可以提高 mAP 1.2 到 2.7 个点不等

Guided Anchoring

  • I I I 为输入图像,则 Anchor 的分布可以表示为下式:
    它将 Anchor 的概率分布分解为两个条件概率分布,也就是给定图像特征之后 Anchor 中心点的概率分布,和给定图像特征和中心点之后的形状概率分布。根据上面的公式,Anchor 的生成过程可以分解为两个步骤,Anchor 位置预测形状预测,这也是论文标题中 Guided Anchoring 的由来。传统的手工 Anchor 设计可以看成是 p ( x , y ∣ I ) p(x,y|I) p(x,yI) 是均匀分布而 p ( w , h ∣ x , y , I ) p(w,h|x,y,I) p(w,hx,y,I) 是冲激函数的一个特例
  • Guided Anchoring 的网络框架如下图所示,主要分为锚框预测特征自适应两部分,其中锚框预测部分负责预测 Anchor 出现的位置与形状并生成一组稀疏且高效的锚框,而特征自适应模块可以根据生成 Anchor 的形状来生成新的特征图供之后的预测 (Anchor 的分类和回归) 使用整个网络相比之前只是增加了 3 个 1 × 1 1\times1 1×1 conv 和 1 个 3 × 3 3\times3 3×3 deformable conv,带来的模型参数量的变化很小

Anchor Generation

  • (1) 位置预测: 使用了一个 1 × 1 1×1 1×1 卷积来预测 Anchor 可能出现的位置,这里的输出大小为 W × H × 1 W×H×1 W×H×1,每个点表示 Anchor 的中心点出现在此位置的概率。在训练时,将 GT 框中心一小块对应在 feature map 上的区域作为正样本,其余区域按照离中心的距离标为忽略或者负样本。通过位置预测,我们可以筛选出一小部分区域作为 Anchor 的候选中心点位置,在保证召回率的同时使得 Anchor 数量大大降低。在推理的时候,预测完位置之后,我们可以采用 masked conv 替代普通的 conv,只在有 anchor 的地方进行计算,可以进行加速
  • (2) 形状预测: 使用了一个 1 × 1 1×1 1×1 卷积来预测 Anchor 的宽与高,输出大小为 W × H × 2 W×H×2 W×H×2。不过由于 Anchor 都是网络自己定的,它的最优宽高不好确定,也就难以在训练时直接使用 L1/L2/smooth L1 函数计算损失,所以我们训练时直接使用 IoU 作为监督信号,让网络自己去优化 Anchor 宽高使得 IoU 最大 (bounded IoU Loss)。不过这里面还有个问题,就是对于某个 Anchor,应该优化和哪个 GT 框的 IoU,也就是说应该把这个 Anchor 分配给哪个 GT 框。对于以前常规的 Anchor,我们可以直接计算它和所有 GT 框的 IoU,然后将它分配给 IoU 最大的那个 GT 框。但是很不幸现在的 Anchor 的 w w wh h h 是不确定的,是一个需要预测的变量。我们将这个 anchor 和某个 gt 的 IoU 表示为 v I o U ( a w h , g t ) = max ⁡ w > 0 , h > 0 I o U n o r m a l ( a w h , g t ) \mathrm{vIoU}\left(a_{w h}, \mathrm{gt}\right)=\max _{w>0, h>0} \mathrm{IoU}_{n o r m a l}\left(a_{w h}, \mathrm{gt}\right) vIoU(awh,gt)=maxw>0,h>0IoUnormal(awh,gt)。当然我们不可能真的把所有可能的 w w wh h h 遍历一遍然后求 IoU 的最大值,所以采用了近似的方法,也就是 sample 一些可能的 w w wh h h。理论上 sample 得越多,近似效果越好,但出于效率的考虑,我们 sample 了常见的 9 组 w w wh h h,进而完成匹配关系,确定优化对象。我们通过实验发现,最终结果对 sample 的组数这个超参并不敏感,也就是说不管 sample 多少组,近似效果已经足够
  • (3) 生成 Anchor: 在得到 Anchor 位置和中心点的预测之后,我们便可以生成 Anchor 了,如下图所示。这时的 Anchor 是稀疏的而且每个位置形状不一。采用生成的 Anchor 取代标准的锚框方法,AR (Average Recall) 已经可以超过普通 RPN 4 个点了,代价仅仅是增加两个 1 x 1 1x1 1x1 conv

Feature Adaption (特征自适应)

  • 故事本可以就此结束,我们用生成的 Anchor 和之前的特征图来进行 Anchor 的分类和回归,涨点美滋滋。但是我们发现一个不合理的地方,大家都是同一层 conv 的特征,凭啥我就可以比别人优秀一些,代表一个又长又大的 anchor,你就只能代表一个小小的 anchor。不合理的原因一方面在于,在同一层 conv 的不同位置,feature 的 receiptive field 是相同的,在原来的 RPN 里面,大家都表示相同形状的 anchor,所以相安无事,但是现在每个 anchor 都有自己独特的形状大小,和 feature 就不是特别好地 match。另一方面,对原本的特征图来说,它并不知道形状预测分支预测的 anchor 形状,但是接下来的分类和回归却是基于预测出的 anchor 来做的,可能会比较懵逼,存在特征不适配的问题
  • 我们增加了一个 Feature Adaption 模块来解决这种问题。思路很简单,就是把 anchor 的形状信息直接融入到特征图中,这样新得到的特征图就可以去适应每个位置 anchor 的形状。我们利用一个 3 × 3 3\times3 3×3deformable convolution 来修正原始的特征图,而 deformable convolution 的 offset 是通过 anchor 的 w w wh h h 经过一个 1 × 1 1\times1 1×1 conv 得到的。(此处应该划重点,如果是像正常的 deformable convolution 一样,用特征图来预测 offset,则提升有限,因为没有起到根据 anchor 形状来 adapt 的效果)
  • 通过这样的操作,达到了让 feature 的有效范围和 anchor 形状更加接近的目的,同一个 conv 的不同位置也可以代表不同形状大小的 anchor 了。从表格可以看到,Feature Adaption 还是很给力的,带来了接近 5 个点的提升

高质量 proposal 的正确打开方式

  • 故事到这里其实也可以结束了,但是我们遇到了和之前一些改进 proposal 的 paper 里相同的问题,那就是 proposal 质量提升很多 (如下图),但是在 detector 上性能提升比较有限。在不同的检测模型上,使用 Guided Anchoring 可以提升 1 个点左右。明明有很好的 proposal,但是 mAP 却没有涨很多,让人十分难受
  • 经过一番探究,我们发现了以下两点:1. 减少 proposal 数量,2. 增大训练时正样本的 IoU 阈值 (这个更重要)。既然在 top300 里面已经有了很多高 IoU 的 proposal,那么何必用 1000 个框来训练和测试,既然 proposal 们都这么优秀,那么让 IoU 标准严格一些也未尝不可。通过这两个改进,在 Faster R-CNN 上的涨点瞬间提升到了 2.7 个点 (没有加任何 trick),其他方法上也有大幅提升

谈谈 Anchor 设计准则

  • (1) Alignment: Alignment 是指 anchor 的中心点要和 feature 的位置对齐。由于每个 anchor 都是由 feature map 上的一个点表示,那么这个 anchor 最好是以这个点为中心,否则位置偏了的话,这个点的 feature 和这个 anchor 就不能非常好地对应起来,用该 feature 来预测 anchor 的分类和回归会有问题。我们设计了类似 cascade/iterative RPN 的实验来证明这一点,对 anchor 进行两次回归,第一次回归采用常规做法,即中心点和长宽都进行回归,这样第一次回归之后,anchor 中心点和 feature map 每一个像素的中心就不再完全对齐。我们发现这样的两次 regress 提升十分有限。所以我们在形状预测分支只对 w w wh h h 做预测,而不回归中心点位置
  • (2) Consistency: Consistency 是指 anchor 的特征要和形状匹配。这条准则是我们设计 feature adaption 的初衷,由于每个位置 anchor 形状不同而破坏了特征的一致性,我们需要通过 feature adaption 来进行修正。这条准则本质上是对于如何准确提取 anchor 特征的讨论。对于两阶段检测器的第二阶段,我们可以通过 RoI Pooling 或者 RoI Align 来精确地提取 RoI 的特征。但是对于 RPN 或者单阶段检测器的 anchor 来说,由于数量巨大,我们不可能通过这种 heavy 的方法来实现特征和框的精确 match,还是只能用特征图上一个点,也就是 512 × 1 × 1 512\times1\times1 512×1×1 的向量来表示。那么 Feature Adaption 起到了一个让特征和 anchor 对应更加精确的作用,这种设计在其他地方也有可以借鉴之处

参考文献

  • 《深度学习之 PyTorch 物体检测实战》
  • CornerNet
  • Guided Anchoring: 物体检测器也能自己学 Anchor (来自 Guided Anchoring 二作、OpenMMLab 团队大佬的讲解)

摆脱锚框:Anchor-Free相关推荐

  1. 锚框(anchor box)/先验框(prior bounding box)概念介绍及其生成

    一.锚框(anchor box)/先验框(prior bounding box) 在众多经典的目标检测模型中,均有先验框的说法,有的paper(如Faster RCNN)中称之为anchor(锚点), ...

  2. 动手学CV-目标检测入门教程3:锚框(anchor)

    3.3 锚框 or 先验框 本文来自开源组织 DataWhale

  3. 0927锚框(Anchor box)

    锚框(Anchor box) 目标检测算法中,通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含所感兴趣的目标,并调整区域边界从而更加准确地预测目标的真实边界框(ground-truth b ...

  4. YOLO-先验框/anchor(锚点)

    目标检测网络(Faster RCNN.SSD.YOLO v2&v3等)中,均有先验框的说法,Faster RCNN中称之为anchor(锚点),SSD称之为prior bounding box ...

  5. 结合具体代码理解yolov5-7.0锚框(anchor)生成机制

    最近对yolov5-7.0的学习有所深入,感觉官方代码也比较易读,所以对网络结构的理解更进一步,其中对锚框生成这块没太看明白细节,也想弄明白这块,于是前前后后好好看了代码.现在把我的学习收获做一下记录 ...

  6. 直播预告 | AAAI 2022论文解读:基于锚框排序的目标检测知识蒸馏

    「AI Drive」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和 ...

  7. Pytorch 锚框

    Pytorch 锚框 0. 环境介绍 环境使用 Kaggle 里免费建立的 Notebook 教程使用李沐老师的 动手学深度学习 网站和 视频讲解 小技巧:当遇到函数看不懂的时候可以按 Shift+T ...

  8. 《动手学深度学习》(七) -- 边界框和锚框

    1 边界框 在目标检测中,我们通常使用边界框(bounding box)来描述对象的空间位置.边界框是矩形的,由矩形左上角的以及右下角的xxx和yyy坐标决定.另一种常用的边界框表示方法是边界框中心的 ...

  9. 李沐动手学深度学习v2-目标检测中的锚框和代码实现

    一.目标检测中的锚框 前提: 本节锚框代码实现,使用了很多Pytorch内置函数,如果有对应函数看不懂的地方,可以查看前面博客对相应函数的具体解释,如下链接所示: Pytorch中torch.mesh ...

最新文章

  1. push notification for iphone
  2. 别太把GitHub的Star当回事
  3. 从bsp redirect到ui5_ui5
  4. hiho1257 Snake Carpet
  5. hdu 2112 ——HDU Today
  6. 利用matlab绘制图形
  7. 【学习笔记】圆方树(CF487E Tourists)
  8. springmvc应用-自定义参数解析器
  9. Java数据结构——代码实现顺序表的操作
  10. Floyd + 传递闭包
  11. 压缩包已损坏或压缩格式未知无法打开 的解决办法
  12. Python运行jieba出现Building prefix dict from the default dictionary ...解决办法(会显示正确结果)
  13. Java教程——软件开发基础
  14. android主线程和子线程的区别
  15. 高校房产管理平台架构及安全性需求分析
  16. ubuntu16.04运行PL-SVO
  17. python爬取碧蓝航线所有战舰头像
  18. 服务器物理内存利用率,服务器提高物理内存利用率
  19. ERROR: Failed to parse XML in D:\MyAPP\XXXX\app\src\main\AndroidManifest.xml
  20. 深层循环神经网络(DRNN)

热门文章

  1. 无法获取 dpkg 前端锁_济南一小区分类垃圾桶上了锁?闲置不用惹居民质疑
  2. 如何构建一个图书推荐系统
  3. 【教3妹学java】类加载的过程是什么样的?
  4. Excel用Python矩阵求解
  5. Mikrotik Ros安全加固
  6. Hybris架构总结。。。。个人笔记
  7. 1月15日服务器例行维护公告,传奇世界网页版1月15日维护更新公告
  8. 近期开发的移动app考研帮V2.1.2上架了,欢迎拍砖
  9. 关于TCP三次连接的深入探讨
  10. js中的Reflect入门讲解