caffe FCN Ubuntu16.0

来源:互联网 发布:java轻量级javaee开发 编辑:程序博客网 时间:2024/05/16 10:06

/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.

附带:python image resize:

from PIL import Imageimport os.pathimport globdef 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")

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 syssys.path.append('/home/calmcar/Downloads/caffe/python')import caffeimport surgery, scoreimport numpy as npimport ostry:    import setproctitle    setproctitle.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 # surgeriesinterp_layers = [k for k in solver.net.params.keys() if 'up' in k]surgery.interp(solver.net, interp_layers)# scoringtest = 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')

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)

修改后直接运行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: *

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 运行的

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

原创粉丝点击