Fully Convolutional Networks(FCN) 复现全过程之(一)

本博客仅对“Fully Convolutional Networks for Semantic Segmentation”复现的过程进行详细地描述。
参考博客(部分有错将在下面纠正):

一、caffe环境搭建

  • 系统 Ubuntu16.4

  • Docker镜像:registry.docker-cn.com/ufoym/deepo:all-py36-jupyter
    (自带cudnn及opencv 不用自己装)

二、更新源

sudo apt-get update

三、安装cuda、cudnn、opencv
这三步不用装,镜像自带(刚开始以为要装,结果按照博客来就出错了)。后面一系列操作都不用。

四、使用caffe训练fcn

  • 下载fcn代码 :https://github.com/shelhamer/fcn.berkeleyvision.org

  • 下载训练集,在data文件夹下新建sbdd文件夹,将下载的dataset解压到该文件夹下:http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/semantic_contours/benchmark.tgz

  • 下载测试集,放在data/pascal文件下解压(注意要是voc2011):http://host.robots.ox.ac.uk/pascal/VOC/voc2012/

  • 下载预训练模型,下载VGG-16的预训练模型放至/fcn.berkeleyvision.org/ilsvrc- nets/目录下(原博客给的链接文件有错,导致后面solve.py报如下错误: Cannot copy param 0 weights from layer ‘fc6’; shape mismatch. Source param shape is 4096 512 7 7 (102760448); target param shape is 4096 25088 (102760448). To learn this layer’s parameters from scratch rather than copying from a saved net, rename the layer.不需要rename layer,只需把文件删了下这个就好)
    https://pan.baidu.com/s/1qYJeFfQ

五、训练32s

  • 修改 solve.py

import后面加:

vgg_weights = '../ilsvrc-nets/vgg16-fcn.caffemodel'  
vgg_proto = '../ilsvrc-nets/VGG_ILSVRC_16_layers_deploy.prototxt'  
#weights = '../ilsvrc-nets/vgg16-fcn.caffemodel' 

修改为如下:

#solver = caffe.SGDSolver(‘solver.prototxt’) 
#solver.net.copy_from(weights) 
solver = caffe.SGDSolver(‘solver.prototxt’) 
vgg_net = caffe.Net(vgg_proto, vgg_weights, caffe.TRAIN)
surgery.transplant(solver.net, vgg_net) 
del vgg_net

caffe.set_device(0)
caffe.set_mode_gpu()

关于VGG_ILSVRC_16_layers_deploy.prototxt,以为原代码里有提供,后发现没有。下载放至/ilsvrc-nets/目录下,提供下载地址:http://pan.baidu.com/s/1geLL6Sz

  • 将fcn文件夹中的surgery.py文件、voc_layers.py文件拷到voc-fcn32s文件夹中
  • 开始训练
sudo python solve.py

六、训练16s和8s
用训练好的32s模型训练16s,用训练好的16s模型训练8s。
训练16s和8s时,不需要将全连接层变成卷积层。不需要在solve.py中添加transplant函数,只需要修改weight路径为32s训练好的模型路径即可。

  • 训练16s
    修改solve.py:weight路径为训练好的32s模型路径
    将surgery.py及score.py复制到16s的目录下(这两个文件中print格式缺失括号“()”,记得进行修改)
    修改val.prototxt和train.prototxt里头的报错路径
  • 训练8s(同上)

七、最终结果
loss比许多博客最终训练的loss值低,accuracy/mean accuracy/miou也比论文的值来得高。且用我们训练好的模型跟论文代码提供的训练好的模型结果对比,我们的结果似乎更好一丢丢。
Fully Convolutional Networks(FCN) 复现全过程之(一)_第1张图片
论文模型出的分割结果:
Fully Convolutional Networks(FCN) 复现全过程之(一)_第2张图片
我们模型的分割结果:
Fully Convolutional Networks(FCN) 复现全过程之(一)_第3张图片
参考:

  • http://www.voidcn.com/article/p-srhniqpd-qh.html
  • https://www.twblogs.net/a/5b8899bc2b71775d1cdd557f/zh-cn/
  • http://melonteam.com/posts/quan_juan_ji_shen_jing_wang_luo_fcn_xue_xi_bi_ji/

你可能感兴趣的:(深度学习,语义分割)