如何在樹莓派使用NCS神經運算棒

維基百科對於Edge computing(邊緣運算)這個名詞的定義是這樣的:

一種分散式運算的架構,將應用程式、數據資料與服務的運算,由網路中心節點,移往網路邏輯上的邊緣節點來處理[1]。邊緣運算將原本完全由中心節點處理大型服務加以分解,切割成更小與更容易管理的部份,分散到邊緣節點去處理。邊緣節點更接近於用戶終端裝置,可以加快資料的處理與傳送速度,減少延遲。在這種架構下,資料的分析與知識的產生,更接近於數據資料的來源,因此更適合處理大數據。

維基的解釋似乎專業又繞口,但邊緣運算其實有個重要特點:事多錢少離家近。事多錢少指的是它們的工作類型單純卻又繁忙,多為過濾資料或進行初步計算分析的工作,但隨時得面對突如其來的資料而不得休息。離家近,則是指邊緣運算多位於最接近資料產生來源的附近,以便就近即時處理。

換而言之,邊緣運算是位於那些最接近資料來源的小型計算中心,主要功能在於收集、儲存、過濾、擷取、簡單的運算,將處理過的資料與雲端系統進行有效率的交換。原本單純的雲端在加入了邊緣計算後,整個系統將變得更加的即時,彈性,且更具效率。

其架構如下圖所示。


https://www.solwaycomms.com/edge-computing/

以樹莓派來說,其硬體配備作為傳統的IoT邊緣運算中心是相當適合的,不過隨著AI浪潮的興起,巨量的資料以及大量的前處理需求,使得樹莓派這類的微型電腦力有未逮,此時便需要擴充其運算能力才能處理圖片或影像等大量且複雜的維度運算,Intel的Neural Compute Stick便因應此需求而生,號稱每秒運行1000億次浮點運算(GFLOPS) 可作為Deep learning on the Edge。

Intel Neural Compute Stick介紹

Intel的Neural Compute Stick(以下簡稱為NCS)是2006年收購Movidius後所推出的產品,第一代NCS甫推出便受到高度矚目,被視為AI edge computing推理運算的最佳接班人。第二代甫於今年底推出,其效能如下圖官網所示,執行Image classification及Object Detection的效能分別較第一代高了五倍與四倍。

https://www.xfastest.com/data/attachment/forum/201811/14/185249cpazqmdhnggvdgph.jpg

一代NCS與二代

如果你迫不急待的買了甫推出的Intel Neural Compute Stick 2,興緻沖沖的插到樹莓派上準備安裝使用,奉勸你可以暫時先死了這條心,因為新版的二代NCS尚不支援樹莓派:

OpenVINO NCSDK 1.X NCSDK 2.X
NCS一代 X O O
NCS二代 O X X
ARM platform X O O
Intel platform O O O

第一代的NCS搭配的是NCSDK,而第二代搭配的是Intel全新推出的OpenVINO,第一代NCS僅能使用NCSDK無法使用最新的OpenVINO,第二代NCS僅僅支援OpenVINO不支援NCSDK,此外新推出的OpenVINO也不支援ARM CPU,因此導致二代NCS無法在樹莓派ARM處理器上使用。

這是新舊兩代版本的NCS外觀,上方為二代,下方為一代。二代突顯了Intel的名稱而且己經見不到Movidius的名稱,此外,第一代made in USA,而第二代made in China。

由於最新版NCS二代並不支援ARM CPU的樹莓派(目前僅支援Intel系列),故本文仍是以一代NCS為範例,示範如何在PC端compiler NCS所需要的Graph檔之後放置於樹莓派上執行。

NCS的環境可分為兩部分:compiler端和edge端,compiler多為PC主機,將訓練好的Caffe或TensorFlow模型compiler成NCS可以執行的graph檔,edge端則為另一台PC或更小型的微電腦如樹莓派等,載入graph在NCS上執行。下文介紹如何建置及使用PC端的compiler和edge端的樹莓派環境。

Complier環境建置

負責轉檔的PC環境並不需要Neural Compute Stick,只要安裝NCSDK(Intel® Movidius™ Neural Compute SDK)即可,如果您想在stick上run看看各種範例模型,可下載NC App Zoo(Neural Compute Application Zoo),裏面有Tensorflow、Caffe、YOLO等數十種模型範例及使用說明。

  1. 操作環境:Ubuntu 16.04.10
  2. 可選擇下載安裝1.x或最新的2.x版NCSDK

NCSDK 1.x版

git clone https://github.com/movidius/ncsdk.git

NCSDK 2.x版

git clone -b ncsdk2 https://github.com/movidius/ncsdk.git

  1. 安裝:sudo make install

成功完成後的畫面:

也可以在/usr/local/bin        下找到mvNCCompile的執行檔

ps. 如果您在Ubuntu安裝時出現如下的error:

Your current combination of Linux distribution and distribution version is not officially supported! Error on line 42.  Will exit

make: *** [Makefile:48: install] Error 1

請修改ncsdk/install.sh,將此行的1604

if [ “${OS_DISTRO,,}" = “ubuntu" ] && [ ${OS_VERSION} = 1604 ]; then

修改為你目前使用的版本(忘了請輸入:cat /etc/*release)再sudo make install即可。不過,最新的Ubuntu 18.X版在安裝時似乎裝不起來,建議用舊的版本。

Edge端環境建置及設定

首先,下載安裝好最新版的Raspbian OS,再將Neural Compute Stick插到樹莓派後開機。

  1. 先安裝下列套件:(您可將下列內容放置於shell檔中一次執行比較方便)

sudo apt-get update

sudo apt-get upgrade –y

sudo apt install python-pip python3-pip

sudo apt-get install -y libusb-1.0-0-dev libprotobuf-dev

sudo apt-get install -y libleveldb-dev libsnappy-dev

sudo apt-get install -y libopencv-dev

sudo apt-get install -y libhdf5-serial-dev protobuf-compiler

sudo apt-get install -y libatlas-base-dev git automake

sudo apt-get install -y byacc lsb-release cmake

sudo apt-get install -y libgflags-dev libgoogle-glog-dev

sudo apt-get install -y liblmdb-dev swig3.0 graphviz

sudo apt-get install -y libxslt-dev libxml2-dev

sudo apt-get install -y gfortran

sudo apt-get install -y python3-dev python-pip python3-pip

sudo apt-get install -y python3-setuptools python3-markdown

sudo apt-get install -y python3-pillow python3-yaml python3-pygraphviz

sudo apt-get install -y python3-h5py python3-nose python3-lxml

sudo apt-get install -y python3-matplotlib python3-numpy

sudo apt-get install -y python3-protobuf python3-dateutil

sudo apt-get install -y python3-skimage python3-scipy

sudo apt-get install -y python3-six python3-networkx

sudo pip3 install opencv_contrib_python

sudo apt-get install -y libatlas-base-dev

sudo apt-get install -y libjasper-dev

sudo apt-get install -y libqtgui4

sudo apt-get install -y libqt4-test

sudo apt-get install -y python3-pyqt5

sudo pip3 install imutils

sudo apt install -y cython

sudo -H pip3 install cython

sudo -H pip3 install numpy

sudo -H pip3 install pillow

sudo pip3 uninstall tensorflow

wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.7.0/tensorflow-1.7.0-cp35-none-linux_armv7l.whl

sudo pip3 install tensorflow-1.7.0-cp35-none-linux_armv7l.whl

rm tensorflow-1.7.0-cp35-none-linux_armv7l.whl

確認OpenCV及Tensorflow的安裝是否完成:

python3

>>> import cv2

>>> import tensorflow

  1. 加大swap size:

sudo nano /etc/dphys-swapfile

將CONF_SWAPSIZE由預設的100(MB)增加為1024(MB)以上。接著重啟dphys-swapfile service。

sudo /etc/init.d/dphys-swapfile restart

  1. cd ~; git clone -b ncsdk2 http://github.com/Movidius/ncsdk

cd ncsdk/

nano ncsdk.conf → 將#MAKE_NJOBS=1前方的mark #移除

sudo make install

之後,會看到如下方的訊息,即安裝完成。

修改sudo nano /etc/dphys-swapfile

將CONF_SWAPSIZE還原為預設的100(MB)再重啟dphys-swapfile service。

sudo /etc/init.d/dphys-swapfile restart

  1. 可選擇下載安裝1.x或最新的2.x版NCSDK

NCSDK 1.x版

git clone https://github.com/movidius/ncsdk.git

NCSDK 2.x版

git clone -b ncsdk2 https://github.com/movidius/ncsdk.git

  1. 安裝:sudo make install

這個install的過程在樹莓派上相當久,約需要 2-3小時。

  1. 測試是否work

cd ~/ncsdk/examples/apps/hello_ncs_py/

make run

各種model使用範例

NCSDK的examples

NCSDK 2.X的examples目錄下提供了以下的範例:

apps/ → 基本的測試程式hello_ncs_cpp及hello_ncs_py

caffe/ → ALexNet、GoogLeNet、SquuzeNet

tensorflow/ → inception_v1、inception_v3

這幾個example經測試可直接在樹莓派上complier出graph檔並執行,並不需要另外在PC上compiler。例如下方為樹莓派上compiler及執行Inception V3範例。

(make run)

pi@pos:~/ncsdk/examples/tensorflow/inception_v3 $ make run

test -f output/inception-v3.meta || ((wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz && tar zxf inception_v3_2016_08_28.tar.gz && rm inception_v3_2016_08_28.tar.gz) && ./inception-v3.py)

–2018-12-22 16:00:07–  http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz

正在查找主機 download.tensorflow.org (download.tensorflow.org)… 172.217.160.112, 2404:6800:4012:1::2010

正在連接 download.tensorflow.org (download.tensorflow.org)|172.217.160.112|:80… 連上了。

已送出 HTTP 要求,正在等候回應… 200 OK

長度: 100885009 (96M) [application/x-tar]

Saving to: ‘inception_v3_2016_08_28.tar.gz’

inception_v3_2016_0 100%[===================>]  96.21M   813KB/s    in 6m 21s

2018-12-22 16:06:28 (259 KB/s) – ‘inception_v3_2016_08_28.tar.gz’ saved [100885009/100885009]

/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: compiletime version 3.4 of module ‘tensorflow.python.framework.fast_tensor_util’ does not match runtime version 3.5

return f(*args, **kwds)

/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: builtins.type size changed, may indicate binary incompatibility. Expected 432, got 412

return f(*args, **kwds)

/usr/lib/python3/dist-packages/h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.

from ._conv import register_converters as _register_converters

test -f graph || mvNCCompile –new-parser -s 4 output/inception-v3.meta -in=input -on=InceptionV3/Predictions/Reshape_1

/usr/lib/python3/dist-packages/scipy/_lib/_numpy_compat.py:10: DeprecationWarning: Importing from numpy.testing.nosetester is deprecated, import from numpy.testing instead.

from numpy.testing.nosetester import import_nose

/usr/lib/python3/dist-packages/scipy/stats/morestats.py:16: DeprecationWarning: Importing from numpy.testing.decorators is deprecated, import from numpy.testing instead.

from numpy.testing.decorators import setastest

/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: compiletime version 3.4 of module ‘tensorflow.python.framework.fast_tensor_util’ does not match runtime version 3.5

return f(*args, **kwds)

/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: builtins.type size changed, may indicate binary incompatibility. Expected 432, got 412

return f(*args, **kwds)

/usr/local/bin/ncsdk/Controllers/Parsers/TensorFlowParser/Convolution.py:46: SyntaxWarning: assertion is always true, perhaps remove parentheses?

assert(False, “Layer type not supported by Convolution: " + obj.type)

/usr/local/bin/ncsdk/Controllers/Parsers/Phases.py:322: SyntaxWarning: assertion is always true, perhaps remove parentheses?

assert(len(pred) == 1, “Slice not supported to have >1 predecessors")

mvNCCompile v02.00, Copyright @ Intel Corporation 2017

****** Info: No Weights provided. inferred path: output/inception-v3.data-00000-of-00001******

output/inception-v3.meta

output tensor shape (1, 1, 1, 1001)

Fusing DeptwiseConv + Pointwise Convolution into plain Convolution

Fusing Add and Batch after Convolution

Fusing Pad and Convolution2D

Fusing BatchNorm and Scale after Convolution

Replacing BN with Bias&Scale

Fusing Permute and Flatten

Fusing Eltwise and Relu

Eliminate layers that have been parsed as NoOp

Evaluating input and weigths for each hw layer

————————————–

———————-

———————-

# Network Input tensors [‘input:0#327’]

# Network Output tensors [‘InceptionV3/Predictions/Reshape_1:0#653’]

Blob generated

./run.py

Number of categories: 1001

Start download to NCS…

/usr/local/lib/python3.5/dist-packages/mvnc/mvncapi.py:416: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead

tensor = numpy.fromstring(tensor.raw, dtype=numpy.float32)

*******************************************************************************

inception-v3 on NCS

*******************************************************************************

547 electric guitar 0.98828125

403 acoustic guitar 0.007789612

715 pick, plectrum, plectron 0.0015392303

421 banjo 0.00095939636

820 stage 0.00069093704

*******************************************************************************

Finished

NCAPPZOO

for NCSDK V1:git clone https://github.com/movidius/ncappzoo.git

for NCSDK V2:git clone -b ncsdk2 https://github.com/movidius/ncappzoo.git

不像NCSDK的examples,NCAPPZOO的範例大部份須先在PC端compiler,再將檔案copy回樹莓派上執行。如果不確定,您可以在樹莓派各model目錄下先執行make run試看看。

Example: AgeNet

以AgeNet為例,該model無法直接在樹莓派compiler,必須在PC端compiler之後,再將需要的檔案放置於樹莓派端來執行。

PC端:

  1. cd ~/ncappzoo/caffe/AgeNet
  2. sudo make
  3. 將這兩個檔案:

~/ncappzoo/caffe/AgeNet/graph

~/ncappzoo/data/age_gender/ilsvrc_2012_mean.npy

copy到樹莓派的~/ncappzoo/caffe/AgeNet/

樹莓派端:

  1. cd ~/ncappzoo/caffe/AgeNet
  2. 修改run.py,修改ilsvrc_2012_mean.npy的path如下:

ilsvrc_mean = numpy.load(EXAMPLES_BASE_DIR+’ilsvrc_2012_mean.npy’).mean(1).mean(1)

  1. python3 run.py 執行看看

程式會自動下載此圖檔,並預測其年齡。

——- predictions ——–

the age range is 25-32 with confidence of 99.9%

Example: Tiny YOLO V2

Tiny YOLO V2為NCSDK V2新增支援的模型,同樣無法直接在樹莓派compiler,請依照下方步驟來執行。

PC端:

  1. cd ~/ncappzoo/tensorflow/tony_yolo_v2
  2. sudo make
  3. 將目錄下所產生的tiny_yolo_v2.graph拷貝到樹莓派相同路徑下(~/ncappzoo/tensorflow/tony_yolo_v2)。

樹莓派端:

  1. cd ~/ncappzoo/tensorflow/tony_yolo_v2
  2. python3 run.py

chair 252.95474672600892 233.27657267046558 560.7038196196356 661.3331978559199

Example: Facenet

先在PC端compiler產生graph檔之後,放置於樹莓派端,就可以在樹莓派上體驗快速的人臉辨識了! NCSDK所收錄的這個model改自https://github.com/davidsandberg/facenet,作者使用Inception ResNet v1作為Facenet提取特徵的模型,並提供了兩種Pre-trained models分別用CASIA-WebFace及VGGFace2 datasets所訓練,不過在您下make指令時自動下載的pre-trained model版本是較舊的20170512-110547.zip。

PC端:

  1. cd ~/ncappzoo/tensorflow/facenet
  2. sudo make
  3. 將目錄下所產生的facenet_celeb_ncs.graph拷貝到樹莓派相同路徑下(~/ncappzoo/tensorflow/facenet)。

樹莓派端:

  1. cd ~/ncappzoo/tensorflow/facenet
  2. python3 run.py