Mac下基於python3.7,Opencv4.01進行caffe編譯安裝


1 安裝依賴包
brew install -vd snappy leveldb gflags glog szip lmdb
brew install openblas
brew install hdf5 opencv
# boost 需要在後續配置中注意
brew install boost boost-python3

# 編譯protobuf3.7.0
cd protobuf-3.7.0
./autogen.sh
./configure
sudo make -j8
sudo make install -j8

2 下載caffe
git clone https://github.com/BVLC/caffe.git
cd caffe/
cp Makefile.config.example Makefile.config

3 配置文件
  • 配置使用opencv4

    ./include/caffe/common.hpp第70行後新增如下內容:

    // Supporting OpenCV4
    #if (CV_MAJOR_VERSION == 4)
    #define CV_LOAD_IMAGE_COLOR cv::IMREAD_COLOR
    #define CV_LOAD_IMAGE_GRAYSCALE cv::IMREAD_GRAYSCALE
    #endif
    
  • 配置Makefile.config

    # CPU-only switch (uncomment to build without GPU support).
    CPU_ONLY := 1
    
    # uncomment to disable IO dependencies and corresponding data layers
    USE_OPENCV := 0
    # USE_LEVELDB := 0
    # USE_LMDB := 0
    # This code is taken from https://github.com/sh1r0/caffe-android-lib
    USE_HDF5 := 1
    
    # Uncomment if you're using OpenCV 3
    OPENCV_VERSION := 4
    
    # open for OpenBlas
    BLAS := open
    
    # Homebrew puts openblas in a directory that is not on the standard 	search path
    BLAS_INCLUDE := $(shell brew --prefix openblas)/include
    BLAS_LIB := $(shell brew --prefix openblas)/lib
    
    # PYTHON_INCLUDE := 
    # 					/usr/local/lib/python2.7/site-packages/numpy/core/include
    
    # Uncomment to use Python 3 (default is Python 2)
    PYTHON_LIBRARIES := boost_python3 python3.7m
    PYTHON_INCLUDE := /usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/include/python3.7m \
    			/usr/local/lib/python3.7/site-packages/numpy/core/include/numpy
    
    # We need to be able to find libpythonX.X.so or .dylib.
    PYTHON_LIB := /usr/local/lib
    # Uncomment to support layers written in Python (will link against 	Python libs)
    WITH_PYTHON_LAYER := 1
    
    # Whatever else you find you need goes here.
    INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
    LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
    
    # N.B. both build and distribute dirs are cleared on `make clean`
    BUILD_DIR := build
    DISTRIBUTE_DIR := distribute
    
    # The ID of the GPU that 'make runtest' will use to run unit tests.
    TEST_GPUID := 0
    
    # enable pretty build (comment to see full commands)
    Q ?= @
    

4 預編譯
mkdir build
cd build
cmake ..
5 修改編譯後的文件配置
  • 修改CaffeConfig.cmake第53行

    set(Caffe_CPU_ONLY ON)
    
  • 修改CMakeCache.txt

    //Path to a program.
    PYTHON_EXECUTABLE:FILEPATH=/usr/local/bin/python3
    
    //Path to a file.
    PYTHON_INCLUDE_DIR:PATH=/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/include/python3.7m
    
    //Path to a library.
    PYTHON_LIBRARY:FILEPATH=/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/libpython3.7m.dylib
    
    //Flags used by the CXX compiler during all build types.
    CMAKE_CXX_FLAGS:STRING=-std=c++11
    
    //Boost python library (debug)
    Boost_PYTHON_LIBRARY_DEBUG:FILEPATH=/usr/local/Cellar/boost-python3/1.68.0/lib/libboost_python37-mt.dylib
      
    //Boost python library (release)
    Boost_PYTHON_LIBRARY_RELEASE:FILEPATH=/usr/local/Cellar/boost-python3/1.68.0/lib/libboost_python37-mt.dylib
      
    //Build Caffe without CUDA support
    CPU_ONLY:BOOL=ON
    
6 再編譯
cmake ..
sudo make all -j8
sudo make pycaffe -j8

7 問題
  • Could NOT find vecLib (missing: vecLib_INCLUDE_DIR)

    # 修改caffe下文件: cmake/Modules/FindvecLib.cmake  的Line 19修改爲
    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/
    
  • ld: symbol(s) not found for architecture x86_64

    cv::imread(cv::String const&, int)”, referenced from:
    caffe::WindowDataLayer::InternalThreadEntry() in window_data_layer.o
    caffe::WindowDataLayer::InternalThreadEntry() in window_data_layer.o
    caffe::ReadImageToCVMat(std::string const&, int, int, bool) in io.o
    “cv::imdecode(cv::_InputArray const&, int)”, referenced from:
    caffe::DecodeDatumToCVMat(caffe::Datum const&, int, int, bool) in io.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)[/plain]
    
    

    出現上述信息的原因是cv::imread是在opencv_imgcodecs中定義的,將-lopencv_imgcodecs在Linker Flags也加上即可,即在Makefile裏搜索pthread 把這個選項緊跟在後面。

  • No module named caffe

    vim ~/.bash_profile
    # 文件中添加
    export PYTHONPATH=~/caffe/python:$PYTHONPATH
    
    # 重啓
    source ~/.bash_profile
    
  • ModuleNotFoundError: No module named ‘google’

    pip3 install protobuf
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章