语义分割


语义分割

在语义分割中,每个像素根据其所属物体的类别(例如,道路、汽车、行人、建筑物等)进行分类。例如分割图像右侧的所有自行车都变成了一大块像素。此任务的主要困难在于,当图像通过常规CNN时,它们会逐渐失去其空间分辨率(由于步幅大于1的层),因此常规的CNN可能最终会知道在图像的左下角有一个人,但不会比这更精确了。

就像物体检测一样,有许多种方法可以解决此问题,有些方法非常复杂。但是,Jonathan Long等人在2015年的论文中提出了一个相当简单的解决方法。作者首先采用经过预训练的CNN,然后将其转换为FCN。CNN对输入图像应用的总步幅为32(如果所有步幅的总和都大于1),则意味着最后一层输出的特征图是输入图像的1/32。这显然太粗糙了,因此他们添加了一个单独的上采样层把分辨率乘以32.

有几种解决方法可用于上采样(增加图像的大小),例如双线性插值,但仅在X4或X8时才有效。取而代之的是,他们使用转置的卷积层:等效于首先插入空的行和列(充满零)来拉伸图像,然后执行常规的卷积。可以对转置的卷积层进行初始化以执行接近于线性插值的操作,但是由于它是可训练的层,因此在训练过程中会学习的更好。在tf.keras中,可以使用Conv2DTranspose层。

在转置的卷积层中,步幅定义了输入将被拉伸的程度,而不是滤波步长的大小,因此步幅越大,输出就越大。

这个解决方法可以,但仍然不够精确。为了做得更好,作者添加了来自较低层的跳过连接:例如,他们将输出图像上采样2倍(而不是32倍),并添加了具有两倍分辨率的较低层的输出。然后,他们对结果进行16倍的上采样,从而得到32倍的总上采样。这样可以恢复一些早期池化层丢失的空间分辨率。在他们的最佳架构中,他们使用了第二个类似的跳过连接来从更底层恢复甚至更精细的细节。简而言之,原始CNN的输出经过以下额外步骤:放大X2,添加较低层(适当比例)的输出,放大X2,添加甚至更底层的输出,最后方法X8。甚至有可能扩大到超出原始图像的大小:这可用于提高图像的分辨率,这是一种称为超分辨率的技术。

TensorFlow卷积运算

  • keras.layers.Conv1D

为一维输入(例如时间序列或文本(字母或单词的序列))创建卷积层。

  • keras.layers.Conv3D

为3D输入(例如3D PET扫描)创建卷积层

  • dilaton_rate

将任何卷积层的dilation_rate超参数设置为2或更大的值会创建“a-trous卷积层”。这等效于使用常规卷积层,并通过插入为零的行和列像孔一样来扩大滤波器。例如,可以使用4来扩展[[1,2,3]]的1X3滤波器,从而得到[[1,0,0,0,2,0,0,0,3]]来扩展滤波器。这使得卷积层无需任何计算费用,也无需使用任何额外参数就具有更大的接受视野

  • tf.nn.depthwise_conv2d()

可用于创建深度卷积层(但需要自己创建变量)。它将每个滤波器独立地应用于每个单独的输入通道。因此,如果有\(f_n\)个滤波器和\(f_{n'}\)个输入通道,则将输出\(f_n\times f_{n'}\)特征图

相关