论文全名:Fully Convolutional Networks for Semantic Segmentation
全卷积神经网络 FCN代码运行详解:
运行平台:
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
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的网络权重;
具体操作为
可以看到我注释了
关于 我附上我的百度网盘的链接 如果大家找不到 可以在这里下载
http://pan.baidu.com/s/1geLL6Sz
如果训练fcn16s,则可以直接copy自己的fcn32s的model的权重,不需要transplant,也就是不需要修改solve.py
如果训练fcn8s,则可以直接copy自己的fcn16s的model的权重,不需要transplant,也就是不需要修改solve.py
只有如此,才能避免loss高居不下的情况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统统删除
然后删除输入层,在fcn中就是第一个python层,即删除
layer {
name: "data"
type: "Python"
top: "data"
top: "sem"
top: "geo"
python_param {
module: "siftflow_layers"
layer: "SIFTFlowSegDataLayer"
param_str: "{\'siftflow_dir\': \'../data/sift-flow\', \'seed\': 1337, \'split\': \'trainval\'}"
}
}
然后在文件顶部加上
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}中的dim可以随意设置,此处虽然为1 3 256 256,但是caffe会根据所读取的图片进行重新设置dim
此外,关于siftflow-fcn需要的deploy文件,我在这里附上一个下载地址,如果不愿意自己制作可以下载这个:
https://pan.baidu.com/s/1nxeLxBr
需要额外注意的是 如果使用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数据集中图片的测试结果