您的位置:首页 > 其它

CRF as RNN训练自己的数据集(FCN)以及一些问题解决

2018-03-01 14:10 489 查看
crf as rnn官网:https://github.com/torrvision/crfasrnn
    官网中有相关的代码、论文、在线演示,可以参考。但本人在下载官网中的代码使用时遇到的一些问题或者说是困难,记录下可供自己和一些爱好者参考,有不对的地方请指正。
我这里就不介绍Caffe的安装,驱动,CuDNN等安装,以前的文章中有写,有问题的可以参考之前的文章。

一、官网代码下载

    下载官网的代码:
git clone --recursive https://github.com/torrvision/crfasrnn.git[/code]
    下载好会发现官网代码中会有一个caffe文件夹,这个是旧版的一个caffe(这个版本的caffe已经将crf as rnn与caffe结合好了),我原本准备就用这个caffe来做FCN和CRF as RNN的训练,但是解决所有遇到的问题后,在训练时报错,原因查了下应该是FCN的代码版本和这个旧版caffe不兼容,所以建议大家使用caffe官网最新的版本,下面会介绍如何修改官网新的caffe,使其能将FCN与CRF as RNN完整训练。

二、移植操作

    1、移植辅助的文件
    将crfasrnn/caffe/include/caffe/util/下的coords.hpp和modified_permutohedral.hpp复制到caffe/include/caffe/util/下的coords.hpp和modified_permutohedral.hpp

    2、移植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;
}

上面是参考http://blog.csdn.net/xizero00/article/details/51174367,我提取部分修改做;下面是我在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的:http://blog.csdn.net/qq_15309757/article/details/79035150
    然后在训练阶段的修改就是训练网络,如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
即可开始训练。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息