简单的说,caffe并不像opencv那样。有个官方的例程,可以让小伙伴们方便的入手。正因为如此,本文将详细讲解如何在linux下在自己写的工程中调用caffe库。
本文测试平台Ubuntu14.04+corei7+TitanX
方式1:
如果自己的caffe是用CMakeLists编译安装的,那么就会在/usr/local/lib/cmake/下方生成相应的.cmake的配置文件,这样在其他程序调用CMakeLists的时候就可以,就可以根据这些.cmake文件来找到需要调用的库。
这样的话,可以运行如下的CMakeLists来编译自己的调用了caffe库的程序
cmake_minimum_required(VERSION 2.8)
find_package(Caffe)
include_directories(${Caffe_INCLUDE_DIRS})
add_definitions(${Caffe_DEFINITIONS})
add_executable(caffeinated_application main.cpp)
target_link_libraries(caffeinated_application ${Caffe_LIBRARIES})
只调用opencv的CMakeLists
cmake_minimum_required (VERSION 2.8)
PROJECT(main)
# Requires OpenCV v2.4.1 or later
FIND_PACKAGE( OpenCV REQUIRED )
IF (${OpenCV_VERSION} VERSION_LESS 2.4.1)
MESSAGE(FATAL_ERROR "OpenCV version is not compatible : ${OpenCV_VERSION}. requires atleast OpenCV v2.4.1")
ENDIF()
SET(SRC
main.cpp
)
ADD_EXECUTABLE( ${PROJECT_NAME} ${SRC} )
TARGET_LINK_LIBRARIES( ${PROJECT_NAME} ${OpenCV_LIBS} )
方式2:
很不巧,自己的caffe是根据Makefile.config编译的,那么这时候就需要自己指定相应的库的路径了,CMakeLists如下,其中opencv调用的库根据自己的需要添加,将cafferoot替换为自己的caffe根目录,opencvroot替换为自己的opencv根目录
cmake_minimum_required (VERSION 2.8)
project (classification)
add_executable(classification classification.cpp)
include_directories ( /cafferoot/include
/usr/local/include
/usr/local/cuda/include )
target_link_libraries(classification / cafferoot /build/lib/libcaffe.so
/opencvroot /build/lib/libopencv_highgui.so
/ opencvroot /build/lib/libopencv_core.so
/ opencvroot /build/lib/libopencv_imgproc.so
/usr/local/lib/libglog.so
/usr/lib/x86_64-linux-gnu/libboost_system.so
)
或者使用clion编辑器中的CMakeLists,
cmake_minimum_required(VERSION 2.8)
project(classifier)
add_definitions("-DUSE_OPENCV")#源码里面有#ifdef USE_OPENCV这样的语句
set(Caffe_Root
/path/caffe#caffe目录,根据实际情况修改
)
set(Caffe_INCLUDE_DIRS
${Caffe_Root}/include
${Caffe_Root}/src
/usr/local/cuda/include
)
set(Caffe_LIBRARIES
caffe
boost_system
glog
)
#add_compile_options(-std=c++11)
find_package(OpenCV REQUIRED)
include_directories(
${Caffe_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}
)
link_directories(
${Caffe_Root}/build/lib
)
add_library(${PROJECT_NAME} #STATIC | SHARED | MODULE
${CMAKE_CURRENT_SOURCE_DIR}/classifier.cpp#把分类器编译成链接库
)
#target_link_libraries(${PROJECT_NAME}
# ${OpenCV_LIBS}
#)
add_executable(run main.cpp)#把main.cpp编译成可执行文件run
target_link_libraries(run
${PROJECT_NAME}
${OpenCV_LIBS}
${Caffe_LIBRARIES}
)
实验测试:
为了测试刚才的CMakeLists的可行性,本文对caffe自带的cafferoot/examples/cpp_classification/(cafferoot为自己电脑的caffe安装的根目录)下面的classification.cpp进行编译,生成相应的exe。
cd cafferoot/examples/cpp_classification/
mkdir build
cd build
cmake ..
make
ls
方式3:
Makefile (sequential)
PROJ = matrix_mul
CC = g++
CFLAGS = -c -g -Wall -I/opt/local/include
LDFLAGS = -L/opt/local/lib
LIBS = -lcppunit -ldl
OBJS = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
all: $(PROJ)
$(PROJ): $(OBJS)
$(CC) $(LDFLAGS) $^ -o $@ $(LIBS) $(VAR)
%.o: %.cpp
$(CC) $(CFLAGS) $< -o $@
%.o: %.cpp %.h
$(CC) $(CFLAGS) $< -o $@
clean:
rm -f $(PROJ) $(OBJS) $(TEST_CASES) *.xml
Makefile (openmp)
PROJ = main
CC = g++
CFLAGS = -c -g -Wall -I/opt/local/include -I$(HOME)/cppunit/include
LDFLAGS = -L/opt/local/lib -L$(HOME)/cppunit/lib
LIBS = -lcppunit -ldl
OBJS = $(patsubst %.c,%.o,$(wildcard *.c))
OMPFLAGS = -fopenmp
SIMDFLAGS = -msse2 -msse3 -mavx -O2 -lm
all: $(PROJ)
$(PROJ): $(OBJS)
$(CC) $(OMPFLAGS) $(LDFLAGS) $^ -o $@ $(LIBS)
%.o : %.c
$(CC) $(OMPFLAGS) $(CFLAGS) $< -o $@ $(SIMDFLAGS)
%.o : %.c %.h
$(CC) $(OMPFLAGS) $(CFLAGS) $< -o $@ $(SIMDFLAGS)
clean:
rm -f $(PROJ) $(OBJS)