caffe FCN Ubuntu16.0

原创 2017年07月10日 15:06:56

/home/~/fcn.berkeleyvision.org/ilsvrc-nets/siftflow-fcn32s-heavy.caffemodel

FCN安装步骤:

1. 代码准备

fcn源码:$ git clone https://github.com/shelhamer/fcn.berkeleyvision.org.git
caffe源码:$ git clone https://github.com/BVLC/caffe.git

2 . 下载安装BVLC的caffe,并编译caffe
FCN还好,不像SegNet用的很旧版本的caffe,但是也会存在cudnn版本不兼容的问题。

在MakeFile.config文件的修改,打开WITH_PYTHON_LAYER,使用CUDNN

*USE_CUDNN := 1
WITH_PYTHON_LAYER := 1*

设置python的环境变量:
sudo vi /etc/profile # 编辑profile文件
export PYTHONPATH=/~/caffe/python:$PYTHONPATH

在caffe根目录下编译 pycaffe
make pycaffe

3.数据准备(以SIFT-Flow 数据集为例)

下载数据集:http://www.cs.unc.edu/~jtighe/Papers/ECCV10/siftflow/SiftFlowDataset.zip
并解压至/fcn.berkeleyvision.org/data/下,并将文件夹名重命名为sift-flow。
之后,将数据全部resize到小一点的尺寸。

刚开始没有rezise直接用的256×256的,但是训练的时候出现error == cudaSuccess (2 vs. 0) out of memory 解决方法见:https://stackoverflow.com/questions/33790366/caffe-check-failed-error-cudasuccess-2-vs-0-out-of-memory
显卡内存(3G)太小哦,或者减少batchsize大小。心塞的说。。。

1)根本没法迭代,那么你就要把batchsize设置小一点了。
默认是 iter_size: 1 (solver.prototxt),另外在siftflow_layers.py中 top[0].reshape(1, self.data.shape) 这里默认也是1,batchsize = iter_size 1。如果已经是最小了,即这两个地方都是1了,如果你还是out of memory,那么要么更换好的硬件(GPU),要么resize 数据集到更小的尺寸。

2)如果先提示“Begin seg tests”,然后out of memory,那么是在执行score.py时内存溢出了,这时还是上面的两种解决方案。

two solution:one, you can try to decrease your batch size, but your batch size=1, and useless, then you can rezise your picture, decrease your image size can be useful;two, you can buy a better GPU.
  • 1

附带:python image resize:

from PIL import Image
import os.path
import glob
def convertjpg(jpgfile,outdir,width=500,height=500):img=Image.open(jpgfile)   new_img=img.resize((width,height),Image.BILINEAR)   new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))
for jpgfile in glob.glob("/home/lly/fcn.berkeleyvision.org/data/sift-flow/Images/spatial_envelope_256x256_static_8outdoorcategories/*.jpg"):convertjpg(jpgfile,"/home/lly/fcn.berkeleyvision.org/data/sift-flow/Images/1")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4 . 下载预训练模型
每个文件类型文件夹下也有模型链接
全部model链接:http://dl.caffe.berkeleyvision.org/,
给出两个模型链接:
https://pan.baidu.com/s/1gfeF4wN
https://pan.baidu.com/s/1qYJeFfQ

放至/fcn.berkeleyvision.org/ilsvrc-nets/目录下,并重命名为vgg16-fcn.caffemodel。

5.源码修改
a. prototxt文件
siftflow-fcn32s文件夹下,test.prototxt和trainval.prototxt文件不需要修改

有些博客是说要修改fc6和fc7这两个全连接层的名字。
原因是我们下载的预训练模型VGG-16原模型中包含有fc6和fc7这两个全连接层,而在prototxt中,使我们新添加的卷积层,在模型加载时,如果名称一样,而结构数据不同,便会报错。如果改名之后,原来的fc6/7则会被忽略,而使用我们新的层。
但是在后面copy的时候不copy这两层的参数似乎也是可以的。

b. 部分代码修改
caffe path的加入,由于FCN代码和caffe代码是独立的文件夹,因此,须将caffe的Python接口加入到path中去。
这里有两种方案:
一种是在所有代码中出现import caffe 之前,(solve.py,net.py)加入:

import sys
sys.path.append(‘caffe根目录/python’)

另一种是在终端或者bashrc中将接口加入到PYTHONPATH中:
sudo gedit /etc/profile
加入:
export PYTHONPATH=/home/lly/caffe/python:$PYTHONPATH

export PYTHONPATH=/home/lly/fcn.berkeleyvision.org:$PYTHONPATH

c. 修改solve.py

利用transplant的方式获取vgg16的网络权重,具体操作为:

import sys
sys.path.append('/home/calmcar/Downloads/caffe/python')
import caffe
import surgery, scoreimport numpy as np
import ostry:import setproctitlesetproctitle.setproctitle(os.path.basename(os.getcwd()))
except:passvgg_weights = '../ilsvrc-nets/vgg16-fcn.caffemodel'
vgg_proto = '../ilsvrc-nets/VGG_ILSVRC_16_layers_deploy.prototxt'
weights = '../ilsvrc-nets/vgg16-fcn.caffemodel' # init
# print(sys.argv[1])
#caffe.set_device(int (sys.argv[1]))
caffe.set_device(0)
caffe.set_mode_gpu()#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 evaluationscore.seg_tests(solver, False, test, layer='score_sem', gt='sem')score.seg_tests(solver, False, test, layer='score_geo', gt='geo')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

d. 将fcn源码路径
以个人路径为例:/home/lly/fcn.berkeleyvision.org
将其中所有的py文件,例如surgery.py等等,全部复制到siftflow-fcn32s文件夹中

6.训练

 $ cd  ~siftflow-fcn32s/$ python solve.py 0
注意这里直接运行python solve.py 会出现数组越界out of range问题
解决方法就是运行 python solve.py 0或修改solve.py#caffe.set_device(int (sys.argv[1]))caffe.set_device(0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

修改后直接运行python solve.py 即可。
B
在训练过程中,loss高居不下,模型不收敛
如果训练fcn32s的网络模型,一定不要将fc6,fc7重新命名,并且一定要修改solve.py
利用transplant的方式获取vgg16的网络权重;
loss 会很大 几万 一直迭代上几万次后,用图像测试一下看看效果。训练需要先拷贝训练好的识别网络的权重,再进一步训练。而不是直接从头开始训练整个网络。反卷积的部分是不需要迭代权重的,这一部分根据线性插值等方法将特征图尺寸扩大为跟原图相同的尺寸。是图像细节化,锐化。卷积是提取图像概括性信息 是图像模糊化的作用。

7.训练完后用得到的model来测试

测试训练的网络:单张图像测试
在fcn源码文件夹,找到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

此外
out = net.blobs[‘score’].data[0].argmax(axis=0)
改成
out = net.blobs[‘score_sem’].data[0].argmax(axis=solve.py0)

测试结果,用自己的图测试。

出现错误:

softmax_loss_layer.cpp:47] Check failed: outer_num_ * inner_num_ == bottom[1]->count() (250000 vs. 65536) Number of labels must match number of predictions; e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), label count (number of labels) must be N*H*W, with integer values in {0, 1, ..., C-1}. *** Check failure stack trace: *
  • 1

No module named _caffe

出现错:
1.ImportError: /home/jason/anaconda2/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found
解决方法:
http://blog.csdn.net/u010987458/article/details/71702938
出现该问题的根本原因是anaconda3中自带的libgcc版本是libgcc 4.8.5-2,然而caffe中编译Python需要更高的版本libgcc5.2.0。
  解决办法:
conda install libgcc
2. python caffe报错:No module named google.protobuf.internal
解决:
http://blog.csdn.net/wuzuyu365/article/details/52431062
我装的是anaconda2, 解决方法是在其中安装protobuf最新版本
sudo chmod 777 -R anaconda2
conda install protobuf
3.Python 运行fcn solve.py 报错?
python solve.py出错 IndexError: list index out of range*
需要参数 python solve.py 0 来设置gpu
4.F0710 18:01:09.957541 24402 layer_factory.hpp:81] Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python (known types: AbsVal, Accuracy, ArgMax, BNLL, BatchNorm, BatchReindex, Bias, Concat, ContrastiveLoss, Convolution, Crop, Data, Deconvolution, Dropout, DummyData, ELU, Eltwise, Embed, EuclideanLoss, Exp, Filter, Flatten, HDF5Data, HDF5Output, HingeLoss, Im2col, ImageData, InfogainLoss, InnerProduct, Input, LRN, LSTM, LSTMUnit, Log, MVN, MemoryData, MultinomialLogisticLoss, PReLU, Parameter, Pooling, Power, RNN, ReLU, Reduction, Reshape, SPP, Scale, Sigmoid, SigmoidCrossEntropyLoss, Silence, Slice, Softmax, SoftmaxWithLoss, Split, TanH, Threshold, Tile, WindowData)
* Check failure stack trace: *

解决方法:
cd $PYTHONPATH
进入这个路径后发现新的环境变量配置没有生效!!!
如果想其立即生效,需要执行如下命令:
source ~/.bashrc
修改python包目录,这句话

PYTHON_INCLUDE := /usr/include/python2.7 \
  /usr/lib/python2.7/dist-packages/numpy/core/include

改为

PYTHON_INCLUDE := /usr/include/python2.7 \
  /usr/local/lib/python2.7/dist-packages/numpy/core/include

因为新安装的python包目录在这里: /usr/local/lib/python2.7/dist-packages/
5.protoc 多版本问题
错误:
*lly@lly-desktop:~/caffe$ sudo find / -name protoc
/home/lly/anaconda2/bin/protoc
/home/lly/anaconda2/pkgs/libprotobuf-3.2.0-0/bin/protoc
/usr/bin/protoc
/usr/share/bash-completion/completions/protoc
find: ‘/run/user/1000/gvfs’: Permission denied
lly@lly-desktop:~/caffe$ sudo cp /usr/bin/protoc /home/lly/anaconda2/bin/protoc
lly@lly-desktop:~/caffe$ make clean
lly@lly-desktop:~/caffe$ make all -j4*

FCN安装参考链接:

caffe 安装:http://blog.csdn.net/u010069760/article/details/74912600

FCN安装:http://blog.csdn.net/u013059662/article/details/52770198
主要参考:http://blog.csdn.net/wangkun1340378/article/details/70238290

http://blog.csdn.net/wangkun1340378/article/details/56834642
http://www.cnblogs.com/xuanxufeng/p/6243342.html?utm_source=itdadao&utm_medium=referral
http://www.zhuangjiyuan.com/help/Linux/1545.html
gg16-fcn.caffemodel下载链接:https://pan.baidu.com/s/1qYJeFfQ?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0

其他

Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的环境变量。
所以管理环境变量的文件也分为系统级和用户级的
系统级:
/etc/profile:该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于登录到系统的每一个用户。该文件一般是调用/etc/bash.bashrc文件。
/etc/bash.bashrc:系统级的bashrc文件。
/etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。

用户级(这些文件处于家目录下):
~/.profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。不推荐放到这儿,因为每开一个shell,这个文件会读取一次,效率肯定有影响。
~/.bash_profile or ~./bash_login:这里没有引用作者的,下面会提到
~/.pam_environment:用户级的环境变量设置文件,没有做测试,不知道管不管用。

Ubuntu不同目录下profile与bashrc的区别

/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/prof

ile.d目录的配置文件中搜集shell的设置。

etc/bash.bashrc: 为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。

~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次,默认情况下,他设置一些环境变量,执行用户的.bashrc文件。

~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被

读取。

~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件。

另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是”父子”关系。

~/.bash_profile 是交互式、login 方式进入 bash 运行的

~/.bashrc 是交互式 non-login 方式进入 bash 运行的

通常二者设置大致相同,所以通常前者会调用后者。
“`

caffe FCN Ubuntu16.0相关推荐

  1. caffe FCN网络的训练——以SIFT-Flow 数据集为例

    原文:http://www.cnblogs.com/xuanxufeng/p/6243342.html 我在练习中根据操作稍微修改了一些内容, caffe fcn学习资料收集: 可以参考这个训练: h ...

  2. 分享一个Ubuntu16.0.4安装MySQL5.7脚本

    好久没写脚本了,今天为了测试做了下mysql同时也写了一个小小的安装脚本 不过这还是第一次在Ubuntu环境写脚本 如下: #!/bin/bash ########################## ...

  3. centos7.4和ubuntu16.0.4常用命令

    centos7.4和ubuntu16.0.4常用命令 1. CentOS和Ubuntu的区别 2. 命令区别 防火墙 CentOS 6 关闭防火墙的命令 CentOS 7 关闭防火墙的命令 Linux ...

  4. 百度云服务器Ubuntu16.0(Linux)安装mqtt的mosquitto代理服务器

    本文主要总结在百度云服务器Ubuntu16.0(Linux)上部署mqtt的mosqutto代理服务器,全文分为三大部分,分别是百度云服务器安装Ubuntu16.0系统.在Ubuntu16.0上部署m ...

  5. Ubuntu16.0配置MPTCP

    一.在Ubuntu16.0下配置并编译MPTCP 1.安装依赖环境 sudo apt-get update sudo apt-get install libncurses5-dev sudo apt- ...

  6. Ubuntu16.0.4+1080ti+ cuda9.1+cudnn7.0.5 安装 及 caffe 测试

    主要还是要参考官方文档 cuda 安装有两种方法,这里参考 blog.csdn.net/guojunxiu/article/details/78848503 使用 Package Manager In ...

  7. Caffe SSD Ubuntu16 04 训练自己的数据集

    总的来说,Caffe 是一个比较难上手的框架.这次尝试训练 Caffe 框架下 SSD 模型的训练是我第一次使用 Caffe 框架.下面就说一说我踩过的几个坑,希望能够帮助到大家. 1 编译 Caff ...

  8. Ubuntu16.0下安装显卡驱动、cuda10.0 、cudnn的活生生案例

    由于本人记性不好,所以将深度学习环境配置过程中的活生生教训记录下来,避免以后再在相同的地方栽跟头,时间如金,且行且珍惜. 这个方法在环境配置环境完成后才发现的,一般来讲啊,亲测有效的一般含金量都比较高 ...

  9. VMware中创建Ubuntu16.0.4虚拟桥连方式无法上网

    一.问题描述 在本地VMvare中已经安装了两台虚拟机,网络方式都是桥连,上网都可以自动获取IP地址 和HOST主机是一个号段的 ,同为192.168.1.X KingServer1(原始安装)  桥 ...

  10. ubuntu16.0.4 opencv4.0.0 GPU 版本的 SURF

    opencv4.0.0 自带的 samples GPU surf_keypoint_matcher.cpp surf_keypoint_matcher.cpp #include <iostrea ...

最新文章

  1. 不愿说再见 | 自动化系2019年毕业典礼发言
  2. Servlet的体系结构 || Servlet相关配置
  3. mysql custom_MySQL安装教程
  4. Vue.js-Day09【项目实战(附带 完整项目源码)-day04:用户个人中心页面、用户登录页面、将项目打包部署到服务器上、项目汇报、实训心得】
  5. 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数
  6. RESTful API 编写规范
  7. jax-rs jax-ws_JAX-RS 2.x与Spring MVC:返回对象列表的XML表示
  8. ecshop 模板 php代码,ecshop无法在模板文件.dwt和.lbi中直接添加php代码的解决方法...
  9. python变量自加一_Python个人练习项目 2-1
  10. 机器学习速成课程 | 练习 | Google Development——编程练习:神经网络简介
  11. python中流程图的基本元素_面试干货:成为Python程序员的终极指南!(内附回答)...
  12. 我使用过的Linux命令之dot - 绘制DOT语言脚本描述的图形
  13. awk使用多个分割符
  14. kotlin中文开发文档+视频教程+Android Studio 3.0下载地址
  15. [C#] TestHttpPost:测试Http的POST方法的小工具
  16. deepin Linux 安装 tar,Linux Deepin 15.11安装更新firefox flash player
  17. 王道操作系统2.2处理机调度摘要
  18. Microsoft MSN Messenger 7.0.0205 Beta Leaked
  19. centos 上搭建FC SAN
  20. 寒假每日一题题解(1.20)十三号星期五

热门文章

  1. sql group by统计
  2. Stroustrup 谈 C++ 11的新特性
  3. 通过OAuth方式与docker hub v2 API交互
  4. wpf 深度复制控件,打印控件
  5. 树莓派 之 关于用途
  6. 系统开发中的时间类型的处理问题
  7. oracle教程之创建自己的锁定
  8. 分享一款国外的优化IE9浏览器的软件感觉很好用兼容win7
  9. 高级装饰器---验证用户登录
  10. 基于数组实现Java 自定义Stack栈类及应用