语义分割网络FCN的思想概括与调试运行

5 篇文章 3 订阅
5 篇文章 0 订阅

1.FCN简介

FCN是语义分割的经典论文,其核心思想就是把基本的分类网络作为backbone进行改造,将全连接层改造为卷积层以适应对密集像素点进行分类。因此,传统的分类网络输出的是概率向量,在概率向量中取最大值作为最终结果。而FCN网络则输出的是低分辨率的一个feature map(论文中称之为heatmap,即热图),如下如图所示:
概率与特征图这个heatmap对应着图片中的高级信息,虽然人无法再理解这张图的内容,但神经网络却可以理解这个图,并基于这个heatmap来完成逐像素点的分类任务。
如果仅将原始分类网络的全连接层改造为卷积层而不作其他处理,那么最后生成的热图相对于原图的感受野将会是非常大的,所谓感受野可以理解为特征图上的每个像素点映射到原图上对应的区域大小。大的感受也意味着热图将对原图中大的物体有较好的分辨能力,但是对小物体就很容易忽略掉,这对小物体的分割非常不利,基于此,作者在FCN中引入了跳跃连接的思想,上述内容表明,神经网络中浅层特征图对原图中的小物体的感知良好,深层特征图对原图中大物体感知良好,作者就讲这些特征图进行融合,将浅层的特征图直接提取出来,再与最后一层的heatmap进行融合(直接求和或者拼接)最后将得到的分类图进行插值上采样到原图的尺寸,进而得到最终的结果,其网络结构如下(论文中以AlexNet作为主干网络,但实际在代码中使用VGG等更深的网络作为主干得到的效果会更好):

网络结构

2.代码运行

试着跑了一下github上的一个基于FCN进行道路分割的框架KittiSeg,源码在此:https://github.com/MarvinTeichmann/KittiSeg.
首先要安装tensorflow,matplotlib,numpy,Pillow,scipy,commentjson等依赖库。并需要在控制台中将项目git到本地,然后cd到项目路径下,执行:

git submodule update --init --recursive

执行完毕后按照说明文档,尝试进行样例测试:

python demo.py --input_image data/demo/demo.png

发现报了很多错误,以下对各种报错以及纠正方法进行简述:

1.module 'tensorflow ’ has no attribute xxx

出现这种报错的原因是安装了tensorflow2 .x的缘故,tensorflow2许多接口发生了改变,会出新不兼容tensorflow1.x的情况,解决方法是在出错的地方将tf.xxx改为 tf.compat.v1.xxx,调用tensorflow1的兼容模块,例如对于报错module 'tensorflow ’ has no attribute app,将出错的地方改为:tf.compat.v1.app即可。

2.object arrays cannot be loaded when allow_pickle=False

这个是因为在加载预训练权重时没有打开numpy模块允许读取pkl的开关,解决方法是将报错行加上allow_pickle=True选项,如下图:
允许读取数据

2.scipy.misc相关函数的过期问题

由于scipy1.2版本删除了imresize,toimage,imsave等函数接口,因此在比较老的代码中调用这些函数时会报错,很多博客直接让降级scipy模块,可tensorflow2.x所以来的scipy必须是1.4以上的,因此降级的方法不现实,经过摸索,我发现在numpy、PIL.Image以及opencv中都有取代这些函数的接口:

scipy.misc.imresize()过期

此函数在scipy1.2版本中被移除,但是可以用numpy中的resize来代替,如果需要选取特定的插值方式,需要先pip安装Pillow模块,再导入PIL.Image即可使用各种插值,例子如下:
imresize

scipy.misc.toimage()过期

此函数在scipy1.2版本中被移除,但是可以用Pillow中的fromarray来执行,例子如下图:
toimage
同上,需要安装Pillow模块,直接pip安装即可。然后在项目头部加入from PIL import Image 即可正常使用

scipy.misc.imread()过期

此函数在scipy1.2版本中被移除,但是可以使用imageio模块中的imread函数代替,需要pip安装imageio模块:
iamgio

scipy.misc.imsave()过期

此函数在scipy1.2版本中被移除,但是可以使用imageio模块中的imwrite来代替,需要pip安装imageio模块:
imwrite除此之外,scipy.misc中的很多函数也过期了,在调试时进行了繁琐的调整,但是所有的函数都有替代方案,因此项目还是可以运行的。

3.调试结果

在进行一系列修改后再进行测试:

python demo.py --input_image data/demo/demo.png

项目可以正常运行并取得了分割结果,分别是原图、二值分割图以及分割效果图:

原图
二值分割
效果

4.总结

至此,基于FCN的道路分割网络调试成功,该项目实际上提供了完整的FCN网络,可以按照项目主页中的提示进行自定义数据集的训练。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值