[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

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

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


为了解决这个问题,我们可以先通过 \(\text{max-pool}\) 或者 \(\text{conv}\) 层进行 downsampling,然后再 upsampling 回原大小:

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

  • Unpooling

  • Max-unpooling

  • Transpose Convolution

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

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

    在 Convolution 操作时,我们可以将输入图像拉伸为 \(1\) 维向量 \(X\in\mathbb R^{D}\),输出图像拉伸为 \(1\) 维向量 \(Y\in\mathbb R^{D'}\),则卷积核可以写作一个稀疏矩阵 \(C\in \mathbb R^{D'\times D}\),使得 \(CX=Y\). 在 Upsampling 中,已知 \(C,Y\),欲得到 \(X\),Transpose Convolution 的操作是:\(X=C^TY\),这也是其名称的由来。显然这样做并没有恢复值,除非 \(CC^T=I\).


Object Detection

Idea 1: Regression

构造神经网络输出检测物体的类别以及框住物体的矩形框的坐标 \((x,y)\) 和大小 \((w,h)\).

由于在 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:首先把原图像上的矩形区域按比例投影到输出矩阵上,然后取整使矩形端点落在整点上,对于这个矩形,我们将其尽可能地等分成需要的形状,并在每一块中作 \(\text{max-pool}\),最终得到该区域的 feature.

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

    • RoI Align:仍然把原图像上的矩形区域投影到输出矩阵上,然后直接等距离划分成需要的形状;现在考察每一个小块,它们的顶点不一定在整点上,我们在其中取 \(4\) 个位置,对每个位置用它周围的 \(4\) 个整点的值作双线性插值,然后取 \(\text{max-pool}\),最终得到该区域的 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. 对于每一个位置,计算 \(K\) 个不同的 anchor box,这样我们得到了 \(K\times H\times W\) 个数值表示该 anchor 处是否有物体,以及 \(4K\times H\times W\) 个数值表示 box 四边的修正值。
    3. 取得分最高的约 \(300\) 个 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日
许可协议