编译Caffe C ++分类示例

时间:2015-08-26 05:15:24

标签: c++ machine-learning neural-network deep-learning caffe

我最近修改了Caffe C++ classification example file,我正在尝试重新编译它。但是,我在将简单的g ++编译链接到include目录中的.hpp文件时遇到问题。我知道这是一个基本问题,但我似乎无法解决这个问题 - 有人可以帮我解决如何编译这个程序吗?编译现在看起来像这样:

g++ -I /home/jack/caffe/include classification.cpp -o classify

但是我收到了这个错误:

In file included from /home/jack/caffe/include/caffe/common.hpp:19:0,
    from /home/jack/caffe/include/caffe/blob.hpp:8,
    from /home/jack/caffe/include/caffe/caffe.hpp:7,
    from classification.cpp:1:
/home/jack/caffe/include/caffe/util/device_alternate.hpp:34:23: fatal error: cublas_v2.h: No such file or directory
 #include <cublas_v2.h>

我在没有Nvidia GPU的机器上运行它,所以当我查看device_alternate.hpp文件时,我意识到这会调用很多与cuda相关的.hpp文件,而这些文件并不存在。

4 个答案:

答案 0 :(得分:5)

通常,为了帮助编译器找到头文件,您需要在编译行中添加-I /path/to/include/folder选项:

~$ g++ -I /path/to/caffe/include myfile.cpp

答案 1 :(得分:4)

如果您想在caffe中构建自定义文件,有两种方法

简单方法

  • 进行必要的更改并将文件(在您的情况下 - classification.cpp)保存在示例文件夹中的目录(例如test)中 e caffe根目录。
  • 运行make。这将自动添加必要的cxxflags和ldflags并编译代码并将可执行文件放在build / examples / test文件夹中。这也确保设置标志 CPU_ONLY (如 Makefile.config 中所述)

艰难的方式

  • 运行make而不使用漂亮的打印选项(在 Makefile.config 中提到)。您将能够看到用于构建示例和工具的编译和链接选项。您可以复制并粘贴这些选项(并对相关路径进行必要的更改,如果使用的话)来编译文件

希望这有帮助

修改 由于op要求一种简单的方法,可以按照以下方式完成

这是一个非常最小的例子,我鼓励OP参考完整的在线文档和cmake使用示例。

  • 要求
    • Caffe需要使用 cmake 构建 - 相对简单,因为当前主分支具有CMakeLists和所有定义的内容。使用Cmake-gui或ccmake设置选项

现在,我假设你有一个如下的项目结构。

-project  
    - src  
         - class1.cpp
         - CMakeLists.txt ( to be added )
    - include
         - class1.hpp

    - main.cpp
    - CMakeLists.txt ( to be added )

CMakeLists.txt(src)需要包含(至少)以下行,

cmake_minimum_required(VERSION 2.8)
find_package(OpenCV REQUIRED) # Optional in case of dependency on opencv 
add_library( c1 class1.cpp )

注意:如果class1依赖于其他外部库,则必须使用include_directories包含标头的路径。

CMakeLists.txt(最外层)需要在 minimum

中包含以下内容
cmake_minimum_required(VERSION 2.8)
PROJECT(MyProject)

find_package(OpenCV REQUIRED)
find_package(Caffe REQUIRED)

include_directories( "${PROJECT_SOURCE_DIR}/include" )
add_subdirectory( src )

include_directories( "$Caffe_INCLUDE_DIRS}" )
add_executable(MyProject main.cpp)

target_link_libraries( MyProject ${OpenCV_LIBS} c1 ${Caffe_LIBRARIES} )    

现在,项目目录中的以下命令将在MyProject文件夹中创建可执行文件build

mkdir build
cd build
cmake ..
make

然后,您可以使用./MyProject (arguments)

运行程序

编辑2

满足使用CMake构建caffe的要求对于此工作非常重要。您需要使用CMake配置和生成Makefile。为此目的使用cmake-guiccmake,以便您可以设置CPU_ONLY等选项。

您应该在caffe中创建一个构建目录,并执行以下内容进行基本设置

mkdir build
cd build
cmake ..
make -jX #X is the number of threads your CPU can handle

现在,$ HOME文件夹中的.cmake目录包含以下内容 /home/user/.cmake/packages/Caffe/<random_string>个文件。此文件指向caffe的安装位置(这是我们的构建目录)

现在,find_package命令应该在没有其他项目错误的情况下运行。而且由于你使用的是CMake,你可以将你的项目文件夹保存在Caffe文件夹之外(最好把它保持在外面,因为caffe的make过程会尝试构建你的文件,但它会失败)

注意:如果错误仍然存​​在,您可以在cmake配置期间手动设置 Caffe_DIR

答案 2 :(得分:1)

更改Makefile.config以设置CPU_ONLY := 1

# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1

答案 3 :(得分:0)

./caffe/include/caffe/util/device_alternate.hpp中,您拥有

...

#ifdef CPU_ONLY  // CPU-only Caffe.

...

#else  // Normal GPU + CPU Caffe.

#include <cublas_v2.h>

...

这意味着除非定义了cublas_v2.h标志,否则它将尝试包含CPU_ONLY

由于您的计算机没有Nvidia GPU,因此在使用CPU_ONLY进行编译时必须定义-DCPU_ONLY=1标志

因此完整的编译命令应如下所示

g++ -DCPU_ONLY=1 -I /home/jack/caffe/include classification.cpp -o classify