40.图像语义分割-LinkNet

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

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

LinkNet的网络结构是这样的

  • full-conv是反卷积

其中的Encoder Block是这样的

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

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

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

我们下面使用的数据集为街景数据集,街景数据集在这里有提到 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  读取路径

3  组合路径

4  定义读取图像函数

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

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


6  创建模型


6.1  创建卷积模块

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

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

6.2  创建反卷积模块

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

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


6.3  创建EncodeBlock模块

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

6.4  编写DecondeBlock模块

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

6.5  创建LinkNet模型

这里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类

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

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

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


7  定义训练参数

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

8  定义训练与测试步骤

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

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


10  训练并保存

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

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

11  预测模型

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

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

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

下面是linknet的数据

  • test_acc

最大值差不多0.78

  • test_iou

最大值差不多0.17

  • test_loss

最小值差不多0.8

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

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suyuoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值