40.图像语义分割-LinkNet

LinkNet的论文地址 https://arxiv.org/pdf/1707.03718.pdf

LinkNet相对于UNET的精度低一点,但是响应速度得到了提升

LinkNet的网络结构是这样的

40.图像语义分割-LinkNet_第1张图片

  • full-conv是反卷积

其中的Encoder Block是这样的

40.图像语义分割-LinkNet_第2张图片

其中(m,n)与(n,n)代表的是输入图像的形状,m(括号中的第一个值)表示的是图像的维度,如果我们是初始输入进来的图,那m就代表图像的通道,如果是第二个EncodeBlock那么就代表上一个EncodeBlock的卷积核个数,n(括号中的第二个值)表示的是卷积核个数,也就是说这个括号的两个值表示输入与输出

后面的除2是代表对原图像大小缩小二倍,所以我们在进行残差操作的时候同样需要对图像缩小二倍,所以我们对x进行卷积操作以达到缩小二倍图像的目的

Decoder Block是这样的,这里*2表示将图像放大两倍,这里的m,n的意义核EncodeBlock中的m,n的意义一致

40.图像语义分割-LinkNet_第3张图片

我们下面使用的数据集为街景数据集,街景数据集在这里有提到 38.图像语义分割-UNET_potato123232的博客-CSDN博客

我们在创建模型之前的代码与上面那片文章的代码是完全相同的,我们简单过一下

目录

1  导入库

2  读取路径

3  组合路径

4  定义读取图像函数

5  定义相关参数并加载图像之后调整数据集

6  创建模型

6.1  创建卷积模块

6.2  创建反卷积模块

6.3  创建EncodeBlock模块

6.4  编写DecondeBlock模块

6.5  创建LinkNet模型

7  定义训练参数

8  定义训练与测试步骤

9  定义检查点与可视化信息

10  训练并保存

11  预测模型



1  导入库

2  读取路径

40.图像语义分割-LinkNet_第4张图片

3  组合路径

4  定义读取图像函数

40.图像语义分割-LinkNet_第5张图片

40.图像语义分割-LinkNet_第6张图片

5  定义相关参数并加载图像之后调整数据集

40.图像语义分割-LinkNet_第7张图片

下面就是与之前代码不同的部分


6  创建模型


6.1  创建卷积模块

为了让代码看起来更简洁,所以我们定义一个卷积模块,卷积模块有三个层组成,第一层是卷积,第二层是批标准化,第三层是激活函数relu

kernel_size我们默认为3,strides默认为1,这些后面调用的时候可以更改

40.图像语义分割-LinkNet_第8张图片

6.2  创建反卷积模块

反卷积模块由三个层组成,第一个层是反卷积,第二层是批标准化,第三层是激活函数relu,这里我们最终是用反卷积作为输入层,最终一层我们可以选择不激活,所以我们要给一个参数判定是否激活

40.图像语义分割-LinkNet_第9张图片

我们在这里令strides为2,这样可以达到放大图像的目的


6.3  创建EncodeBlock模块

我们依照下面这个图创建EncodeBlock模块,我们可以看到units都是n,在第一步图像要减小2倍,所以strides为2,其余没有变都为1,卷积核大小都为3*3,我们使用默认的就可以了

40.图像语义分割-LinkNet_第10张图片

40.图像语义分割-LinkNet_第11张图片

6.4  编写DecondeBlock模块

40.图像语义分割-LinkNet_第12张图片

卷积,反卷积,之后再卷积,卷积核个数在图中的要求是不同的,我们只看括号后面的值,分别的m/4和n

40.图像语义分割-LinkNet_第13张图片

6.5  创建LinkNet模型

40.图像语义分割-LinkNet_第14张图片

这里maxpooling层的kernel_size就是3,然后默认是将图像大小变为原来的1/2

我们定义DecodeBlock神经元个数的时候,我们以decode4距离,输入是512,那么我们的unit1就是512//4,我们的输出必须要满足残差的要求(与Encoder Block输出的shape一致),所以我们这里要写256

我们定义decode1的时候可以看到下方的输入是64.所以我们要在decode1定定义输出为64

最后的 self.output_full_conv2 = DeConvBlock(34) 这里是数据集决定的,我们一共有34类

40.图像语义分割-LinkNet_第15张图片

之后我们定义前向传播的过程

40.图像语义分割-LinkNet_第16张图片

之后我们将其复制给model的变量

至此我们的模型已经创建完毕了


7  定义训练参数

剩下的过程就与我们之前训练的UNET过程相同了,我们简单看一下

40.图像语义分割-LinkNet_第17张图片

8  定义训练与测试步骤

40.图像语义分割-LinkNet_第18张图片

9  定义检查点与可视化信息

40.图像语义分割-LinkNet_第19张图片

在训练之前要创建一个checkpoint_file的文件夹


10  训练并保存

40.图像语义分割-LinkNet_第20张图片

同样由于是自定义模型,所以不能保存为h5文件

训练的速度很快,我使用的970M训练了将近2个小时就训练完成了,在保存模型中会有这些warning,这些warning不影响我们的保存

40.图像语义分割-LinkNet_第21张图片

11  预测模型

我们依然使用 38.图像语义分割-UNET 的图像与代码

40.图像语义分割-LinkNet_第22张图片

40.图像语义分割-LinkNet_第23张图片

40.图像语义分割-LinkNet_第24张图片

从观感上来讲我觉得LinkNet并没有UNET的效果号,我们现在打开tensorboard看一下是不是这样,下面是UNET的三个检测值

  • test_acc = 0.82
  • test_iou = 0.26
  • test_loss = 0.68

下面是linknet的数据

  • test_acc

最大值差不多0.78

40.图像语义分割-LinkNet_第25张图片

  • test_iou

最大值差不多0.17

40.图像语义分割-LinkNet_第26张图片

  • test_loss

最小值差不多0.8

40.图像语义分割-LinkNet_第27张图片

以上我们仅用30个epoch与UNET进行对比,无论是UNET或是LinkNet都还有下降的趋势,也就是说增加epoch可以使模型变得更好

你可能感兴趣的:(tensorflow笔记,深度学习,计算机视觉,cnn)