编译 Caffe C++ 分类示例

Posted

技术标签:

【中文标题】编译 Caffe C++ 分类示例【英文标题】:Compiling Caffe C++ Classification Example 【发布时间】:2015-11-20 00:16:24 【问题描述】:

我最近修改了 Caffe C++ classification example file,我正在尝试重新编译它。但是,我无法将简单的 g++ 编译链接到包含目录中的 .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 文件。

【问题讨论】:

请发布您用于编译的确切命令,以及您收到的错误消息。 谢谢 Shai,刚刚更新了问题 【参考方案1】:

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

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

【讨论】:

感谢您的帮助 - 不幸的是,一旦它设法找到 Caffe .hpp 文件,我似乎发现了一些新的编译错误! @JackSimpson 您需要向其他工具添加更多-I 选项,这次是您的cuda 包含文件夹。尝试看看 caffe 在编译时使用了哪些标志。【参考方案2】:

如果要在caffe中构建自定义文件,有两种方式

简单的方法

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

艰难的路

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

希望对你有帮助

编辑 由于操作要求一种简单的方法,可以如下完成

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

要求 Caffe 需要使用 cmake 构建 - 相对容易,因为当前的 master 分支已经定义了 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(最外层)需要在最少

处包含以下内容
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 )    

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

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/&lt;random_string&gt; 文件。该文件指向caffe的安装位置(也就是我们的构建目录)

现在,对于您的其他项目,find_package 命令应该可以正常运行。而且由于您使用的是 CMake,您可以将项目文件夹保留在 Caffe 文件夹之外(最好将其保留在外部,因为 caffe 的制作过程会尝试构建您的文件但它会失败)

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

【讨论】:

这很有帮助,但我遇到的一个问题是我有一个 main.cpp 程序和它们自己的 cpp 文件(以及相关的头文件)中有两个其他类。你知道有什么简单的方法可以让我同时编译另外两个两个文件吗? 最好的办法是为每个人编写一个 Makefile / CMakeLists.txt,将它们编译成对象并将其与依赖项一起链接到 main.cpp。要了解依赖关系,您可以在 Makefile.config 中关闭漂亮的打印,并查看传递的标志以编译 caffe 的 make 过程中的示例/工具。是的,我想不出如何用简单的方法来完成。也许以后知道了,我会ping你的。 感谢您的精彩解释!我对cmake如何找到Caffe有点困惑的一件事?指令“find_package(Caffe REQUIRED)”或“$Caffe_LIBRARIES”并没有告诉它库在哪里。在我的计算机上编译 Caffe 后,我是否提供了额外的信息以将 cmake 指向它的库所在的位置? 大多数情况下,每当您使用 cmake 构建时,CMAKE_MODULES_PATH 变量都会更新,从而为您提供对 CaffeConfig.cmake 定义的包含和库的访问权限 您可以在您的主目录 (~/.cmake/) 中找到一个文件,其中包含有关 caffe 和构建目录路径的信息,其中包含 CaffeConfig.cmake。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

./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,因此您必须在编译期间使用 -DCPU_ONLY=1 定义 CPU_ONLY 标志

所以你的完整编译命令应该是这样的

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

【讨论】:

以上是关于编译 Caffe C++ 分类示例的主要内容,如果未能解决你的问题,请参考以下文章

用Python学习Caffe1. 使用Caffe完成图像分类

如何使用 Spark 和 Caffe 对图像进行分类

直接编译caffe出现的两个问题

Caffe 可以直接对图像的像素进行分类吗?

如何利用Caffe训练ImageNet分类网络

Caffe训练好的网络对图像分类