crf as rnn官网:https://github.com/torrvision/crfasrnn
官网中有相关的代码、论文、在线演示,可以参考。但本人在下载官网中的代码使用时遇到的一些问题或者说是困难,记录下可供自己和一些爱好者参考,有不对的地方请指正。
我这里就不介绍Caffe的安装,驱动,CuDNN等安装,以前的文章中有写,有问题的可以参考之前的文章。
一、官网代码下载
下载官网的代码:
git clone --recursive https://github.com/torrvision/crfasrnn.git
下载好会发现官网代码中会有一个caffe文件夹,这个是旧版的一个caffe(这个版本的caffe已经将crf as rnn与caffe结合好了),我原本准备就用这个caffe来做FCN和CRF as RNN的训练,但是解决所有遇到的问题后,在训练时报错,原因查了下应该是FCN的代码版本和这个旧版caffe不兼容,所以建议大家使用caffe官网最新的版本,下面会介绍如何修改官网新的caffe,使其能将FCN与CRF as RNN完整训练。
二、移植操作
1、移植辅助的文件
caffe/include/caffe/util/下的coords.hpp和modified_permutohedral.hpp
移植Layer中的特性
caffe/include/caffe/layer.hpp中添加如下代码:
#include "caffe/util/coords.hpp"
和以下代码:
virtual DiagonalAffineMap<Dtype> coord_map() {
NOT_IMPLEMENTED;
// suppress warnings
return DiagonalAffineMap<Dtype>(vector<pair<Dtype, Dtype> >());
}
3、移植CRF层
将crfasrnn/caffe/src/caffe/layers/multi_stage_meanfield.cpp和meanfield_iteration.cpp复制到
caffe/src/caffe/layers/multi_stage_meanfield.cpp和meanfield_iteration.cpp下
4、移植CRF层的参数到caffe.proto文件
在caffe/src/proto/caffe.proto文件中添加
optional MultiStageMeanfieldParameter multi_stage_meanfield_param = 147;此处id不要与原文件重复即可
message MultiStageMeanfieldParameter {
enum Mode {
POTTS = 0;
}
optional Mode compatibility_mode = 1 [default = POTTS];
optional float threshold = 2;
required float theta_alpha = 3 [default = 10.];
required float theta_beta = 4 [default = 10.];
required float theta_gamma = 5 [default = 10.];
required uint32 num_iterations = 6 [default = 1];
optional float spatial_filter_weight = 7 [default = 1];
optional float bilateral_filter_weight = 8 [default = 1];
optional float forced_spatial_filter_weight = 9;
optional float forced_bilateral_filter_weight = 10;
}
上面是参考,我提取部分修改做;下面是我在make时报错做的一些操作:
make时会提示一些文件缺少,都是crfasrnn/caffe/include/caffe/文件夹下的neuron_layers.hpp、python_layer.hpp、common_layers.hpp、data_layers.hpp、data_reader.hpp、loss_layers.hpp这几个文件在caffe/include/caffe/文件夹下缺少,复制过去就好。
以上的caffe/是caffe官网最新的caffe,移植好上面的之后,先清除以前的make过的caffe
make clean
然后
make all -j4
如果没有错误
make runtest
如果出错可以自行搜索下错误,然后
make pycaffe
这样整个移植的caffe就准备好了。
三、Demon演示
在官网中的代码中提供了python-scripts文件夹,
下载预训练模型,如果下不了,直接在浏览器中输入这个文件里的网址会自动下载:
sh download_trained_model.sh
然后
python crfasrnn_demo.py
即可得到结果
四、训练自己的数据集
前面的文章中我有写过FCN的:
然后在训练阶段的修改就是训练网络,如voc-8s中的train.prototxt修改最后一个反卷积层后的网络如下,ke'yi'c
layer {
name: "score"
type: "Crop"
bottom: "upscore8"
bottom: "data"
top: "score"
crop_param {
axis: 2
offset: 31
}
}
layer { type: 'Split' name: 'splitting'
bottom: 'score' top: 'unary' top: 'Q0'
}
layer {
name: "inference1"#if you set name "inference1", code will load parameters from caffemodel.
type: "MultiStageMeanfield"
bottom: "unary"
bottom: "Q0"
bottom: "data"
top: "pred"
param {
lr_mult: 10000#learning rate for W_G
}
param {
lr_mult: 10000#learning rate for W_B
}
param {
lr_mult: 1000 #learning rate for compatiblity transform matrix
}
multi_stage_meanfield_param {
num_iterations: 10
compatibility_mode: POTTS#Initialize the compatilibity transform matrix with a matrix whose diagonal is -1.
threshold: 2
theta_alpha: 160
theta_beta: 3
theta_gamma: 3
spatial_filter_weight: 3
bilateral_filter_weight: 5
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "pred"
bottom: "label"
top: "loss"
loss_param {
# ignore_label: 255
normalize: true
}
}
然后修改好solver.prototxt中的train_net: "train.prototxt"
然后
python solver.py
即可开始训练。。。。