前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >caffe源码分析-cmake 工程构建

caffe源码分析-cmake 工程构建

作者头像
bear_fish
发布2019-02-25 11:49:20
9870
发布2019-02-25 11:49:20
举报

本文主要说明下,**caffe**源码分析过程中的**cmake**(结合**IDE CLion**)工程构建问题。在分析**caffe**源码的过程中,我没有仅仅只是看代码,而是:

  1. 自己从头构建一遍工程,这样能让我更好的了解大型的项目的构建。当然原始的caffe的构建感觉还是比较复杂(主要是cmake),我这里仅仅使用cmake构建,而且简化点,当然最重要的是支持CLion直接运行调试。
  2. 从Blob文件开始从头开始复制每一个类,能够自行把没有个模块给运行起来,并编写对于的测试代码,这样更能加深自己的理解。

阅读源码最好要从头搭建工程,把每个模块运行起来,可以实现简单的功能,不是直接复制源代码的文件,走马观花的看下代码就行的(这样理解代码也不会深刻)。

整个工程的构建如下(**cmake**结合**IDE CLion**):


下面简要的给出三个模块的构建:

  1. cmake目录(包含FindGLog.cmake,FindOpenBLAS.cmake等),主要是获取第三方依赖的头文件以及lib文件。
  2. 整个工程的CMakeLists.txt,主要作用是使用1中的cmake获取相关的依赖给子目录、设置全局变量等。
  3. src生产libcaffe_lib.a并输出到lib目录下,main.cpp以及其他的test文件主要是测试每个类。

1. cmake目录

caffe的依赖较多,例如glog、protobuf、openblas、boost等,因此查找依赖的模块是每个单独的文件,以cmake为后缀。 下面简单给出FindOpencv.cmake,与FindGLog.cmake的内容。

FindOpencv.cmake内容很简单:

代码语言:javascript
复制
find_package(OpenCV REQUIRED)

message(in FindOpencv.cmake inc: ${OpenCV_INCLUDE_DIRS}, lib:${OpenCV_LIBS})

FindGLog.cmake的内容稍微复杂点:

代码语言:javascript
复制
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.h
        PATHS
        ${GLOG_ROOT_DIR}
        PATH_SUFFIXES
        src)

find_library(GLOG_LIBRARY glog libglog
        PATHS
        ${GLOG_ROOT_DIR}
        PATH_SUFFIXES
        .libs
        lib
        lib64)

find_package_handle_standard_args(GLOG DEFAULT_MSG
        GLOG_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)文件的路径。

代码语言:javascript
复制
# 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

内容如下:

代码语言:javascript
复制
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

内容如下:

代码语言:javascript
复制
project(caffe_lib)
set(CMAKE_CXX_STANDARD 11)

aux_source_directory(. SRC)

add_library(caffe_lib ${SRC})
set_target_properties(
        caffe_lib
        PROPERTIES
        ARCHIVE_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**的代码工程,可以评论留下你的邮箱,我给你发送过去.**

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年09月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. cmake目录
  • 2. 主CMakeLists.txt
  • 3. src CMakeLists.txt
  • caffe系列源码分析介绍
    • 1. caffe源码分析-cmake 工程构建:
      • 2. caffe的数据内存分配类SyncedMemory, 以及类Blob数据传输的媒介.
        • 3. caffe layer的源码分析,包括从整体上说明了layer类别以及其proto定义与核心函数.
          • 4. 数据输入层,主要是多线程+BlockingQueue的方式读取数据训练:
            • 5. IO处理例如读取proto文件转化为网络,以及网络参数的序列化
              • 6. 最后给出了使用纯C++结合多层感知机网络训练mnist的示例
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档