Tensorflow入门与实战学习笔记(十三)-FNN图像语义分割

目录

1 图像语义分割

1.1 应用场景:

1.1.1 街景的语义分割

1.2 圖像语义分割的实质

1.3 网络结构

1.4 两种实现方式

1.4.1 采用了上采样

特点:

1.4.2 输入和输出

1.4.3 全卷积

1.5 上采样Upsampling

1.5.1 反向操作

1.5.2 差值法

1.5.3 反池化

​1.5.4 反卷积(转置卷积)

2 图像语义分割网络FCN的跳接结构

2.1 FCN效果

2.2 FCN的缺点

3 图像语义分割网络FCN代码实现-预训练网络

3.1 预训练网络

3.2 创建子模型样例

3.3 获取中间层

3.3.1 上取样

3.4 模型预测

3.5 预测结果

3.6 绘图损失函数

3.7 训练中的图像


1 图像语义分割

上图为语义分割的一个实例,其目标是预测出图像中每一个像素的类标签

 图像语义分割是图像处理和是计算机视觉技术中关于图像理解的重要一环

语义分割对图像中每一个像素点,我们只对类别进行分割,不对实体进行分割

1.1 应用场景:

1、自动驾驶起床

2、医学图像诊断

3、无人机着陆点判断

1.1.1 街景的语义分割

1.2 圖像语义分割的实质

语义分割的目标:

一般是将一-张RGB图像(height*width*3) 或是灰度图(height*width*1)作为输入,输出的是分割图,其中每一个像素包含了其类别的标签(height* width*1)

具体来说对于这么一张图,我们有五个分类

目前在图像分割领域比较成功的算法,有很大一部分都来自于同一 个先驱: Long等人提出的Fully Convolutional Network (FCN),或者叫全卷积网络。
FCN将分类网络转换成用于分割任务的网络结构,并证明了在分割问题上,可以实现端到端的网络训练。FCN成为了深度学习解决分割问题的奠基石。

1.3 网络结构

分类网络结构尽管表面上来看可以接受任意尺寸的图片作为输入(猫和狗),但是由于网络结构最后全连接层的存在,使其丢失了输入的空间信息,因此,这些网络并没有办法直接用于解决诸如分割等稠密估计的问题。

从而使得网络结构可以适应像素级的稠密估计任务。从而使得网络结构可以适应像素级的稠密估计任务。

1.4 两种实现方式

  • 使用预训练网络,自己来写卷积层
  • UNET

Unet是2015年诞生的模型,它几乎是当前segmentation项目中应用最广的模型。
Unet能从更少的训练图像中进行学习。当它在少于40张图的生物医学数据集_上训练时,IOU值仍能达到92%。
 

1.4.1 采用了上采样

特点:

  • 本质上 分类网络+上采样=原有图像大小
  • 在上采样的过程中结合前面信息再进行上采样,
  • 是全卷积网络可以输入任意大小的网络

1.4.2 输入和输出

网络的输入可以为任意尺寸的彩色图像;输出与输入尺寸相同,通道数为: n (目标类别数) +1 (背景)

1.4.3 全卷积

网络在CNN卷积部分不用全连接而是替换成卷积的目的是允许输入的图片为超过某一尺寸的任意大小。

1.5 上采样Upsampling

由于在卷积过程中,我们的特征图像变得很小(比如长宽变为原图像的1/32),为了得到原图像大小的稠密像素预测,我们需要进行上采样。

1.5.1 反向操作

与下采样进行对比,有容易想到三种方式,分别对应最大池化、平均池化和卷积操作的反过来使用。

就得到了我么的上采样

  • 1.插值法
  • 2.反池化
  • 3.反卷积(转置卷积)
     

1.5.2 差值法

将两个权重相加除以二

1.5.3 反池化

最大池化

平均池化


1.5.4 反卷积(转置卷积)

在这里我们使用反卷积,非常非常重要

我们有内置的函数,strides默认是不放大的 =2为两倍

类自编码器结构

如果采用下图所示的类自编码器结构,或者直接对最后一-层的特征图进行上采样的到原图大小的分割,我们会损失很多细节。

2 图像语义分割网络FCN的跳接结构

2.1 FCN效果

将底层(stride 32)的预测(FCN-32s) 进行2倍的上采样得到的图像,并与从poo|4层(stride 16)进行的预测融合起来(相加)这一部分的网络被称为FCN-16s。随后将这部分的预测再进行一次2倍的 上采样并与从pool3层得到的预测融合起来,这一部分的网络被称为FCN-8s。

当我们的上取样次数一定高度的时候,提取的特征越好

增加Skips结构将最后一层的预测(有更富的全局信息)和更浅层(有更多的局部细节)的预测结合起来,
这样可以在遵守全局预测的同时进行局部预测。

2.2 FCN的缺点

  • 得到的结果还不够精细,对细节不够敏感;

  • 没有考虑像素与像素之间的关系,缺乏空间一致性等。

3 图像语义分割网络FCN代码实现-预训练网络

3.1 预训练网络

采用VGG18,我们把最后的输出做一个上采样

3.2 创建子模型样例

3.3 获取中间层

3.3.1 上取样

3.4 模型预测

3.5 预测结果

3.6 绘图损失函数

num = 3
for image,mask in test_dataset.take(1):
    pred_mask = model.predict (image)
    # 取出预测的是哪一个类,像素点1,2,3 具体的分类
    pred_mask = tf.argmax (pred_mask, axis=-1)
    # 扩展维度,取前面所有的维度
    pred_mask = pred_mask[..., tf.newaxis]
    plt.figure (figsize=(10,10))
    for i in range (num):
        plt.subplot (num,3, i*num+1)
        # 原始图像
        plt.imshow (tf. keras. preprocessing. image. array_ to_ img (image[i]))
        # 真实分割图
        plt.subplot (num, 3,i*num+2)
        plt.imshow (tf. keras. preprocessing. image. array_ _to_ img (mask[i]))
        # 预测图
        plt.subplot (num, 3, i*num+3)
        plt.imshow (tf. keras. preprocessing. image. array_ to_ img(pred_ mask[i]))

3.7 训练中的图像

猜你喜欢

转载自blog.csdn.net/qq_37457202/article/details/108020509