论文全名:Fully Convolutional Networks for Semantic Segmentation

全卷积神经网络 FCN代码运行详解:

运行平台:

Ubuntu 14.04 + cudnn7

1.代码准备:

下载新版caffe:   https://github.com/BVLC/caffe

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

将下载后的压缩包解压 将解压后的代码丢进服务器

2.编辑caffe和python接口:

cd进入caffe所在路径

以个人路径示例:/home/my/caffe-master/caffe-master

在该目录下,执行

cp Makefile.config.example Makefile.config

vim Makefile.config(这句代码根据自己情况选择,如果需要修改相关设定,就使用这句,需要注意的是,将WITH_PYTHON_LAYER :=1前面的#去掉

如果使用cudnn,就把use cudann前面的#去掉

我这边安装的是openbla,所以我的设置为BLAS:=open)

make all -j8 //8代表线程数量,可以加快编译速度

make test -j8 //编译测试需要的文件

make runtest //开始运行测试例子,这一句貌似有没有都行以上结束后开始编译python接口

在下载的caffe源码包中,有个叫python的文件夹,cd进入这个文件夹

以我个人路径为例cd至 /home/wangkun/caffe-master/caffe-master/python

编译python:

make pycaffe

#测试是否成功

cd caffe-folder/python

python

import caffe

#如果上述命令未报错,说明成功

#添加caffe/python 到python path变量

vim ~/.bashrc

#set the caffe PYTHONPATH

export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH

!如果是采用的Anaconda python,切记编译python接口在最后执行。

!如果是系统自带的python在make pycaffe可能出现python/caffe/_caffe.hpp:8:31: fatal error: numpy/arrayobject.h: No such file or directory

这是因为64位的python 库的存放路径问题。

查找arrayobject.h所在的目录:

sudo find / -name arrayobject.h

然后修改Makefile.config:

PYTHON_INCLUDE := /usr/include/python2.7 \

/usr/lib64/python2.7/site-packages/numpy //这里修改成找到的路径 以上,编译结束,关于编译python,由于我这边服务器上使用的是Anaconda python,大家可以根据自己的实际情况进行python接口的编译

3.数据文件下载

下载siftflow数据集:http://www.cs.unc.edu/~jtighe/Papers/ECCV10/siftflow/SiftFlowDataset.zip

并解压至

/fcn.berkeleyvision.org/data/

下,并将文件夹名重命名为

sift-flow

4.预训练模型下载:

下载VGG16的预训练模型并放在FCN源码文件夹中的ilsvrc-nets文件夹下

https://pan.baidu.com/s/1qYJeFfQ

以个人路径为例:/home/my/fcn.berkeleyvision.org-master/fcn.berkeleyvision.org-master/ilsvrc-nets

5.为了避免运行程序时候出现no module named caffe

在代码中包含import caffe的py文件的第一行加入

import sys

sys.path.append('/home/my/caffe-master/caffe-master/python')

其中,

/home/my/caffe-master/caffe-master/python为你下载的caffe源码中python文件夹的路径

6.cd进入fcn源码路径

以个人路径为例:/home/my/fcn.berkeleyvision.org-master/fcn.berkeleyvision.org-master

将其中所有的py文件,例如surgery.py等等,全部复制到siftflow-fcn32s文件夹中

7.solver.prototxt文件修改

进入siftflow-fcn32s文件夹 打开solver.prototxt

其中snapshot:10000 表示训练10000次保存一次模型

snapshot_prefix:"/home/my/fcn.berkeleyvision.org-master/fcn.berkeleyvision.org-master/siftflow-fcn32s/train"

表示训练得到的模型,也就是model存放的路径

8.solve.py文件修改

在这里郑重声明一下:如果训练fcn32s的网络模型,

一定要修改solve.py

利用transplant的方式获取vgg16的网络权重;

具体操作为

import sys

sys.path.append('/home/my/caffe-master/caffe-master/python')

import caffe

import surgery, score

import numpy as np

import os

import sys

try:

import setproctitle

setproctitle.setproctitle(os.path.basename(os.getcwd()))

except:

pass

vgg_weights='../ilsvrc-nets/vgg16-fcn.caffemodel'

vgg_proto='../ilsvrc-nets/VGG_ILSVRC_16_layers_deploy.prototxt'

weights='../ilsvrc-nets/vgg16-fcn.caffemodel'

# init

caffe.set_mode_gpu()

# caffe.set_device(int(sys.argv[0]))

caffe.set_device(7)

#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

# surgeries

interp_layers= [k for k in solver.net.params.keys() if 'up' in k]

surgery.interp(solver.net, interp_layers)

# scoring

test=np.loadtxt('../data/sift-flow/test.txt',dtype=str)

for _ in range(50):

solver.step(2000)

# N.B. metrics on the semantic labels are off b.c. of missing classes;

# score manually from the histogram instead for proper evaluation

score.seg_tests(solver, False, test, layer='score_sem',gt='sem')

score.seg_tests(solver, False, test, layer='score_geo',gt='geo')

可以看到我注释了

#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

并且在import后添加了

vgg_weights='../ilsvrc-nets/vgg16-fcn.caffemodel'

vgg_proto='../ilsvrc-nets/VGG_ILSVRC_16_layers_deploy.prototxt'

weights='../ilsvrc-nets/vgg16-fcn.caffemodel'

关于

VGG_ILSVRC_16_layers_deploy.prototxt

我附上我的百度网盘的链接 如果大家找不到 可以在这里下载

http://pan.baidu.com/s/1geLL6Sz

如果训练fcn16s,则可以直接copy自己的fcn32s的model的权重,不需要transplant,也就是不需要修改solve.py

如果训练fcn8s,则可以直接copy自己的fcn16s的model的权重,不需要transplant,也就是不需要修改solve.py 只有如此,才能避免loss高居不下的情况

9.进入siftflow-fcn32s文件夹

执行 python solve.py

10.测试单张图片

在fcn源码文件夹,找到infer.py

以个人路径示例:/home/my/fcn.berkeleyvision.org-master/fcn.berkeleyvision.org-master

打开infer.py 在第一行加上

import sys sys.path.append('/home/my/caffe-master/caffe-master/python')

其中,net = caffe.Net('deploy.prototxt', 'siftflow-fcn32s/train_iter_100000.caffemodel', caffe.TEST)

中,

train_iter_100000.caffemodel为训练得到的模型

其中,im = Image.open('test.jpg')为 测试的图片名,

plt.savefig('test_out.png')为将测试结果保存为test_output.png

如果没有deploy文件,可以参考如下方法:

deploy文件如果没有 可以参照一下方法

首先,根据你利用的模型,例如模型是siftflow32s的,那么你就去siftflow32s的文件夹,

里面有train.prototxt文件,将文件打开,全选,复制,新建一个名为deploy.prototxt文件,粘贴进去,

然后ctrl+F 寻找所有名为loss的layer 只要有loss 无论是loss还是geo_loss 将这个layer统统删除

然后在文件顶部加上

layer {

name: "input"

type: "Input"

top: "data"

input_param {

# These dimensions are purely for sake of example;

# see infer.py for how to reshape the net to the given input size.

shape { dim: 1 dim: 3 dim: 256 dim: 256 }

}

}

其中shape{dim:1 dim:3 dim:256 dim:256}这两个256,是由于我的测试图片是256X256 如果你的是500X500 那你就将最后两个dim改为500 500

需要注意的是 如果你执行的是siftflow32s,你没有deploy,你需要加入inputdata layer,你如果执行sififlow16s的model 那么是不需要加inputdata layer的

因为他们的train.prototxt文件里已经有了inputdata layer

此外,关于siftflow-fcn32s需要的deploy文件,我在这里附上一个下载地址,如果不愿意自己制作可以下载这个:

http://pan.baidu.com/s/1eSiRm7K

以上,FCN的训练和测试全部结束,这次有个朋友催我做这个,做得比较仓促,如果有问题,欢迎指摘

fcn网络训练代码_FCN网络训练 菜鸟版相关推荐

  1. 【Whole Word Mask】中文 bert wwm 预训练代码,预训练你自己的模型

    基于 transformers 来进行 bert 的 wwm (全词掩码)预训练,让你的模型可以领域适配 提示:文章偏向于NLP进阶,大佬请绕路-- 文章目录 基于 transformers 来进行 ...

  2. 网络编程—代码—TCP网络传输

    一.TCP:用字符流传输信息 ------------------------------------------------------------------------------ [用字符流的 ...

  3. U2Net、U2NetP分割模型训练---自定义dataset、训练代码训练自己的数据集

    前言 博客很久没有更新了,今天就来更新一篇博客吧,哈哈: 最近在做图像分割相关的任务,因此,写这么一篇博客来简单实现一下分割是怎么做的,内容简单,枯燥,需要耐心看,哈哈: 博客的内容相对简单,比较适合 ...

  4. fcn网络训练代码_用FCN做分割

    船长黑板报所有文章和代码的最新版本均在 Captain1986/CaptainBlackboard​github.com 维护,知乎不做维护 您的Star是对我的鼓励 图像分割是计算机视觉中比较常见的 ...

  5. 经典网络vgg应用于 图像二分类的训练代码

    1 目的:使用VGG16网络 进行对图片二分类  (不同插值方法的图片 纹理不同) vgg16 网络结构的连接 https://blog.csdn.net/weixin_44576543/articl ...

  6. 一块GPU就能训练语义分割网络,百度PaddlePaddle是如何优化的?

    [引言]显存不足是训练语义分割网络常常遇见的问题,而显存是GPU计算中的稀缺资源.百度深度学习框架PaddlePaddle中的显存优化,不仅可以让研究人员在相同成本的计算设备上训练更大的模型,还可以在 ...

  7. py之textgenrnn:Python利用textgenrnn库实现训练文本生成网络

    py之textgenrnn:Python利用textgenrnn库实现训练文本生成网络 目录 输出结果 实现代码 输出结果 实现代码 #textgenrnn:利用textgenrnn实现训练文本生成网 ...

  8. FSRNet:端到端深度可训练人脸超分辨网络

    作者丨左育莘 学校丨西安电子科技大学 研究方向丨计算机视觉 这篇文章 FSRNet: End-to-End Learning Face Super-Resolution with Facial Pri ...

  9. 图卷积 节点分类_在节点分类任务上训练图卷积网络

    图卷积 节点分类 This article goes through the implementation of Graph Convolution Networks (GCN) using Spek ...

最新文章

  1. 关于学习Python的一点学习总结(4->成员资格->list->列表操作)
  2. java编程50实例_java编程实例大全及详解谜底(50例).doc
  3. 经典C语言程序100例之九
  4. RabbitMQ消费消息方法basicConsume
  5. jQuery技术内幕:深入解析jQuery架构设计与实现原理1
  6. MATLAB语言初步学习(一)
  7. 【ElasticSearch】(七)浅析search_after 及 fromsize,scroll,search_after性能分析
  8. dotnet core项目升级到 .net core 2.0
  9. dll缺失怎么修复?有什么好的修复方法推荐?
  10. matlab中 dataset用法,dataset中shuffle()、repeat()、batch()用法
  11. android获取其他app布局,关于android:如何从App的(布局)XML变量中获取Manifest版本号?...
  12. AntV G6 自定义节点图形
  13. XZ压缩最新压缩率之王
  14. 暑假D16 T3 密道(数位DP? 打表找规律)
  15. Oracle针对EMP表的练习题(很有用,值得收藏)
  16. 人工智能时代:软件中的人工智能将如何改变程序员的角色
  17. dowhile实现求水仙花数
  18. Vi编辑器的使用方法及用vi编辑器编写一个C程序
  19. 关于腾讯云服务器使用FTP详细配置教程
  20. android标题栏添加按钮_如何从iPhone或Android设备访问PC

热门文章

  1. 杜甫的《望岳》在哪里作的?山脚下还是山头上?
  2. leetcode —— 数组(1. Two Sum)
  3. 动态规划 —— 最长递增子序列(LIS)
  4. linux关闭自动更新,Ubuntu开启系统自动升级与取消自动更新的方法,
  5. php url路由入门实例,ThinkPHP URL 路由实例
  6. android md5使用方法,android 使用DigestUtilsmd5加密的方法
  7. Android 开发常用ADB命令集合
  8. python爬虫什么意思-python爬虫什么意思
  9. python编程是啥-python中type()是什么意思
  10. python自动化办公模块有哪些-python如何实现自动化办公?