http://blog.csdn.net/wangkun1340378/article/details/70238290
论文全名:Fully Convolutional Networks for Semantic Segmentation
全卷积神经网络 FCN代码运行详解:
运行平台:
Ubuntu 14.04 + cudnn7
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接口
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 //这里修改成找到的路径 |
/fcn.berkeleyvision.org/data/
下,并将文件夹名重命名为
sift-flow
sys.path.append('/home/my/caffe-master/caffe-master/python')
- train_net: "trainval.prototxt"
- test_net: "test.prototxt"
- test_iter: 200
- # make test net, but don't invoke it from the solver itself
- test_interval: 999999999
- display: 20
- average_loss: 20
- lr_policy: "fixed"
- # lr for unnormalized softmax
- base_lr: 1e-10
- # high momentum
- momentum: 0.99
- # no gradient accumulation
- iter_size: 1
- max_iter: 300000
- weight_decay: 0.0005
- snapshot:10000
- snapshot_prefix:"/home/my/fcn.berkeleyvision.org-master/fcn.berkeleyvision.org-master/siftflow-fcn32s/train"
- test_initialization: false
在这里郑重声明一下:如果训练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高居不下的情况sys.path.append('/home/my/caffe-master/caffe-master/python')
- import numpy as np
- from PIL import Image
- import matplotlib.pyplot as plt
- import sys
- sys.path.append('/home/my/caffe-master/caffe-master/python')
- import caffe
- import cv2
- %matplotlib inline
- # load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe
- im = Image.open('siftflow-fcn8s/test.jpg')
- in_ = np.array(im, dtype=np.float32)
- in_ = in_[:,:,::-1]
- in_ -= np.array((104.00698793,116.66876762,122.67891434))
- in_ = in_.transpose((2,0,1))
- # load net
- net = caffe.Net('siftflow-fcn8s/deploy.prototxt', 'siftflow-fcn8s-heavy.caffemodel', caffe.TEST)
- # shape for input (data blob is N x C x H x W), set data
- net.blobs['data'].reshape(1, *in_.shape)
- net.blobs['data'].data[...] = in_
- # run net and take argmax for prediction
- net.forward()
- out = net.blobs['score_sem'].data[0].argmax(axis=0)
- #print "hello,python!"
- #plt.imshow(out,cmap='gray');
- plt.imshow(out)
- plt.axis('off')
- plt.savefig('test.png')
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/1dFCHWf3
其中 deploy是fcn32的
deploy16是fcn16的
deploy8是fcn8的
需要额外注意的是 如果使用siftflow数据集训练得到的model
在测试时候 也请使用siftflow数据集中的img进行test,我以一张voc数据集的img利用siftflow数据集得到的model示例
可以看到voc的图像 在利用siftflow数据集进行测试的结果并不好
在siftflow数据集中 class.txt文件中是包含person这个类别的 但在这个例子中 仍然无法将person完整分割出来
这是因为 train data中 person类别的多样性不足 在大家自己制作自己的数据集时候
不仅要完整包含自己所需要的类别(class) 在保证数据集的数量足够大的同时 更要注意每一个class的 多样性
例如 person的姿势 多样性 等等 只有如此 才能使得分割结果更加完善
fcn只是工具 就像汽车的发动机
我们使用fcn 时候 我们的数据集就是机油
机油纯度高(数据集做得好) 汽车跑的就快,跑的远(分割结果就好)
在此,fcn的训练已经结束,祝大家顺利
如果想下载官方的训练好的model 试试结果可以在这里下载到
http://dl.caffe.berkeleyvision.org/
以上,FCN的训练和测试全部结束,这次有个朋友催我做这个,做得比较仓促,如果有问题,欢迎指摘
感谢Zoro_H提供的 利用siftflow训练得到的model 对voc数据集中图片的测试结果