Image Segmentation¶
约 1280 个字 17 张图片 预计阅读时间 5 分钟
Semantic Segmentation¶
语义分割(Semantic Segmentation)的目标是将图像中的每个像素分配到一个特定的类别中。它并不区分同一类别中的不同实例,只关注每一个像素属于哪一个类别。

类似于目标识别,我们也可以通过滑动窗口的方式来实现语义分割,但是这样的方法计算量太大,过于低效耗时。处理语义分割任务的常用方法是全卷积网络(Fully Convolutional Network,FCN)。

假设我们设计了一个由很多卷积层构成的网络,并且能一次性对图像总的所有像素进行预测和分类,那么我们就会发现两个突出的问题:
- 有效感受野会随着使用的卷积层数量线性增长,导致分辨率下降,分割结果模糊。
- 对高分辨率的图像进行卷积操作是非常昂贵的,例如当我们想要整个图像有一个整体的感知时,就需要很多层的卷积操作。
那么现在我们就可以转变思路,首先对图像进行下采样操作,然后在较低的分辨率下进行卷积操作,最后再通过上采样操作将结果恢复到原始分辨率。

目前为止,我们已经知道了如何对图像进行下采样,例如 pooling 和 stride convolution,但是该如何进行上采样呢?
Upsampling¶
Bed of Nails & Nearest Neighbor¶

- bed of nails:将每个像素的值复制到上采样后对应的池化窗口的左上角,然后填充其他像素为 0。
- nearest neighbor:把上采样前像素的值复制到池化窗口中的所有像素。
Bilinear Interpolation¶

-
bilinear interpolation:通过线性插值法利用两个最近的 neighbor 来计算上采样后各个像素的值。
计算公式为 $$ f_{x,y} = \sum_{i,j} f_{i,j} max(0, 1-|x-i|) max(0, 1-|y-j|) $$ 其中 $i \in \{ \lfloor x \rfloor - 1, \cdots \lceil x \rceil + 1 \}, j \in \{ \lfloor y \rfloor - 1, \cdots \lceil y \rceil + 1 \} $
Bicubic Interpolation¶

- bicubic interpolation:类似于 bilinear interpolation,只不过考虑了三个最近的 neighbor。
Max Unpooling¶

- max unpooling:在进行最大池化时我们要记住每个池化窗口中最大值的所在位置,在 max unpooling 的时候就要把对应位置的像素从上采样之前的像素值复制过来,其余为止填 0.
Transposed Convolution¶

回顾普通的卷积操作,我们可以将其看作是一个特征图上的滑动窗口,每次滑动都会通过若干个输入值计算得到一个输出值。

而转置卷积(transposed convolution)则是将卷积操作反过来,从一个输出值反推回多个输入值。具体来说就是将输入图像中的其中一个像素值与一个 filter 相乘,然后将结果分别加到输出图像的不同位置上。
1D example
我们还可以从矩阵乘法的角度来考虑转置卷积操作。(这也是转置卷积这一术语的由来)
例如当我们进行一维的卷积操作时,我们可以将每一个滑动窗口中的若干个像素值都看作一个行向量,把这些行向量组合起来就得到了一个矩阵。而 filter 则可以看作一个列向量,将这个列向量与矩阵相乘就得到了卷积操作的结果。
转置卷积操作则与之相反,每个滑动窗口中的若干个像素值都看作一个列向量,组合起来就得到一个矩阵。filter 仍看作一个列向量,将这个列向量与矩阵相乘就得到了转置卷积操作的结果。
Exmaple
Info
transposed convolution 操作还有一些其他的名称,例如我们可能会在各种文章和 paper 中遇到:
- deconvolution(bad name)
- upconvolution
- fractionally-strided convolution
- backward strided convolution
现在我们有了上采样的方法,就可以使用 fully convolutional network 来进行语义分割了。
Instance Segmentation¶
Detect all objects in the image, and identify the pixels that belong to each object (Only things!)
需要注意的是,实例分割只关注图像中的物体,而不关注图像的背景。
Approach: Perform object detection, then predict a segmentation mask for each object!
Mask R-CNN¶
Mask R-CNN 是 Faster R-CNN 的扩展,通过在 Faster R-CNN 的基础上增加一个新的分支来解决实例分割问题。
Mask R-CNN 引入了一个新的分支,用于生成每个 RoI 的二值掩码。这个掩码是一个小的二进制图像(通常为 28x28 或 56x56),它与候选区域的大小一致,标记该区域内每个像素是否属于某个物体的像素。

Example

Beyond Instance Segmentation¶
-
Panoptic Segmentation:同时处理实例分割和语义分割,将图像中的每个像素分配到一个特定的类别中,并且区分同一类别中的不同实例。
-
Human Keypoints Detection:检测人体的关键点,例如头部、肩膀、手肘、手腕等。