caffe源码分析-cmake 工程构建
本文主要说明下,caffe源码分析过程中的cmake(结合IDE CLion)工程构建问题。在分析caffe源码的过程中,我没有仅仅只是看代码,而是:
-
自己从头构建一遍工程,这样能让我更好的了解大型的项目的构建。当然原始的caffe的构建感觉还是比较复杂(主要是
cmake),我这里仅仅使用cmake构建,而且简化点,当然最重要的是支持CLion直接运行调试。 -
从Blob文件开始从头开始复制每一个类,能够自行把没有个模块给运行起来,并编写对于的测试代码,这样更能加深自己的理解。
阅读源码最好要从头搭建工程,把每个模块运行起来,可以实现简单的功能,不是直接复制源代码的文件,走马观花的看下代码就行的(这样理解代码也不会深刻)。
整个工程的构建如下(cmake结合IDE CLion):
下面简要的给出三个模块的构建:
-
cmake目录(包含FindGLog.cmake,FindOpenBLAS.cmake等),主要是获取第三方依赖的头文件以及lib文件。
-
整个工程的CMakeLists.txt,主要作用是使用1中的cmake获取相关的依赖给子目录、设置全局变量等。
-
src生产libcaffe_lib.a并输出到lib目录下,
main.cpp以及其他的test文件主要是测试每个类。
1. cmake目录
caffe的依赖较多,例如glog、protobuf、openblas、boost等,因此查找依赖的模块是每个单独的文件,以cmake为后缀。
下面简单给出FindOpencv.cmake,与FindGLog.cmake的内容。
FindOpencv.cmake内容很简单:
find_package(OpenCV REQUIRED)message(in FindOpencv.cmake inc: ${OpenCV_INCLUDE_DIRS}, lib:${OpenCV_LIBS})
FindGLog.cmake的内容稍微复杂点:
include(FindPackageHandleStandardArgs)if (NOT DEFINED GLOG_ROOT)message("set GLOG_ROOT========================")set (GLOG_ROOT /usr /usr/local /usr/include/)
endif (NOT DEFINED GLOG_ROOT)#set(GLOG_ROOT_DIR "" CACHE PATH "Folder contains Google glog")find_path(GLOG_INCLUDE_DIR glog/logging.hPATHS${GLOG_ROOT_DIR}PATH_SUFFIXESsrc)find_library(GLOG_LIBRARY glog libglogPATHS${GLOG_ROOT_DIR}PATH_SUFFIXES.libsliblib64)find_package_handle_standard_args(GLOG DEFAULT_MSGGLOG_INCLUDE_DIR GLOG_LIBRARY)if(GLOG_FOUND)set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR})set(GLOG_LIBRARIES ${GLOG_LIBRARY})message("GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIRS}===========")message("GLOG_LIBRARY ${GLOG_LIBRARY}===========")
endif()
本质就是返回对应的lib的头文件以及lib(so, .a)文件的路径。
# dependence lib
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
find_package(GLog REQUIRED)
find_package(Opencv REQUIRED)
在主CMakeLists.txt中主要include对应的cmake目录然后find_package既可获取对应的lib的相关路径。
CLion cmake的输出如下:
2. 主CMakeLists.txt
内容如下:
cmake_minimum_required(VERSION 3.5)
project(my_caffe)set(CMAKE_CXX_STANDARD 11)# set variable for sub directory to use
set(INC_DIR "${CMAKE_SOURCE_DIR}/include")
set(LIB_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/lib")# dependence lib
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
find_package(GLog REQUIRED)
find_package(ProtoBuf REQUIRED)
find_package(OpenBLAS REQUIRED)
find_package(Opencv REQUIRED)add_subdirectory(src)include_directories(${CMAKE_SOURCE_DIR}/src)set(SOURCE_FILES main.cpp test_blob.h test_blob.cpp)
link_directories(${LIB_OUTPUT_PATH})
add_executable(my_caffe_test ${SOURCE_FILES})target_link_libraries(my_caffe_test/home/xy/caffe_analysis/my_caffe/lib/libcaffe_lib.a${GLOG_LIBRARIES}${PROTOBUF_LIBRARIES}${OpenBLAS_LIB}${OpenCV_LIBS}-lcaffe_lib)
3. src CMakeLists.txt
内容如下:
project(caffe_lib)
set(CMAKE_CXX_STANDARD 11)aux_source_directory(. SRC)add_library(caffe_lib ${SRC})
set_target_properties(caffe_libPROPERTIESARCHIVE_OUTPUT_DIRECTORY "/home/xy/caffe_analysis/my_caffe/lib/"LIBRARY_OUTPUT_DIRECTORY "/home/xy/caffe_analysis/my_caffe/lib/")target_link_libraries(caffe_lib${GLOG_LIBRARIES}${PROTOBUF_LIBRARIES}${OpenBLAS_LIB}${OpenCV_LIBS}
)
使用cmake(结合IDE CLion)搭建好工程后,代码的阅读与调试非常方便。C++ IED强烈建议大家使用CLion。接下来的内容是从Blob开始一个个模块分析caffe中的源代码。
caffe系列源码分析介绍
本系列深度学习框架caffe 源码分析主要内容如下:
1. caffe源码分析-cmake 工程构建:
caffe源码分析-cmake 工程构建主要内容:
自己从头构建一遍工程,这样能让我更好的了解大型的项目的构建。当然原始的caffe的构建感觉还是比较复杂(主要是cmake),我这里仅仅使用cmake构建,而且简化点,当然最重要的是支持CLion直接运行调试(如果需要这个工程可以评论留下你的邮箱,我给你发送过去)。
2. caffe的数据内存分配类SyncedMemory, 以及类Blob数据传输的媒介.
主要内容:
caffe源码分析-SyncedMemory
caffe源码分析-Blob
其中Blob分析给出了其直接与opencv的图片相互转化以及操作,可以使得我们更好的理解Blob.
3. caffe layer的源码分析,包括从整体上说明了layer类别以及其proto定义与核心函数.
内容如下:
caffe源码分析-layer
caffe源码分析-ReLULayer
caffe源码分析-inner_product_layer
caffe源码分析-layer_factory
首先分析了最简单的layer Relu,然后在是inner_product_layer全连接层, 最后是layer_factorycaffe中 以此工厂模式create各种Layer.
4. 数据输入层,主要是多线程+BlockingQueue的方式读取数据训练:
内容如下:
caffe源码分析-BlockingQueue
caffe源码分析-InternalThread
caffe源码分析-DataReader
5. IO处理例如读取proto文件转化为网络,以及网络参数的序列化
内容如下:
caffe源码分析-DataTransformer
caffe源码分析-db, io
6. 最后给出了使用纯C++结合多层感知机网络训练mnist的示例
内容如下:
caffe c++示例(mnist 多层感知机c++训练,测试)
类似与caffe一样按照layer、solver、loss、net等模块构建的神经网络实现可以见下面这篇blog,相信看懂了这个python的代码理解caffe框架会更简单点.
神经网络python实现
最后如果需要cmake + CLion直接运行调试caffe的代码工程,可以评论留下你的邮箱,我给你发送过去.
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
