1. 程式人生 > >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 原始碼分析主要內容如下:

自己從頭構建一遍工程,這樣能讓我更好的瞭解大型的專案的構建。當然原始的caffe的構建感覺還是比較複雜(主要是cmake),我這裡僅僅使用cmake構建,而且簡化點,當然最重要的是支援CLion直接執行除錯(如果需要這個工程可以評論留下你的郵箱,我給你傳送過去)。

這裡寫圖片描述

2. caffe的資料記憶體分配類SyncedMemory, 以及類Blob資料傳輸的媒介.

主要內容:
caffe原始碼分析-SyncedMemory
caffe原始碼分析-Blob
其中Blob分析給出了其直接與opencv的圖片相互轉化以及操作,可以使得我們更好的理解Blob.

3. caffe layer的原始碼分析,包括從整體上說明了layer類別以及其proto定義與核心函式.

首先分析了最簡單的layer Relu,然後在是inner_product_layer全連線層, 最後是layer_factorycaffe中 以此工廠模式create各種Layer.

4. 資料輸入層,主要是多執行緒+BlockingQueue的方式讀取資料訓練:
5. IO處理例如讀取proto檔案轉化為網路,以及網路引數的序列化
6. 最後給出了使用純C++結合多層感知機網路訓練mnist的示例

內容如下:

類似與caffe一樣按照layer、solver、loss、net等模組構建的神經網路實現可以見下面這篇blog,相信看懂了這個python的程式碼理解caffe框架會更簡單點.

最後如果需要cmake + CLion直接執行除錯caffe的程式碼工程,可以評論留下你的郵箱,我給你傳送過去.