原生的 caffe 包含了一些基本的运算操作,如果要进行一些自定义操作,比如双线性插值放缩操作、L2 正则化等就需要把相应的实现添加进 caffe 源码,由于 caffe 源码由 C++ 编写,修改源码后需要重新编译。下面对具体的编译过程进行总结:
1. 编译 caffe.proto 文件
添加层时,需要在 /src/caffe/proto/caffe.proto 文件中注册,因为修改过 caffe.proto,所以需要重新编译 proto,需要先安装 protobuf,安装之后需要编译 caffe.proto 文件,生成 caffe.pb.h 和 caffe.pb.cc 文件。编译过程如下:
# 确定protobuf的版本
$ protoc --version
libprotoc 2.5.0
# 编译caffe.proto,需要先进入src/caffe/proto目录下,也可以不进入,指定路径
$ protoc -I=./ --cpp_out=./ ./caffe.proto
# 查看编译结果
$ ls
caffe.pb.cc caffe.pb.h caffe.proto
2. 编译 caffe
make clean // 清除编译结果
make all -j8 // make all 等同于 make, 参数 -j 表示多核操作
3. 编译 pycaffe
有些时候会用到 caffe 的 python 接口,所以需要重新编译 pycaffe。
make pycaffe
4. 测试 pycaffe 是否安装成功
在终端中进入 python 命令行,导入 caffe 模块,如果提示没有这个包的话,进到 caffe-master/python/ 路径下,再次执行上述操作,如果没有报错,那就是环境变量出了问题。
修改环境变量只需修改 ~/.bashrc 文件即可,路径即为 caffe 目录下 python 文件夹的路径:
vim ~/.bashrc
source ~/.bashrc
然后再测试导入 caffe 是否成功。
笔者今天在 python 命令行中测试导入 caffe 时遇到了几个 warning 如下所示:
分析错误后给出解决方案如下:
修改 python/caffe 文件夹里面的 _caffe.cpp 文件。
把原来的
bp::register_ptr_to_python<shared_ptr<Net<Dtype> > >();
替换为
bp::type_info info;
const boost::python::converter::registration* reg;
info = boost::python::type_id<shared_ptr<Net<Dtype> > >();
reg = boost::python::converter::registry::query(info);
if (reg == NULL)
{
bp::register_ptr_to_python<shared_ptr<Net<Dtype> > >();
}
相应的还有几个注册到 python 的类型,也要做相似的调整:
最后再 make pycaffe,导入成功,问题解决!