Caffe中添加自定义层[6,7]
1)头文件
路径:py-faster-rcnn/caffe-fast-rcnn/include/caffe/layers
2)CPP或者CU文件
fasterrcnn_huawei/py-faster-rcnn/caffe-fast-rcnn/src/caffe/layers
3)caffe.proto定义该层的参数
py-faster-rcnn/caffe-fast-rcnn/src/caffe/proto/caffe.proto
proposal_layer.cpp
3.1)message LayerParameter { } 修改
添加消息函数的ID,设置ID。
message LayerParameter {
optional
WindowDataParameter window_data_param = 129; // 目前,唯一的值,不能重复,最大值为143以及另外较大数值
optional
ProposalParameter proposal_param = 144;
}
3.2) 添加消息函数(任意位置)
按顺序指明参数。
message
ProposalParameter {
optional float diff_scale = 1 [default = 1]; //默认梯度不缩放, 暂时不添加
}
3.3) 添加Layer ID(可能不需要添加)
首先,在 message V1LayerParameter { }中的
enum LayerType {
PROPOSAL=xxx; // 不重复即可
}
然后在继续添加
message V1LayerParameter {
enum LayerType {
WINDOW_DATA = 24;
PROPOSAL=xxx; // 不重复即可
}
optional
WindowDataParameter window_data_param = 20
}
3.4) 添加参数定义message V0LayerParameter {}(可能不需要添加)
不再推荐的方式,这个与ProposalParameter 是什么关系??
message V0LayerParameter {
}
3.5 定义一个层
layer{
name: "proposal"
type: "Proposal"
bottom: "" // 与python版本一致
top: "" // 与python版本一致
}
注:可以参考DataLabelParameter
4)注册层
在CPP文件中添加
INSTANTIATE_CLASS(DiffCutoffLayer);
REGISTER_LAYER_CLASS(DiffCutoff);
小结:定义一个新的层,简单来说分为两个步骤:
参考资料[3,4,5,6,712]
1)声明和定义该层的类,分别在hpp和cpp文件中声明和定义该类,并且需要在cpp文件中对该层进行注册,用下面的两行代码(下面所示)注册后,则不需要在layer_factory.cpp文件中
添加构造该新层对象的函数。通常新层会继承子已有的层次,例如layer.cpp层,需要在新层中定义基类中的纯虚函数。例如对于layer层,包括三个虚函数(Backward_cpu, Forward_gpu和Reshape)。
对于只包含测试过程的层,可以通过在Backward_cpu的定义代码中只添加“NOT_IMPLEMENTED;”来表示未定义反向传播函数。
INSTANTIATE_CLASS(DiffCutoffLayer);
REGISTER_LAYER_CLASS(DiffCutoff);
2)配置该层:包括注册和在caffe.proto中设置相关参数。在较新版本的caffe中,用户只需要
在编译caffe的过程中,会根据caffe.proto文件中定义的参数接口来编译相关层的代码。一般只需要做3.1和3.2两部即可。
注意:不需要在layer_factory.cpp文件中添加新层的头文件。
[2]
http://blog.csdn.net/anxiaoxi45/article/details/46522155
[3] caffe/src/caffe/proto/caffe.proto
[5] http://caffe.berkeleyvision.org/tutorial/layers.html
[8]
http://blog.csdn.net/seven_first/article/category/5721883 // caffe源码解析
[9]
https://github.com/shicai/Caffe_Manual // 模型建立过程