目标检测论文泛读

目标检测论文泛读

最近的任务可能会用到目标检测里的proposal,我目前对proposal这个词的理解是潜在的可能是检测物体的bounding box。因此本篇博文大致介绍一下各种方法的工作方式之后,会着重介绍proposal的生成。同时还要注明一点,这是一篇笔记文章,论文中的一些名词暂且不做详尽的解释,如果有疑惑的地方可以结合原论文阅读。

Fast RCNN

image-20220527193952380

该模型的输入是一张完整的图片 + 这张图片的proposals,图片的proposals是通过Selective Search得到的。

贡献:

1.不需要人为地对图片进行操作(RCNN中的这部分操作一定程度上破坏了图片的结构信息),在过程中通过ROI pooling layer将特征图resize成固定的尺寸,以满足全连接层的输入要求。

2.只对图片进行一次CNN特征提取,然后共享特征图进行多任务操作,也就是共享了卷积操作,大大减少了计算量,减少了运行时间。

3.用softmax取代SVM分类器,将原来分步处理合并成一个连续的过程,避免了特征存储、浪费磁盘空间等问题,降低了过程的复杂度。

4.处理图片速度大大提高。

缺点:

Fast R-CNN中采用selective search算法提取候选区域,而目标检测大多数时间都消耗在这里,selective search算法候选区域提取需要2~3s,而提特征分类只需要0.32s,这无法满足实时应用需求。

Faster RCNN

这篇论文读起来挺酣畅淋漓的,它是对前文Fast RCNN的一个升级,主要做的工作就是将生成Proposal的工作整合到一个网络中了,这样输入就是一张单独的图片

img

其结构如图,图片引自知乎大佬白裳

结合原论文介绍一下Region Proposal Networks(RPN)是如何实现的。

img

对于前面卷积神经网络得到的特征图,我们以原文使用的VGG16为例,网络最后的feature map的维度是\(58 \times 38 \times 512\),首先通过一个\(3 \times3\)的卷积,得到的仍是\(58 \times 38 \times 512\)的输出,这一步相当于每个点又融合了周围\(3 \times3\)的点的信息

  • 第一条线

    再通过一个\(1 \times 1\)的卷积,卷积核个数是18,因此输出一个\(58 \times 38 \times (9 \times 2)\)的向量,之后通过一个Softmax函数输出特征图每个点对应的每个anchor的 is object or not object的概率。

  • 第二条线

    再通过一个\(1 \times 1\)的卷积,卷积核个数是36,因此输出一个\(58 \times 38 \times (9 \times 4)\)的向量,之后通过一个Softmax函数输出特征图每个点对应的每个anchor的四个坐标。

至此 RPN网络生成了对应的proposals。其损失函数是:

\[L\left(\left\{p_{i}\right\},\left\{t_{i}\right\}\right)=\frac{1}{N_{c l s}} \sum_{i} L_{c l s}\left(p_{i}, p_{i}^{*}\right)+\lambda \frac{1}{N_{\text {reg }}} \sum_{i} p_{i}^{*} L_{\text {reg }}\left(t_{i}, t_{i}^{*}\right) . \]

image-20220529094018098

值得留意的是在训练和测试RPN阶段,二者使用的都并不是所有的anchor,训练阶段采用的是从每个minibatch中随机采样出256个anchor,其中positive和negative的比例是1:1,在测试阶段则是使用了所有的anchor,但是把超出图片范围的anchor裁剪了。

img

由于这个网络综合来看,是存在两个结构,一个是FAST RCNN,另一个是RPN,至于怎么综合训练这个网络,论文分了四个步骤:

image-20220529095519794

Mask RCNN

ROL pooling vs RolAlign

这里建议先去了解一下这两个概念,总之就是ROL pooling会忽略特征图的很多信息,而RolAlign通过特定的的方法,去尽可能的保留特征图的信息,后者的准确率会高很多,现在的实现方法也都是RolAlign。

image-20220529212032409

结构

image-20220529111048821

这篇论文其实挺复杂的,刚开始读起来的时候,涉及到的技术也比较多,比如FPN,FCN,ROIAlign

  • 使用FPN构建特征图

    image-20220529164552686
  • Loss Function

    \[L O S S=L_{r p n}+L_{{fast\_rcnn}}+L_{mask} \]

前面两个跟之前的Faster_RCNN是一致的。这里重点介绍一下\(L_{mask}\)

image-20220529210057681

首先通过backbone+FPN生成特征图,然后通过RPN网络生成一系列的Proposals(正样本),对应每一个proposal,将其结合特征图输入RolAlign得到一个向量进入mask Branch得到一个\(28 \times 28 \times num\_cls\)的mask,然后将其映射到原图大小,在将原先的proposal映射到原图,二者去计算一个loss。

我们接着从测试角度去理解一下Mask-RCNN:

image-20220529211356558

值得注意的是,如图红线部分,先是通过Fast_RCNN Predictor得到一个proposal,然后将其送给Mask branch前面的RolAlign,也就是说,只有一个proposal进入了此branch,但是这也导致了模型的实时性不好(是顺序进行的,没法并行计算)。

由于目前还没有去更新代码部分,这里的记录会有些生硬,后面会结合代码进行更加详细的说明。

Yolact

image-20220530103937123

这个方法针对实例分割提出了one-stage方法,具有实时性(30fps)。例如Mask-RCNN这样的two-stage的方法,需要先生成一个预测框然后才能去预测mask。但是Yolact方法采用了一个Protonet的分支先生成32个"prototype Mask",然后再根据Prediction Head预测"prototype Mask"对应的"coefficient"(参数),将二者进行一个线性组合,这个公式对应上图中的Assembly部分:

\[\text { finalmask }=\sum_{i}^{n} \text { mask }_{i} \times \text { coefficient }{ }_{i} \]

代码

Yolact

  • Protonet网络生成的Prototype Mask
Output Prototypes
image-20220610153517824 image-20220610153522847
image-20220610153529881 image-20220610153534633
image-20220610153541006 image-20220610153546086
image-20220610153552039 image-20220610153558853
image-20220610153613989 image-20220610153618807

Refer

MASK-RCNN详解:https://blog.csdn.net/qq_37541097/article/details/123754766

双线性插值:https://blog.csdn.net/qq_37541097/article/details/112564822

posted @ 2022-06-10 15:41  CuriosityWang  阅读(118)  评论(0编辑  收藏  举报