深度学习-卷积神经网络--Semantic Segmentation语义分割-59

1. ROI Align pooling

pooling池化层的本质是 降采样
先复习一下 ROI pooling
这种 Pooling 方法是在 Faster RCNN 中看到的

RoIWrap Pooling
该 Pooling 方法比前面提到的 Pooling 方法稍微好一些。对于一个选出来的预测框,
它的对应的 RoI 区域可以通过 feat stride 算出来(crop 操作)。

例子:在该网络中假设使用的骨架网络中的 feat stride=16,且测试图像中的一个边界框的
大小为 400∗ 300

1)corp 操作。边界框在对应 feature map 上的大小为 400/16∗ 300/16=25∗ 18.75,
注意这个时候出现小数了。那么就需要像之前的方法一样对其进行第一次量化操作,得到的
特征图上大小为 25∗ 18。
2)warp 操作。这里使用的是双线性差值算法,使 corp 操作的特征图变化到固定的尺
度上去,比如 14∗ 14,这样再去做 Pooling 得到固定的输出。这里的坐标就是连续的了,
不会存在量化误差。
可以看出这里去掉了第二次的量化操作,进而减小了误差,也提升了检测的精度

RoIAlign Pooling
这种 Pooling 方法是在 Mask RCNN 中被采用的,这相比之前的方法其内部完全去掉了量化操作,取而代之的线性操作,使得网络特征图中的点都是连续的。从而提升了检测的精确度。

用之前的例子来看看吧。在该网络中假设使用的骨架网络中的 feat stride=16,且测试图像中的一个边界框的大小为 400∗ 300。

  1. 到对应 feature map 中对应的区域。这里可以算出对应的区域大小为 400/16∗300/16=25∗ 18.75,这个通过双线性差值计算的得到。这就是这一部分的结果了,不会对其进行量化操作。

  2. 得到 Pooling 结果。假设 Pooling 的固定输出为 7∗ 7,那么每个块得到的大小是 25/7∗ 18.75/7=3.57∗ 2.65。对于这样的一个块,假设在其中选择 2∗ 2 个采样点,那么每个采样点的值也是可以通过线性差值得到,这样也是连续的。
    因而相比前面的两个算法,其内部实现并没有存在量化的操作,也就没有因为量化而带来的误差。这就使得其检测精确度进一步提升,

2. FPN


检测不同尺度的目标很有挑战性,尤其是小目标的检测。特征金字塔网络(FPN)是一种旨在提高准确率和速度的特征提取器。它取代了检测器(如 Faster R-CNN)中的特征提取器,并生成更高质量的特征图金塔,

FPN 由自下而上和自上而下路径组成。其中自下而上的路径是用于特征提取的常用卷积网络。空间分辨率自下而上地下降。当检测到更高层的结构,每层的语义值增加。

FPN 提供了一条自上而下的路径,从语义丰富的层构建高分辨率的层。虽然该重建层的语义较强,但在经过所有的上采样和下采样之后,目标的位置不精确。在重建层和相应的特征图之间添加横向连接可以使位置测更加准确。

在 FPN 中,我们生成了一个特征图的金字塔。用 RPN(详见上文)来生成 ROI。基于 ROI 的大小,我们选择最合适尺寸的特征图层来提取特征块,

3. 图像语义分割Semantic Segmentation

图像语义分割(Semantic Segmentation)是图像处理和是机器视觉技术中关于图像理解的重要一环,也是 AI 领域中一个重要的分支。语义分割即是对图像中每一个像素点进行分类,确定每个点的类别(如属于景、人或车等),从而进行区域划分。目前,语义分割已经被广泛应用于自动驾驶、无人机落点判定等场景中。

  1. 语义分割(semantic segmentation):对图像中逐像素进行分类。
  2. 实例分割(instance segmentation):对图像中的 object 进行检测,并对检测到的object 进行分割。
  3. 全景分割(panoptic segmentation):对图像中的所有物体进行描述。
    CNN 的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:
    较浅的卷积层感知域较小,学习到一些局部区域的特征,较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征,抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于分类性能的提高。
    这些抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体。

分类:

分割:
与分类不同的是,语义分割需要判断图像每个像素点的类别,进行精确分割,图像语义分割是像素级别的!但是由于 CNN 在进行 convolution 和 pooling 过程中丢失了图像细节,即 feature map size 逐变小,所以不能很好地指出物体的具体轮廓、指出每个像素具体属于哪个物体,无法做到精确的分割。

4. Fully Convolutional Networks(FCN)

Fully Convolutional Networks(FCN)用于图像语义分割。自从提出后,FCN 已经成为语义分割的基本框架,后续算法其实都是在这个框架中改进而来。
对于一般的分类 CNN 网络,如 VGG 和 Resnet,都会在网络的最后加入一些全连接层,经过 softmax 后就可以获得类别概率信息。但是这个概率信息是 1 维的,即只能标识整个图片的类别,不能标识每个像点的类别,所以这种全连接方法不适用于图像分割。

FCN 提出可以把后面几个全连接都换成卷积,这样就可以获得一张 2 维的 featuremap,后接 softmax 获得每个像素点的分类信息,从而解决了分割问题。
就这么简单!!!


就是一直卷 再接upsample 得到原图一样的尺寸大小

在 FCN 网络中的作用,明显可以看到经过上采样后恢复了较大的 pixelwise featuremap(其中最后一个层 21-dim 是因为 PACSAL 数据集有 20 个类别+Background)。这其实相当于一个 Encode-Decode 过程。

  1. 对于 FCN-32s,直接对 pool5 feature 进行 32 倍上采样获得 32x upsampled feature,再对 32x upsampled feature 每个点做 softmax prediction 获得 32x upsampledfeature prediction即分割图)。

  2. 对于 FCN-16s,首先对 pool5 feature 进行 2 倍上采样获得 2x upsampled feature,再把 pool4 feature 和 2x upsampled feature 逐点相加,然后对相加的 feature 进行16 倍上采样,并 oftmax prediction,获得 16x upsampled feature prediction。

  3. 对于 FCN-8s,首先进行 pool4+2x upsampled feature 逐点相加,然后又进行pool3+2x upsampled 逐点相加,即进行更多次特征融合。具体过程与 16s 类似,不再赘述。

3种网络结果对比,明显可以看出效果:FCN-32s < FCN-16s < FCN-8s,即使用多层 feature 融合有利于提高分割准确性

5. U-Net

论文:https://lmb.informatik.uni-freiburg.de/Publications/2015/RFB15a/
U-Net 是原作者参加 ISBI Challenge 提出的一种分割网络,能够适应很小的训练集(大约 30 张图)。U-Net 与 FCN 都是很小的分割网络,既没有使用空洞卷积,也没有后接 CRF,结构简单。

整个 U-Net 网络结构如图,类似于一个大大的 U 字母:首先进行 Conv+Pooling 下采样;然后 Deconv 反卷积进行上采样,crop 之前的低层 feature map,进行融合;然后再次上采样。重复这个过程,直获得输出 388x388x2 的 feature map,最后经过 softmax获得 output segment map。总体来说与 FCN 思路非常类似。

U-Net 采用了与 FCN 完全不同的特征融合方式:拼接

与 FCN 逐点相加不同,U-Net 采用将特征在 channel 维度拼接在一起,形成更“厚”的特征, 一个是add 一个是concat

语义分割网络在特征融合2 种办法:
FCN 式的逐点相加,对应 tensorflow 的 tf.add()
U-Net 式的 channel 维度拼接融合,对应 tensorflow 的 tf.concat()

总结一下,CNN 图像语义分割也就基本上是这个套路:
下采样+上采样:Convlution + Deconvlution/Resize
多尺度特征融合:特征逐点相加/特征 channel 维度拼接
获得像素级别的 segement map:对每一个像素点进行判断类别

posted @ 2024-03-30 00:25  jack-chen666  阅读(26)  评论(0编辑  收藏  举报