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

即可开始训练。。。。