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.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_factory
caffe中 以此工廠模式create各種Layer.
4. 資料輸入層,主要是多執行緒+BlockingQueue的方式讀取資料訓練:
5. IO處理例如讀取proto檔案轉化為網路,以及網路引數的序列化
6. 最後給出了使用純C++結合多層感知機網路訓練mnist的示例
內容如下:
類似與caffe
一樣按照layer、solver、loss、net
等模組構建的神經網路實現可以見下面這篇blog,相信看懂了這個python的程式碼理解caffe框架會更簡單點.
最後如果需要cmake
+ CLion
直接執行除錯caffe
的程式碼工程,可以評論留下你的郵箱,我給你傳送過去.