今天要跑一下Convolutional Autoencoder for Loop Closure,轻量级神经网络闭环方法。
caffe安好之后编译程序出现以下错误:
Scanning dependencies of target deeplcd
[ 5%] Building CXX object CMakeFiles/deeplcd.dir/src/deeplcd/deeplcd.cpp.o
In file included from /home/lenovo/litw/dependencies/caffe/build/install/include/caffe/common.hpp:19:0,
from /home/lenovo/litw/dependencies/caffe/build/install/include/caffe/blob.hpp:8,
from /home/lenovo/litw/dependencies/caffe/build/install/include/caffe/caffe.hpp:7,
from /home/lenovo/litw/DL/calc/DeepLCD/include/deeplcd/deeplcd.h:1,
from /home/lenovo/litw/DL/calc/DeepLCD/src/deeplcd/deeplcd.cpp:1:
/home/lenovo/litw/dependencies/caffe/build/install/include/caffe/util/device_alternate.hpp:34:10: fatal error: cublas_v2.h: 没有那个文件或目录
#include <cublas_v2.h>
^~~~~~~~~~~~~
compilation terminated.
CMakeFiles/deeplcd.dir/build.make:62: recipe for target 'CMakeFiles/deeplcd.dir/src/deeplcd/deeplcd.cpp.o' failed
make[2]: *** [CMakeFiles/deeplcd.dir/src/deeplcd/deeplcd.cpp.o] Error 1
CMakeFiles/Makefile2:136: recipe for target 'CMakeFiles/deeplcd.dir/all' failed
make[1]: *** [CMakeFiles/deeplcd.dir/all] Error 2
Makefile:94: recipe for target 'all' failed
make: *** [all] Error 2
大概是因为缺少cuda,但安装cuda失败,提示缺少kernel module,阅读CUDA安装说明才发现(怎么这个时候才读啦),我电脑上根本就没有nvidia GPU...回过头来看CUDA只是程序的可选依赖项,最后发现是因为在安装caffe时没有把设置改成cpu-only.
然后在caffe包里的CMakeLists.txt里面CPU-ONLY这一参数设置为ON才可。但还是程序编译失败了。
然后使用推荐的make编译。先需要修改Makefile.config文件,去注释掉cpu-only那一行。然后出现错误:
In file included from src/caffe/solvers/sgd_solver.cpp:5:0:
./include/caffe/util/hdf5.hpp:7:10: fatal error: hdf5.h: 没有那个文件或目录
#include "hdf5.h"
^~~~~~~~
compilation terminated.
Makefile:591: recipe for target '.build_release/src/caffe/solvers/sgd_solver.o' failed
make: *** [.build_release/src/caffe/solvers/sgd_solver.o] Error 1
按照https://blog.csdn.net/object_allen/article/details/73933934里面的方法,改进了一下,
对原文行不做修改,而是对197,198行做修改
ifeq ($(USE_HDF5), 1)
LIBRARIES += hdf5_hl hdf5
把上面两行改成
ifeq ($(USE_HDF5), 1)
LIBRARIES += hdf5_serial_hl hdf5_serial
大概是ubuntu16.04之后更新了路径
然后又出错辽,因为caffe默认opencv版本是2.x,但我装的3.4.4
报错如下:
.build_release/lib/libcaffe.so:对‘cv::imread(cv::String const&, int)’未定义的引用
.build_release/lib/libcaffe.so:对‘cv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator<unsigned char> >&, std::vector<int, std::allocator<int> > const&)’未定义的引用
.build_release/lib/libcaffe.so:对‘cv::imdecode(cv::_InputArray const&, int)’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:635: recipe for target '.build_release/tools/upgrade_solver_proto_text.bin' failed
make: *** [.build_release/tools/upgrade_solver_proto_text.bin] Error 1
在https://blog.csdn.net/u011636440/article/details/82660697找到解决方案,把Makefile.config中OPENCV_VERSION := 3
取消注释即可。
但最后还是删掉重新编译成功,
but you know what,
还是开头这个错误!但既然caffe是编译成功的,所以是程序设置的问题。在https://blog.csdn.net/xcls2010/article/details/80422538中找到解决方案,给CXX_FLAGS += -DCPU_ONLY=1 这一项即可。
然后继续跑又出错了(崩溃边缘)(幸好之前就有看到解决方案)
[ 16%] Building CXX object CMakeFiles/deeplcd.dir/src/deeplcd/deeplcd.cpp.o
In file included from /home/lenovo/litw/dependencies/caffe/include/caffe/caffe.hpp:7:0,
from /home/lenovo/litw/DL/calc/DeepLCD/include/deeplcd/deeplcd.h:1,
from /home/lenovo/litw/DL/calc/DeepLCD/src/deeplcd/deeplcd.cpp:1:
/home/lenovo/litw/dependencies/caffe/include/caffe/blob.hpp:9:10: fatal error: caffe/proto/caffe.pb.h: 没有那个文件或目录
#include "caffe/proto/caffe.pb.h"
^~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
CMakeFiles/deeplcd.dir/build.make:62: recipe for target 'CMakeFiles/deeplcd.dir/src/deeplcd/deeplcd.cpp.o' failed