2019年1月13日 星期日

Caffe安装 CPU版 (Ubuntu16.04,python3)

Step.1 安裝各種工具

安裝pip3
*Ubuntu 16.04內建python3.5沒有pip
sudo apt-get install python3-pip
安裝各種工具
# build-essential, vim, cmake, git, pkg-config
sudo apt-get install build-essential vim cmake git pkg-config


安裝亂七八糟的依賴項
# python3 modules (numpy, protobuf, skimage)
sudo pip3 install numpy
sudo pip3 install protobuf
sudo pip3 install skimage

# gflags, glog, lmdb
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

# boost
sudo apt-get install libboost-all-dev

# hdf5
sudo apt-get install libhdf5-dev

# protobuf
sudo apt-get install protobuf-compiler libprotobuf-dev

# blas
sudo apt-get install libblas-dev
sudo apt-get install libatlas-base-dev 
sudo apt-get install libopenblas-dev

# leveldb
sudo apt-get install libleveldb-dev

# snappy
sudo apt-get install libsnappy-dev


Step.2 安裝opencv3

git clone https://github.com/opencv/opencv
cd opencv
git checkout 3.4   #一定要切換到3.4版 不然後面編譯python時會出錯
mkdir build   #創建build資料夾
cd build   #切換到build資料夾
cmake ..   #開始編譯
make
sudo make install   #安裝編譯完的檔案
安裝完成



Step.3 安裝Caffe(CPU版)

這裡是各種坑的開始,開始填坑吧~~!

① 下載神人提供的Caffe

git clone https://github.com/BVLC/caffe


② 切換到caffe目錄,將Makefile.config.example複製並命名為Makefile.config

cd caffe
cp Makefile.config.example Makefile.config


③ 修改Makefile.config

*可以使用Ubuntu內建的gedit來開啟

以下是要修改的地方:

1.取消對 CPU_ONLY := 1 的註解 (我們是要編譯CPU版)


2.取消對 OPENCV_VERSION := 3 的註解


3.將Python2 改成 Python3(取消Python3的註解,並將Python2註解起來)


4.修改引用文件路徑 (HDF5的路徑問題)


給你複製啦!
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial


④開始編譯


*make後面接-j2 j是job的意思 2使用的執行續數量 依電腦狀況可以增加 當然越多速度越快(小心電腦當機)
*但是make的程序有些是有順序性的 使用多執行續容易出錯 在這裡建議make all使用即可

sudo make all -j2  
sudo make test
sudo make runtest

從這一步開始就會出現各種編譯錯誤
如果在編譯(make)時出現任何錯誤,一定要先clean掉(執行下面指令)再重新編譯,不然會一直出現同樣的錯誤(很重要!!)
sudo make clean


以下是可能遇到的錯誤及解決方法:


-------【Error 1."libopencv_core.so.3.3: cannot open shared object: …"】-------



解決方式 :
1.在 /etc/ld.so.conf 裡面加入一行 : /usr/local/lib

執行:
sudo gedit /etc/ld.so.conf
改成:
2.執行
sudo ldconfig

3.打開 /etc/bash.bashrc 文件
sudo gedit /etc/bash.bashrc

在文件最後加入兩行 :
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH




4.執行以下指令重啟設定即可重新編譯
source /etc/bash.bashrc

編譯成功


make all

make test

make runtest

如果都有出現以上畫面,恭喜你!!!
你的Caffa已經成功編譯了,可以開始以用
如果想要使用python接口的話再繼續往下看

Step.4 編譯python接口

① 安裝fortran編輯器(gfrotran)

等等安裝scipy庫時會用到它
sudo apt-get install gfortran


② 安裝python接口需要的函式庫

在caffe/python資料夾內會找到一個requirements.txt的文件檔
裡面會寫有所有需要的安式庫
可以打開對照著使用pip3安裝
也可以使用以下指令一次性安裝
cd ~/caffe/python
for req in $(cat requirements.txt);do sudo  pip3 install $req; done

安裝完成後還可以再使用以下指令再確認一次,
sudo pip3 install -r requirements.txt
如果安裝成功的會顯示Requirement already satisfied。沒安裝成功的,則會重新安裝

③ 將caffe/python加到環境變數

1.執行
sudo ldconfig

2.編輯配置文件~/.bashrc
打開~/.bashrc文件
sudo gedit ~/.bashrc
在文件最面添加
export PYTHONPATH=/home/joshua/caffe/python:$PYTHONPATH
*這裡的位置是根據caffe的安裝位置,每個人會有所不同

3.執行以下指令使設定生效
source ~/.bashrc
*有時候更新設定可能不會生效,可以重開電腦解決


④開始編譯python接口

cd ~/caffe/
sudo make pycaffe
編譯完成


⑤驗證python接口

輸入python3進入ptyhon
輸入
import caffe
如果成功還不能確定安裝完成
再輸入
from caffe import layers as L
如果都沒出現錯誤的話,恭喜你!!!
可以開始使用python接口的caffe了!!!



接下來是整理一些編譯pycaffe會遇到的錯誤:


-------【Error1. pip3的bug  (步驟②)】-------


這應該是在第②步,安裝python函式庫的時候會遇到的問題
這是一個非常麻煩的bug
可以從錯誤中看到是"/usr/share/python-wheels/pkg_resources-0.0.0-py2.py3-none-any.whl/pkg_resources/__init__.py"這一個檔案出了問題
照理來說只要修改這個檔案就可以修復這個bug
但是麻煩的是他是在系統內的檔案,所以必須使用系統管理員來開啟
而且"/usr/share/python-wheels/pkg_resources-0.0.0-py2.py3-none-any.whl"是個壓縮檔
所以沒辦法在終端機使用指令直接找到裡面的文件

解決方法如下:
1.輸入以下指令以系統管理員開啟檔案總管
sudo nautilus

2.找到"/usr/share/python-wheels/pkg_resources-0.0.0-py2.py3-none-any.whl"壓縮檔

3.打開壓縮檔並找到"/pkg_resources/__init__.py"檔案
4.開啟"__init__.py"並找到下面紅框的地方
*如果使用gedit的人可以用Ctrl+F,並輸入orig_path來尋找

5.修改程式碼為
#orig_path.sort(key=position_in_sys_path)
#module.__path__[:] = [_normalize_cached(p) for p in orig_path]
orig_path_t = list(orig_path)
orig_path_t.sort(key=position_in_sys_path)
module.__path__[:] = [_normalize_cached(p) for p in orig_path_t]
*python的縮排是4個空白,在gedit中Tab鍵的預設是8個空白,這裡要注意一下

6.儲存並更新壓縮檔
結束後再重新執行一次步驟②,應該就能夠順利執行了


-------【Error2. /usr/bin/ld: 找不到 -lbppst_python3  (步驟④)】-------


這是在Ubuntu中常見的錯誤,就是找不到對應的lib文件,通常是檔名沒有統一
解決方法就是切換到"/usr/lib/x86_64-linux-gnu/"
並建立一個對應檔名的連接檔案

如下:
cd /usr/lib/x86_64-linux-gnu/
sudo ln -s libboost_python-py35.so libboost_python3.so

建立完再切換回caffe的資料夾並重新編譯即可


-------【Error3. import caffe時出錯 (步驟⑤)】-------

這是ptyhon套件matplotlib出錯
輸入以下指令更新套件即可
sudo pip3 install matplotlib --upgrade


-------【Error4. ImportError: cannot import name '_validate_lengths' (步驟⑤)】-------

這個錯誤是因為skimage這個套件需要使用numpy
可是由於numpy持續更新使得語法已經改變了
解決方法如下:
1.輸入以下指令開啟skimage套件中的"arraycrop.py"檔案
sudo gedit /usr/local/lib/python3.5/dist-packages/skimage/util/arraycrop.py
2.修改Import的方式如下:
from distutils.version import LooseVersion as Version
old_numpy = Version(np.__version__) < Version('1.16')
if old_numpy:
    from numpy.lib.arraypad import _validate_lengths
else:
    from numpy.lib.arraypad import _as_pairs


3.儲存並關閉





參考資料

caffe安裝:
https://blog.csdn.net/g11d111/article/details/78141202  http://darren1231.pixnet.net/blog/post/328046349-setup_caffe https://blog.csdn.net/u010193446/article/details/53259294

 OpenCV安裝:
https://www.pyimagesearch.com/2015/07/20/install-opencv-3-0-and-python-3-4-on-ubuntu/

hdf5.h路徑錯誤問題:
https://blog.csdn.net/windows_peng/article/details/53706987 https://blog.csdn.net/MD_learning/article/details/53185992

 OpenCV編譯錯誤(cannot open shared object): https://blog.csdn.net/CV_YOU/article/details/77341631

 Ubuntu 以root的身分開啟檔案總管:
https://blog.xuite.net/yh96301/blog/247012131-Ubuntu+14.04%E4%BB%A5root%E7%9A%84%E8%BA%AB%E5%88%86%E9%96%8B%E5%95%9F%E6%AA%94%E6%A1%88%E7%B8%BD%E7%AE%A1

 pip3 bug修復:
https://stackoverflow.com/questions/47955397/pip3-error-namespacepath-object-has-no-attribute-sort

 /usr/bin/ld: cannot find -l**** 解決方法:
https://blog.csdn.net/yingyujianmo/article/details/49634511

skimage bug修復:
https://github.com/scikit-image/scikit-image/pull/3556