专栏首页用户2442861的专栏caffe源码分析-cmake 工程构建

caffe源码分析-cmake 工程构建

本文主要说明下,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内容很简单:

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.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)文件的路径。

# 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_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的代码工程,可以评论留下你的邮箱,我给你发送过去.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 再谈python中的多态

    以前写过一篇文章讲了一下python中的多态,最后得出结论python不支持多态,随着对python理解得加深,对python中得多态又有了一些看法。

    bear_fish
  • caffe源码分析-db, io

    主要内容: caffe源码分析-SyncedMemory caffe源码分析-Blob 其中Blob分析给出了其直接与opencv的图片相互转化以及操作,...

    bear_fish
  • Thrift 服务模型和序列化机制深入学习

    http://www.liuqianfei.com/article/065b0f1ee59a4cf0b94a84c4e33af127

    bear_fish
  • 漫画趣味图解云计算的起源

    用户1756920
  • ROS + Caffe 机器人操作系统框架和深度学习框架笔记 (機器人控制與人工智能)

    ROS + Caffe,这里以环境中物体识别为示例,机器人怎么知道环境里面有什么呢?

    zhangrelay
  • android6.0系统Healthd深入分析

    Healthd是android4.4之后提出来的一种中介模型,该模型向下监听来自底层的电池事件,向上传递电池数据信息给Framework层的BatterySer...

    233333
  • Python 实战TCP的客户端 - 胖子老板,再来一包烟

    client (肥仔白) -- "来包利群啦" --> server(胖子老板) client (肥仔白) <-- "给你啦" -- server(胖子老板)

    Devops海洋的渔夫
  • 渗透测试_利用Burp爆破用户名与密码

    burp 全称 Burp Suite, 是用于攻击web 应用程序的集成平台。它包含了许多工具,可以抓包可以爆破也可以扫描漏洞。

    飞天小子
  • 云成本管理方法论(三)——云优化管理之判定规则

    云优化管理四个管理维度中管理时点在通用管理模型基础上不需要额外补充,所以主要说明其他三个维度(管理对象、判定规则和管理措施)。另外,为了贴近我们熟悉的优化概念,...

    jancco
  • 受人脑功能启发的新型人工智能

    近年来,人工智能(AI)推动了高性能自动学习技术的发展。但是,这些技术通常是逐个任务应用的,这意味着为一个任务训练的智能代理在其他任务(甚至非常相似的任务)上的...

    AiTechYun

扫码关注云+社区

领取腾讯云代金券