Zexian Li

目标检测(object detection)论文小记

2021-06-26 · 24 min read

简单记录最近阅读的几篇有趣的目标检测论文🎅

方法综述

目标检测的主流方法是anchor-based,也存在一些anchor-free的尝试。
anchor-based:在图片上铺海量的预设anchor,随后对anchor进行种类预测和n次边界回归。通常来说,双阶段方法对边界修正的次数会多于单阶段方法,所以二阶段方法通常有较高的精度,单阶段方法常有较高的计算效率。

  • one-stage
    均匀且密集地采样以获得海量候选框,随后进行分类(eg SSD)
  • two-stage
    在筛选过的、稀疏的候选框(滤掉了绝大多数背景/负样本)上进行分类(eg Faster R-CNN)

anchor-free:不使用预设anchor,直接检测物体。

  • keypoint-based
    先定位一些预设的/自学习得到的关键点,再依此生成候选框以检测物体(eg Cornernet预测候选框的左上角和右下角点,再进行组合)
  • center-based
    将物体正中心点/中心区域视为正样本,再基于此预测该位置到目标四条边框的距离(eg FCOS将前景框的所有像素点均视为正样本,随后对每个点回归其到框边界的距离)

评价指标

mAP

常用数据集

MS COCO:包含80类物体。数据集划分如下:train有80k图片,val有40k图片。
MSCOCO 2017: training118k validation5k(val) testing about20k无标注(test-dev)
trainval35k部分的115K图片(train的80k图片+)用于训练,minival部分的5k图片用于validation。

论文笔记

(1) (2021 CVPR)YOLOF: You Only Look One-level Feature

  • Motivation

对RetinaNet的FPN结构做消解实验发现:SiMo仅轻微掉点,故C5特征可能就已涵盖了检测所需要的足够信息;SiMo明显优于MiSo,故分治策略(即多检测头)的重要性远大于融合输入特征的重要性。由上述两点,决定将输入从多输入砍到单输入。
通常认为FPN的核心优势在于多特征融合(multi-scale feature fusion)和分治策略(divide-and-conquer)。本文提出,FPN最大的优势是在密集目标检测时使用分治策略(逐级检测)来进行优化。
RetinaNet-FPN-单多输入-单多输出

分治策略可以视为一种优化的方法:将大问题拆分成小问题来解决。但其多头结构降低检测速度,使结构更复杂,带来了更大的空间负担。决定将多输出砍到单输出。

  • 主要贡献

将FPN简化成单输入(32倍下采样的C5特征)单输出的结构,同时为了弥补SiSo到MiMo的性能差距:

  1. C5特征的感受野大小受限
    提出了空洞编码器(Dilated Encoder)来获取多尺度特征

  2. Positive anchor对应的GT大小不均衡
    提出均衡匹配策略(Uniform Matching)来解决单特征图中稀疏anchor引起的positive anchor不平衡问题。

COCO数据集上,在效果相当的同时,YOLOF可以:
比FPN版本速度快了2.5倍;比DETR的训练轮次少了7倍;比YOLOv4快了13%。

  • overall
    YOLOF结构

  • 实现细节

  1. 空洞编码器
    C5特征的感受野很小,只能cover小物体;使用连续的dilated conv疯狂扩展感受野后,只能捕获大物体。故使用残差结构+空洞卷积,使模型既可以捕获小物体,也能捕获大物体。
    dilated encoder
    模型的Projector部分,使用1*1卷积减少通道数,使用3*3卷积修复语义信息;残差块部分使用四个不同dilated rate,不共享参数的block,每个block中,第一个conv降通道数,第二个dilated conv扩大感受野,第三个conv恢复通道数。

  2. 均衡匹配策略
    MiMo模型可以在不同的输出层级上定义不同大小的anchor,然而SiSo模型只有单层输出,对应的anchor数量自然变少。anchor本就容易和大尺度样本有较大的overlap,假设将与任GT bbox的IoU>0.5的anchor定义为positive anchor,那单输入特征图&少anchor时,anchor的不均衡就更为明显:positive anchor主要由大样本占据;模型的重心在大样本上,检出小样本的数量变少。
    positive anchor均衡性
    Uniform Matching:对于每个GT bbox,选取距其最近的K=4个anchor作为positive anchor。
    YOLOF在C5 feature的每个位置上构建5个anchor,尺度分别为{32, 64, 128, 256, 512}。

  • 改进/Challenge/idea/Que

(2) (FAIR)RetinaNet: Focal Loss for Dense Object Detection

  • Motication
    one-stage方法和two-stage方法的核心区别在于:two-stage送去分类器的候选框是稀疏的(过滤了绝大多数背景样本),而为了实现检测任务,one-stage必须在图片内进行密集的均匀采样,得到未经过滤的候选框并依此去cover所有空间位置。自然地,one-stage这种采样方法得到的候选框中以容易被分类的背景框居多。two-stage方法的候选框大概在1~2k个,one-stage方法的候选框却可达到100k个左右。

为什么two-stage方法常常更准呢?本文认为其核心问题在于训练检测器时样本所属前景-背景类别的不均衡性(the extreme foreground-background class imbalance encountered during training of dense detectors)。基于此,作者在交叉熵损失函数的基础上提出了Focal Loss,有效阻止海量的、易被分类的背景样本主导训练过程,在对其进行降权的同时,让网络更加关注难样本(更多是正样本)的分类过程。总体来说,当网络对一个样本的预测越准确,该样本对loss的贡献程度越低。

  • 主要贡献
    提出Focal Loss来解决正负样本不均衡的问题;基于此提出one-stage的RetinaNet,在保持优良速度的同时具有大幅超过two-stage方法的精度,达到SOTA。

  • overall
    对于交叉熵损失函数,在真值类别时,Loss=log(P)Loss = -log(P),在其他类别时,Loss=log(1P)Loss = -log(1 - P)。作者认为在此中,简单样本带来的loss不足够小,当简单的背景样本过于多的时候还是可以主宰整个训练过程。为了将训练的注意力集中在难样本上,作者提出了如下图的focal loss。
    positive anchor均衡性
    假设模型输出概率PP。对应地,在两种情况下分析模型处理简单样本的过程:在真值类别下,PP很大,接近于1,Pt=PP_{t} = P,这时损失函数的值就超小;在其他类别下,预测得很准时PP应该很小,接近于0,此时的Pt=1PP_{t} = 1 - P还是很大,损失函数仍然很小。反之,处理难样本时的损失函数没有被削减。

RetinaNet结构图

(3) (2019 ICCV)FCOS: Fully Convolutional One-Stage Object Detection

  • 针对痛点:
  1. anchor-based方法需要人为设计框的尺寸及超参数,这些参数的优劣会造成显著地性能差异,且人为设计的候选框很难匹配尺度多变的目标;
  2. anchor-based方法常需要海量的候选框(eg FPN在800见方的图片中需要180K个anchor),过多的负样本框会造成训练时的样本不平衡;训练时对IoU的不断计算也会导致较大的计算开销;
  3. 传统的anchor-free & one-stage方法有两大弊端,一是只将anchor中心点所在的网格试做正样本,这种样本不平衡对recall有较大负面影响;一是很难处理重叠物体(anchor方法可很好的解决重叠问题)。
  • 主要贡献:
  1. FCN(fully convolutional networks)已其他领域开展得如火如荼,eg语义分割,首在object detection领域基于FCN方法实现的FCOS有助于复用其他领域经验。
  2. anchor-free的FCOS省去了调参的负担,在计算更轻量、训练更容易的同时有着不亚于two-stage/anchor-based方法的精度,启发了对anchor必要性的思考。
  3. 提出one-stage的FCN-based网络,提出基于FPN的多尺度预测和center-ness方法,有效解决了当下存在的两大弊端。
  • 实现流程:
    网络的流程图如下所示:
    流程图
    对于单个候选框,每层网络输出一个K维分类label、一个4维距离坐标和一个center-ness得分。该网络较常用的anchor-based方法减少了近9倍的参数量。
  • 实现细节:
  1. one-stage FCN网络
    针对弊端一,FCOS不再只将中心点所在的网格视为正样本,而是将GT bbox所覆盖的所有网格均视为正样本。因此,FCOS舍弃了anchor-based方法中先确定候选框中心位置,再以依此对anchor进行回归的做法,具体地,如下左图所示,对每个前景框的每个点(location),都预测其到GT bbox的上下左右四条边的距离[t, b, l, r],该做法与FCN-based方法在语义分割领域的实现思路一致,且值得注意的是,与anchor-based方法仅将与GT bbox有较高IoU的anchor作为正样本相比,FCOS将GT内的所有像素均作为正样本进行训练,无形中获取了更多更准的信息。
    示例图
    对于某层feature map上的location点(x, y),基于当前层的步长s,先将其映射到原始输入图上的点(s2+xs,s2+ys)(\lfloor \frac s2 \rfloor + xs, \lfloor \frac s2 \rfloor + ys),用映射后的坐标再进行到框边距离的预测,使用指数函数输出四个非负距离量,考虑到不同尺度feature map预测物体大小不同,单纯的指数函数得到距离有失偏颇,FCOS在指数函数中加入可学习参数s(distance = exp(s * x))来适应各个尺度的预测。
    损失函数方面,分类方面使用focal loss,坐标回归方面使用IOU loss。
  2. 基于FPN的多尺度预测
    为解决重叠候选框时的分类问题(如上图右),anchor-based方法在不同特征尺度设计不同尺寸的候选框,FCOS则遵循FPN的思路,在不同的feature map层检测不同尺度的目标,且通过阈值直接限制了每一层检出框的尺寸大小。在FCOS的五个回归branch中,若预测得到的边长长度不符合当前层的长度限制,直接将其视为负样本,这样便粗暴地解决了不同层内目标含有重叠区域的问题。对于同一层内的重叠区域,FCOS直接使用最小的区域作为回归目标(即使同一层内两个同类物体有重叠,小物体会马上被检出,而大物体也定会在未重叠的区域被检出;但不得不说该方法存在理论缺陷,就是同一层内两个不同类物体有重叠,在重叠部分的location可能会返回A物体的种类和B物体的候选框)。依此,FCOS在多尺度预测的同时很好地解决了物体重叠的问题。
    如流程图所示,C3、C4、C5是backbone的feature map,通过1*1的卷积层得到P3、P4、P5,而P6和P7则是由P5、P6经过stride为2的卷积层得到的,不同层之间的heads共享权重。
    直觉上可能会认为FCOS的BPR(best possible recall,检测器能实现的recall上限,只要有一个anchor涉及到GT框便将其纳入BPR计算范畴内)会受到FCN-based方法中大步长的制约,但实际上FCOS的BPR甚至优于传统的anchor-based方法,所以recall不是FCOS需要着重解决的问题,或者说FPN解决了这一问题。
  3. center-ness分支
    在前两步之后,FCOS的性能较anchor-based方法仍有一定的gap,这主要是由一些距物体中心较远的location产生的低质量候选框导致的,FCOS在不引入更多超参数的情况下提出了center-ness分支直接而有效地减少了低质量候选框。
    center-ness
    center-ness的核心思想是,一个GT bbox内的点很多,但它们对目标的贡献是不同的。偏图像中心的点包含了更多的目标信息,理应得到重视;偏图像边界的点包含的信息相对较少,甚至点可能就不在目标上,这些location提出的候选框的质量常较低,理应设置更小的权重。center-ness表征了一个点到其预测候选框中心的距离,其表达式如下所示:

centerness=min(l,r)max(l,r)min(t,b)max(t,b)center-ness = \sqrt{ \frac {min(l, r)}{max(l, r)} * \frac {min(t, b)}{max(t, b)} }

当该点为候选框中心时,center-ness的值为1,该点离中心越远,其值越接近0,使用交叉熵损失函数进行训练。center-ness仅在测试时使用,将其与分类得分(classification score)相乘,共同作为候选框的得分,随后进行NMS筛选。


(4) (2020 CVPR oral)ATSS: Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection

  • Motivation
    对比anchor-based one-stage RetinaNet和anchor-free center-based FCOS,二者有以下三个明显的区别:
  1. 每个像素点(location)处铺设anchor的数量
    RetinaNet以每个location为中心位置铺设多个anchor;FCOS视每个location为一个点,再回归该点到该点所在候选框的边界的距离。
  2. 定义正负训练样本的方法
    RetinaNet将与GT bbox的IoU大于阈值的anchor视为正样本;FCOS将GT bbox内的所有像素点视为正样本。
  3. 在何种载体上回归
    RetinaNet在铺设的anchor上回归;FCOS在像素点上进行物体定位。
    实验表明,性能gap的核心在于第二点。
  • 主要贡献
    首先指出:anchor-based方法和anchor-free方法的本质区别在于如何定义正负训练样本,也正是这带来了性能上的差距。如果在训练中使用相同的定义正负样本的方法,那无论是基于box还是point进行回归,最后都不会有显著的性能差异。

提出了一种自适应的训练样本筛选策略(ATSS, adaptive training sample selection)来依据目标的统计特征自动地筛选样本。

  • 实验过程
  1. 补齐性能差距
    对于mAP,RetinaNet为32.5,FCOS为37.8。为探究anchor-based和anchor-free方法的真正区别,需消除FCOS各种trick对于性能gap的影响:RetinaNet每个像素点处仅许产生一个候选框,再将FCOS的各种trick添加到RetinaNet上(In GT box代表限制GT的正样本数量):
    RetinaNet FCOS实验结果对比
    这时的性能:RetinaNet 37.0 vs FCOS 37.8,仍存在0.8个点的差距。此时anchor-based和anchor-free方法仅有两点不同:检测器分类头对于正负样本的定义、检测器回归头是从anchor回归还是从中心点回归。下面对这两点进行进一步实验,探寻到底哪一个才是问题的关键。

  2. 分类part
    RetinaNet在不同的FPN层级使用IoU来定义样本:将每个目标对应的best anchor和IoU大于阈值的anchor标为正样本,将IoU小于阈值的anchor标为负样本,舍弃剩余anchor。
    FCOS在不同的FPN层级基于空间位置和目标尺度来定义样本:中心点在GT bbox内的为候选正样本,再基于目标尺度和FPN层级的匹配性从中筛选得到真正的正样本,剩余为负样本。
    RetinaNet FCOS定义正负样本方法

  3. 回归part
    RetinaNet回归4个offset(x, y, w, h),FCOS回归到边界的四个距离(l, r, t, b)。
    RetinaNet FCOS回归方法对比

  4. 性能对比
    实验中,只改变了定义样本的方式,但数据可以从多个角度进行分析:
    看每一列,回归的方法确定后,RetinaNet和FCOS均会因定义样本的方式而产生较大的性能gap。
    RetinaNet FCOS性能对比
    以上实验说明,anchor-based和anchor-free方法性能差距的核心在于训练时定义正负样本的方式不同
    PS 看每一行,分类时定义正负样本的方法对齐后,尽管回归方式不同,RetinaNet和FCOS(更进一步地,anchor-based和anchor-free)性能却基本相同。

  • 提出改进
    FCOS提出的定义正负样本的方法优于之前基于IoU的方法,但这些方法都很依赖超参的设置。本文更进一步地,提出了无超参、鲁棒的、依赖数据特征的定义正负样本新方法ATSS(Adaptive Training Sample Selection)。
    ATSS
    简要概括:对于GT G,在每一层找k个距其L2距离最近的anchor,组成候选positive anchor的集合P'。随后计算G和P'的IoU,统计其IoU的均值方差并修正,最后保留IoU大于修正值且中心在G内的所有positive anchor,将其组成正样本集合P;剩余的anchor作为负样本。
    补充优点:这种方法不会像IoU方法,对大物体表现出明显的青睐,在一定程度上保证了尺度的均衡性。
    实验表明,ATSS对于k的大小不敏感,对于anchor的scale和ratio不敏感,具有很好的鲁棒性。

  • 实验结果
    ATSS实验结果
    实验结果表现出了有趣的insight。第一行是原始RetinaNet(每个位置9个anchor),后几行都是每个位置1个anchor。实验结果表明,对于传统的IoU筛选策略,在每个位置多设置一些anchor是有涨点的(37.0 -> 38.4)。然而在优秀的筛选策略ATSS下,每个位置有一个anchor就够了,设置很多不同scale和ratio的anchor反倒没有什么用。

  • 改进/Challenge/idea/Que


(5) (2019 CVPR)HR-Net: Deep High-Resolution Representation Learning for Visual Recognition

  • Motivation
    现有方法常先使用卷积层将输入编码至low-resolution representation,再从中恢复出high-resolution representation(全流程eg U-Net)。然而高分辨率信息对于position-sensitive的任务十分重要。

  • 主要贡献
    HR-Net在全阶段都维持了高分辨率表示,从而获取更丰富的语义信息和更准确的空间位置。
    核心部件:
    (1) 并行的高分辨率到低分辨率的卷积流(connect the high-to-low resolution convolution streams in parallel)
    (2) 重复融合多分辨率流的信息(repreatedly exchange the information across resolutions)

  • overall
    如下图所示,第一行一直保持高分辨率信息。四个阶段中,每阶段都在增加稍低分辨率的并行卷积流(一行行增加),同时通过不同分辨率卷积流的信息交换实现多分辨率融合。
    overall
    如下图所示,融合不同分辨率特征的方法是有区别的:高分辨率到低分辨率使用n个stride为2的3*3卷积进行下采样;同分辨率直接相加;低分辨率到高分辨率使用n个(双线性差值+1*1卷积层)实现上采样和通道对齐。
    信息融合

HRNetV1,HRNetV2和HRNetV2p的结构图如下所示。HRNetV1只输出高分辨率流,用于人体姿态估计;HRNetV2将低分辨率流上采样后将四个流的特征叠加起来,用于语义分割;HRNetV2p在HRNetV2的基础上多了下采样的过程,用于目标检测。
backbone

  • 改进/Challenge/idea/Que
    Related Work中包含了很多文章,eg如何从低分辨率信息中学习,如何重建高分辨率信息,如何维持高分辨率信息,可以好好学习一下。

(6) (2018 ECCV)CornerNet: Detecting Objects as Paired Keypoints

该论文为anchor-free的目标检测论文。

  • 针对痛点
    为覆盖真值,需要大量的anchor,这会造成正负样本的不平衡并降低训练速度;同时anchor的设计需要大量人为设计的超参数和结构,与DL的核心思路不符。
  • 主要贡献
    CornerNet使用候选框左上角和右下角的点来表示bounding box,在摒弃anchor复杂设计的基础上大幅精简了网络的输出;同时论文提出了corner pooling方法以进行更好的角点定位。
  • 实现流程
    如下图所示,卷积层输出一个包含所有左上角点的热图(heatmap),输出一个包含所有右下角点的热图(heatmap),为每个检出角点输出一个嵌入向量(embedding vector)。网络通过训练,为同一目标的角点输出尽可能相似的嵌入向量。
    流程图
    更详细的细节如下图,两个预测模块(prediction module)是独立的,每个模块都有独有的corner pooling层,并基于此输出heatmap,embedding和offset。
    详细流程图
    这种寻找左上/右下点并将其聚合起来的bottom-up方法是受到skeleton-detection的相关研究启发的。
  • 实现细节
  1. 角点检测
    对于输出,以左上角点对应的heatmap为例,heatmap的尺寸为K*H*W,其中K个通道分别代表K个类别,每个通道均为二值mask,表示某一像素点是不是该类别下的角点。
    对于每一个角点,都有其对应的唯一真值点,但训练时并不采用简单的0-1损失函数,而是基于2D高斯核,对以真值为圆心,以特定值为半径的的圆内的预测值给予相对较小的惩罚(半径大小与目标尺寸有关,需保证以圆内点作为角点的候选框与GT的IoU大于0.3),具体损失函数采用focal loss的变种。
    很多网络采用降采样层来获得全局信息、减少存储空间,此时输出的尺寸常小于输入的尺寸,目标边界的定位准确性不免受像素点对齐的影响。为避免此问题,网络在将heatmap中的点映射回原输入图像前先行预测offset以对角点坐标进行微调,对应的offset为O=(xnxn,ynyn)O = (\frac {x}{n} - \lfloor \frac {x}{n} \rfloor, \frac {y}{n} - \lfloor \frac {y}{n} \rfloor),具体回归时采用Smooth L1损失函数。
  2. 角点合并
    模型为所有检测到的角点输出一维embedding,并基于embedding间的距离进行聚类。采用pull-push损失函数。
    在对corner heatmap进行max pooling+NMS操作后,得到100个最有可能的左上角点和100个最有可能的右下角点,在用offset进行校正后,比较左上/右下角点embedding间的L1距离,舍弃距离大于阈值和非同一类别的角点对,保留下来的角点对为初步结果,角点对中两角点的平均值作为检测得分。
  3. 角点池化(Corner Pooling)
    对于目标检测来讲,角点处可能不存在目标信息,且目标信息都处于角点的同一方向。基于此先验信息,将局部max-pooling转变成corner pooling,其核心思想为对于左上角点,目标在其右下方,故只对角点右侧和下侧的特征进行池化(而非右下侧),具体示意如下图所示:
    corner pooling
    且实验表明,corner pooling在尺度大小不同的区域上表现近似相同,展现了一定的稳定性。
  4. 详细的网络结构如下图所示:
    网络结构
    其中backbone采用了在人体骨架检测中广泛应用的沙漏网络(Hourglass network)的变种。

基本常识

  1. 论文中的1x代表以batch size为16,在COCO数据集上训练90k个iter,约为118287张图片上的12.17个epoch。2x等以此类推。
  2. anchor:所有的anchor都参与classification分支的反向传播,此时的损失函数是在K+1类上的交叉熵损失函数,但只有positive anchor才参与regression分支的反向传播。positive的常用定义是IoU阈值,当然也存在一些根据近邻程度的匹配算法。
  3. Anchor的设计存在很多定义方式,但都是在初始anchor(eg 16*16的正方形)上进行变换。
    在单feature map上(eg Faster RCNN),可设定areas和aspect ratio;在多feature map上(eg FPN),可在aspect ratio和areas之外设定scale。
    areas指面积,对应的是边长扩大比例(eg2的3、4、5次幂),这样可得到原图像上对应的anchor大小eg 128*128,256*256,512*512。aspect ratio是在面积不变的情况下改变长宽比(eg 1:2,1:1,2:1),以128*128为例可得到eg 184*96,128*128,96*184。这样就有三种面积,每种面积下三种比例,故RPN在每个点处生成9个候选框。
    scale指anchor的缩放比例,eg2021/3=1.2622/3=1.592^{0},2^{1/3}=1.26,2^{2/3}=1.59。当然这也和FPN中有多种尺度的特征图输出有关。
Bad decisions make good stories.