文章目录

前言:

R-CNN系列对比表格放到最后了。

R-CNN系列推演:

每一篇都是前一篇或者前几篇的改造版,所以按顺序看会比较好。

论文题目:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

下载地址:​​https://arxiv.org/pdf/1506.01497.pdf​

这篇论文是 Faster R-CNN 不是Fast R-CNN 别搞混了,之前这里我就搞混了哈哈。

论文不用我说看题目都知道是Fast R-CNN的改进模型,所以泛读为主,节省时间(偷个懒)。

先回顾R-CNN模型及其改进模型:

R-CNN

SPP

Fast R-CNN

一张图片提取2000个候选框 ,并强制缩放到固定尺寸后送给CNN

整张图片直接送给CNN

整张图片+一组候选框送给CNN

CNN提取每个候选框的feature map

CNN得到整张图的feature map,通过SS得到候选区域与feature map直接映射得到特征向量

CNN得到feature map 通过ROI池化层得到特征向量

将CNN提取的feature map 送给SVM分类,送给BB回归进行定位修复

映射的特征向量给SSP,SSP输出固定大小的特征向量,再给 FC,再SVM+回归

特征向量送入FC 再接 一个合并网络(softmax分类+BB回归)

模型提出的背景

实际上在上一篇读Fast R-CNN最后做小总结的时候就已经发现了,从最基础的R-CNN开始 到后来的各种改进模型 都是用的SS(Selective Search)提取候选框(region proposal),SS实际上是贪心算法,并且属于传统算法,并且不像CNN那样可以放到GPU上,SS都是在CPU上,所以在之前的几个模型中都是计算量大户,直接的拖慢了整个模型,还一直没有更新突破。

本文作者就要解决这个计算大户(你肯定得解决啊,毕竟论文题目这么厉害,要实时监测 那好几秒的延迟谁受得了,放无人车上,车都开山沟里了你才反应过来可还行哈哈)。

作者提出的改进方法

上面也提到了 SS是放在CPU上进行计算的,所以要么大改SS算法,要么给他放GPU上加快计算。

作者提出了他的RPN模型,RPN解决的两个主要问题,回归区域边界 (regress region bounds) and 目标分数(objectness scores )。

回归区域边界就是我们画出来的那个候选框,目标分数就是 模型要能分清楚当前是背景还是需要检测目标,他会给当前打一个分 相当于当前是目标的置信度。

这里要说一下,一开始我也弄错了,就是作者所说的目标分数是当前是否是物体的置信度,也就是说,只要他是物体不是背景,无论他属于那个分类或者没有该分类,只要不是背景,他的目标分数就高。我一开始理解成 该物体要属于我们期望的分类时置信度才高,搞错了额。

整体架构

先看一下整体结构,然后再看每个小模块。

【目标检测 论文泛读】Faster R-CNN (清晰表格对比 R-CNN 系列模型)_卷积

简单介绍一下这张图,他是从下往上走的。
步骤:

  • Conv layers:先让图片通过CNN卷积层得到feature map,该feature map起共享作用,用于后续的RPN和FC。
  • Region Proposal Networks: feature map 进入 Region Proposal Networks(RPN) 得到候选框。
  • Roi Pooling: 根据送入的 feature map 和候选框 产生 候选框的feature map。
  • Classification:利用输入的 候选框 的feature map给其分类,然后再次BB回归修正候选框的位置。

Anchors:

这个Anchors 翻译成 锚,我还是建议记英文。 Anchors应用在RPN层,所以先说一下Anchors 然后再说RPN。

对于Anchors 我个人的简单理解就是 ‘框’。 在训练的过程中,对于某一个物体,或者说某一块像素区域不可能一个框就直接画准,所以针对该区域产生了好多个可能的预测框,这些个框就叫Anchors。

这里可以看出来Anchors操作就代替了之前在R-CNN中使用选择性搜索SS画2000个框的操作了。

Anchors操作过程就是针对feature map进行滑动窗口操作,这样feature map上每一个窗口中的点都对应着原图的一小块区域(这里其实挺好理解的,毕竟feature map就是通过感受野卷积来的),针对每一个点生成Anchors,在本论文中生成了9个Anchors。

这里我用论文中的图:

下面的灰色就是整个feature map, 上面的红色框就是滑动窗口,而窗口中的每个点都生成了对应的好几个Anchors。

【目标检测 论文泛读】Faster R-CNN (清晰表格对比 R-CNN 系列模型)_池化_02


生成的框可以想象成下面这样,不同尺寸,不同长宽比的 蓝 绿 红 色框,一共九种预测框。

【目标检测 论文泛读】Faster R-CNN (清晰表格对比 R-CNN 系列模型)_特征向量_03

所以 假设一个卷积特征图的大小为w * h,那么这张卷积特征图上总共有:w * h * k 个anchors. 本文中K = 9。

anchors让图片具有一定的平移不变性,你物体平移到哪里都能被检测到啊,因为anchors的产生就是整个图片的滑窗操作嘛。

RPN:

看一下论文中给出的图:

【目标检测 论文泛读】Faster R-CNN (清晰表格对比 R-CNN 系列模型)_深度学习_04


在看了上面的anchors介绍之后,这个就没啥难理解的了。

CNN输出的feature map给到RPN,然后通过anchors生成预测框,将预测框再交给两部分,一部分是判断他是目标物体还是背景(左分支,就是上面说的目标分数),另一部分就是做回归修正框的位置(右分支)。

256-d表示特征图共有256张,k是每个基准点的anchor的个数,2k scores表示k个anchors的softmax的分数,每个anchor2个score(foreground/background),4k coordinates表示k个anchors坐标[x、y、w、h]的偏移量的regression结果。

在俩分支前面都有 1 * 1 卷积层,用来代替全连接层。

正负样本划分

正样本为foreground(目标)、负样本为background(背景)。

划分原则:

  • 对每个标定的ground true box区域,与其IoU最大的anchor记为正样本(保证每个ground true至少对应一个正样本anchor)。
  • 剩余的anchor,如果其与某个标定区域重叠比例大于0.7,记为正样本。如果其与任意一个标定的重叠比例都小于0.3,记为负样本。
  • 上两步剩余的anchor不用。
  • 跨越图像边界的anchor不用。

所以说一个ground true可能对应多个anchor。

训练的时候经过上面的划分原则,2W左右个框过滤成了6K个左右,正负样本 1;1 每一组共256个。正负样本各128个,正样本数不够,拿负样本填充。

测试的时候用clip对剪掉越界的部分。

后面还加入了NMS非极大值抑制,对重叠的框进行进一步过滤(IOU >0.7),就剩下2000个框了。还可以选择top-n进一步过滤。

小总结

anchors的一些卷积逆推操作突然让我想到反卷积,不过这里并不是反卷积,反卷积需要精确的数值,不过anchors的操作中并不需要精确值,他只需要画出来当前feature map点对应原图中的位置,通过感受野应该很简单能得到原图的框。

惯例 一张表对比一下之前的模型方便梳理思路。

R-CNN

SPP

Fast R-CNN

一张图片提取2000个候选框 ,并强制缩放到固定尺寸后送给CNN

整张图片直接送给CNN

整张图片+一组候选框送给CNN

CNN提取每个候选框的feature map

CNN得到整张图的feature map,通过SS得到候选区域与feature map直接映射得到特征向量

CNN得到feature map 通过ROI池化层得到特征向量

将CNN提取的feature map 送给SVM分类,送给BB回归进行定位修复

映射的特征向量给SSP,SSP输出固定大小的特征向量,再给 FC,再SVM+回归

特征向量送入FC 再接 一个合并网络(softmax分类+BB回归)

Faster R-CNN

整张图片给CNN,提取出feature map

feature map送给RPN模块,RPN内部: 滑窗生成anchors,然后分类(背景还是物体)+回归修正 得到精准的候选框。

精准候选框+第一步整张图的feature map送给ROI池化,生成候选框的feature map,最后分类(物体的分类)+回归。