参考代码:SparseR-CNN
1. 概述
介绍:这篇文章在目标检测领域中提出了一种新颖的检测问题思路,摒弃掉RetinaNet或是Faster-RCNN中那种预先定义密集目标检测解空间的方式,直接在输入端定义 N N N个可学习的proposal box和proposal feature(后期用于对于每个box的动态预测)用以实现目标检测任务。有点类似DETR中直接输出固定数量的检测结果,去除掉了引入anchor或是pixel-wise预测的稠密解空间假设,使得整体目标检测网络结构简化。只不过文章的算法是假设有 N N N个先验目标(proposal box),并通过学习的方式去学习这些参数,而且这些proposal box在预测的时候是不能预先进行排除的,需要将这些proposal box都送入到后面的dynamic head中的到最后的box regression和classification。因而这个 N N N的先验在实际场景下设置显得很关键,而且这 N N N个先验都需要去跑一遍dynamic head,没有办法在前期进行筛选。
这里按照proposal的生成进行划分,文章将检测算法的大致分类划分为如下3种:
图(a)代表是的RetinaNet为代表的逐像素预测,图(b)代表的是先通过RPN筛选proposal之后再进行预测。图(c)直接假设需要预测框的数量并直接通过学习的当时得到proposal。文章对proposal box和dynamic head所需的proposal feature都是通过学习的方式得到的,那么其训练的难易程度(收敛性)见下图的比较:
2. 方法设计
2.1 网络结构
文章的整体的网络结构与Faster RCNN系列算法近似,前期特征提取使用的是FPN,只是在RPN部分使用了参数化学习的proposal box,并且在检测部分使用了proposal feature,对应的预测部分其结构见下图所示:
对于文章的代码实现可以参考:
# ./projects/SparseRCNN/sparsercnn/detector.py#L35
class SparseRCNN(nn.Module):
...
2.2 proposal box与proposal feature
在这篇文章的定义中proposal box ∈ R N ∗ 4 \in R^{N*4} ∈R