在这篇博客里,我来说一下如何使用CodeBlocks去执行和调试caffe的代码。
在之前的文章中,我们都是直接调用caffe中的代码,但是其内部是如何运行的,我们并没有看到,这里,我们将caffe代码放到codeblocks创建的工程中,就可以单步调试代码了。我们以运行examples/mnist/convert_mnist_data.cpp的代码为例。关于mnist的训练,请参考 点击链接
在mnist文件中,有一个cpp文件,即convert_mnist_data.cpp,这里的代码主要用于数据类型的转换。
一. 使用codeblocks运行caffe代码
首先,看一下如何在codeblocks下调试和调用这个函数(因为在ubuntu下不好截图,所以尽量把步骤写清楚一些):
在梳理caffe的配置文件中,我们提到将make的打印信息保存下来,参考http://blog.csdn.net/thystar/article/details/50837750结尾部分
因为在codeblock下需要配置一些链接,可以根据打印的文件的一些配置来做,在输出的文件中找到convert_mnist_data.cpp,结果如下:
CXX examples/mnist/convert_mnist_data.cpp
g++ examples/mnist/convert_mnist_data.cpp -MMD -MP -pthread -fPIC -DDEBUG -g -O0 -DUSE_OPENCV -DUSE_LEVELDB -DUSE_LMDB -I/usr/include/python2.7 -I/usr/lib/python2.7/dist-packages/numpy/core/include -I/usr/local/include -I.build_debug/src -I./src -I./include -I/usr/local/cuda-7.5/include -Wall -Wno-sign-compare -c -o .build_debug/examples/mnist/convert_mnist_data.o 2> .build_debug/examples/mnist/convert_mnist_data.o.warnings.txt \
|| (cat .build_debug/examples/mnist/convert_mnist_data.o.warnings.txt; exit 1)
CXX/LD -o .build_debug/examples/mnist/convert_mnist_data.bin
g++ .build_debug/examples/mnist/convert_mnist_data.o -o .build_debug/examples/mnist/convert_mnist_data.bin -pthread -fPIC -DDEBUG -g -O0 -DUSE_OPENCV -DUSE_LEVELDB -DUSE_LMDB -I/usr/include/python2.7 -I/usr/lib/python2.7/dist-packages/numpy/core/include -I/usr/local/include -I.build_debug/src -I./src -I./include -I/usr/local/cuda-7.5/include -Wall -Wno-sign-compare -lcaffe -L/home/sindyz/anaconda/lib -L/usr/local/lib -L/usr/lib -L/usr/local/cuda-7.5/lib64 -L/usr/local/cuda-7.5/lib -L.build_debug/lib -lcudart -lcublas -lcurand -lglog -lgflags -lprotobuf -lboost_system -lboost_filesystem -lm -lhdf5_hl -lhdf5 -lleveldb -lsnappy -llmdb -lopencv_core -lopencv_highgui -lopencv_imgproc -lboost_thread -lstdc++ -lcblas -latlas \
-Wl,-rpath,\$ORIGIN/../../lib
按照上面的配置,
i. 右键项目,点击:properties...菜单-->build target标签-->build options按钮 -->Linker Settings标签,在右侧的空白处,把上面文档中的链接库帖进去。分别是:
-pthread -lcaffe -lcudart -lcublas -lcurand -lglog -lgflags -lprotobuf -lboost_system -lboost_filesystem -lm -lhdf5_hl -lhdf5 -lleveldb -lsnappy -llmdb -lopencv_core -lopencv_highgui -lopencv_imgproc -lboost_thread -lstdc++ -lcblas -latlas
另外,还有最后一句:-Wl,-rpath,\$ORIGIN/../../lib,将$CAFFE/build/lib的相对路径也添加进来。
ii, 在Search dictioneries-->Compile中添加搜索路径,就是上面-I后的路径,主要由三个:
$CAFFE/build/src
$CAFFE/include
如果使用gpu,需要添加:$CUDA/include, ($CUDA是cuda的安装路径,通常是(usr/local/cuda/include).
将这几个路径点击Add添加,其他的配置不用手动添加
iii. 在旁边的Linker标签下添加链接库的搜索路径:就是上面文本中-L开头的部分,也由三个:
$CAFFE/build/lib
$CUDA7.5/lib
$CUDA7.5/lib64
通过Add添加即可,其余也是不用手动添加的
iv. 在Compiler Settings标签下的#defines,把上面-D的部分贴进来:
USE_OPENCV
USE_LEVELDB
USE_LMDB
v. 最后,需要在other options下加入-Wno-sign-compare这句,就不会在编译过程中打印警告信息了
vi 将convert_mnist_data.cpp添加到工程中,在工程目录下创建data目录,把mnist数据帖到这个目录下,就可以编译了,如果没有报错,保存工程(右键工程名-->save project)
vii. 编译完成后,还需要向convert_mnist_data.cpp的主函数中输入参数。在$CAFFE/examples/mnist下的create_mnist.sh中有如下语句:
$BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \
$DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND}
将后面三个输入写入:Project-->Set programs` argument..-->program argument里面,路径要该成自己的路径,因为之前在工程下创建了data目录,因此,我添加的参数如下:
data/mnist/train-images-idx3-ubyte data/mnist/train-labels-idx1-ubyte mnist_train_lmdb --backend=lmdb
运行文件,在工程目录下就会生成mnist_train_lmdb文件夹,并生成lmdb格式的数据文件。
这样,我们就可以用codeblocks调试caffe的代码了。其他代码的添加过程也是类似的。