[CS231n]6·Detection and Segmentation

CS231n Convolutional Neural Networks for Visual Recognition

https://www.bilibili.com/video/BV1nJ411z7fe

Overview


Semantic Segmentation

对图像的每一个像素进行分类。

Idea 1: Sliding Window

对每一个像素点用一个神经网络做一次分类。效率很差,进行了许多重复计算,nobody use it.

Idea 2: Fully Convolutional

经过一个卷积神经网络,每一个卷积层都保持原图像的大小,最终对每个像素都得到其各分类的得分,从而得到每个像素的分类结果。

问题:卷积非常耗时,因为每一个卷积层都保持原图像大小。


为了解决这个问题,我们可以先通过 或者 层进行 downsampling,然后再 upsampling 回原大小:

我们很清楚如何 downsampling,问题在于如何进行 upsampling

  • Unpooling

  • Max-unpooling

  • Transpose Convolution

    视输入矩阵为 filter 的权重,按权重将 filter 累加到输出矩阵中。

    Transpose Convolution 只能恢复卷积前后的大小,并不能恢复值,其原理是:

    在 Convolution 操作时,我们可以将输入图像拉伸为 维向量 ,输出图像拉伸为 维向量 ,则卷积核可以写作一个稀疏矩阵 ,使得 . 在 Upsampling 中,已知 ,欲得到 ,Transpose Convolution 的操作是:,这也是其名称的由来。显然这样做并没有恢复值,除非 .


Object Detection

Idea 1: Regression

构造神经网络输出检测物体的类别以及框住物体的矩形框的坐标 和大小 .

由于在 Object Detection 中,我们并不能实现知道输入图像中有多少个 object,所以其输出大小是不固定的,并且当 object 很多时输出将很大。因此这不是一个很好的方法。

Idea2: Sliding Window

滑动一个矩形框,每次对矩形框内的图像进行分类。

该方法也有很明显的问题:矩形框的位置和大小都是未知的,我们需要暴力遍历各种矩形框,每次都通过一个巨大的 CNN 网络得到类别,这无疑十分耗时。

Idea 3: Region Proposals & R-CNN

  • Region Proposals: 先通过一个网络给出物体可能存在的若干矩形范围,后续工作只需在这些范围内进行。Selective Search 是一种给出 Region Proposals 的方法,其运行速度非常快。

  • R-CNN:在每一个给定的矩形范围内,我们可以构建 CNN 网络,输出该矩形内物体的类别以及这个矩形区域应该如何修正。注意由于每个矩形大小不同,而我们的网络要求特定大小的输入,所以我们会先对这些矩形进行变形使之符合网络的输入要求。具体见下图:

    该方法的不足在于,对每个矩形区域进行计算依然十分耗时耗力。

  • Fast R-CNN:Idea 是我们先把图像输入进 CNN 网络,再对网络的输出结果进行矩形区域划分,这样图像只会经过一次 CNN 网络,从而提高运行速度。

    这里有个问题是如何在 CNN 网络的输出结果上进行 Region Proposals:

    • RoI (Region of Intrest) Pool:首先把原图像上的矩形区域按比例投影到输出矩阵上,然后取整使矩形端点落在整点上,对于这个矩形,我们将其尽可能地等分成需要的形状,并在每一块中作 ,最终得到该区域的 feature.

      由于我们在这个过程中进行了两次近似——取整和划分,所以这种方法的问题在于我们得到的区域特征稍有偏离。

    • RoI Align:仍然把原图像上的矩形区域投影到输出矩阵上,然后直接等距离划分成需要的形状;现在考察每一个小块,它们的顶点不一定在整点上,我们在其中取 个位置,对每个位置用它周围的 个整点的值作双线性插值,然后取 ,最终得到该区域的 feature.

  • Faster R-CNN:实测中发现,在 Fast R-CNN 中,Region Proposals 占了大部分时间。为了提高这部分的速度,Faster R-CNN 用一个 Region Proposal Network 在 CNN 的输出矩阵上作矩形区域划分,其余部分和 Fast R-CNN 相同。

    Region Proposal Network (RPN) 的原理如下:

    1. 想象以 feature map 的每一个位置为中心有固定大小的 anchor box,使用一个 CNN 预测这些 anchor box 中是否有物体,以及对 box 四边的修正值。
    2. 对于每一个位置,计算 个不同的 anchor box,这样我们得到了 个数值表示该 anchor 处是否有物体,以及 个数值表示 box 四边的修正值。
    3. 取得分最高的约 个 anchor box 作为我们的 region proposals.

    在训练时,我们会将四个 loss 一起训练—— RPN 二分类(判断是否是物体)、RPN anchor box 位置的 loss、最终分类(判断是何物)的 loss、最终 box 的坐标的 loss。

  • YOLO / SSD / RetinaNet:Faster R-CNN 其实有两个阶段:第一个阶段是得到 region proposals,通过一个基础的 CNN 和 RPN 完成,第二个阶段是对每一个 region 进行分类以及修正边界,通过 RoI pool / align 之后输入到 CNN 完成。而 YOLO / SSD / RetinaNet 等网络只用一个阶段,具体的内容不在此课程中讲授。


可以看出,Object Detection 有很多选择:首先,基础的网络有很多选择(VGG16 / ResNet-101 / Inception V2……);接下来,我们可以选择二阶段的 Faster R-CNN 或者单阶段的 YOLO / SSD 或者混合的 R-FCN……这其中就有许多的 trade-offs. 例如,Faster R-CNN 比 SSD 更慢,但是准确率比后者更高;又如网络越大越深,效果越好,但训练也越难,耗时也越多……

这里有一篇综述论文:Zou et al, “Object Detection in 20 Years: A Survey”, arXiv 2019


Instance Segmentation

Mask R-CNN

类似于之前的 Faster R-CNN,不过最后一个卷积网络不是对区域内容进行分类,而是对每一类输出一个 mask。

Mask R-CNN 还可以做 pose estimation,即预测人体的姿势。


[CS231n]6·Detection and Segmentation
https://xyfjason.github.io/blog-main/2021/03/11/CS231n-6·Detection-and-Segmentation/
作者
xyfJASON
发布于
2021年3月11日
许可协议