Category Archives: Intel Movidius

[課程紀錄文] 2018.8.13-14-跟著CAVEDU學AI人工智慧:一堂結合機器學習中的影像辨識及邊緣運算的深度課程

記錄

宗諭

攝影

吉弘

講師

吉弘、豐智

上課地點台灣微軟大樓
課程時間

2018年8月13-14日

8月13至14日,一場AI人工智慧的深度學習課程,在台灣微軟大樓展開⋯⋯。

 

然而,早在課程開始前的一個月,CAVEDU教育團隊這邊的兩位講師:「阿吉老師」曾吉弘與徐豐智,以及與此次課程的相關人員,便已針對這門課程展開緊鑼密鼓地準備。從剛開始針對課程內容進行深入研究、討論;至中期的針對「Microsoft Azure DSVM資料科學虛擬機器」持續調整、設定,並且訓練模型;最後一週與課程各單位間的持續溝通、協調、聯繫,針對上課要使用的RK Car不斷調測,設計、印刷試跑RK Car需用的道路地墊⋯⋯等等。可以說,CAVEDU教育團隊真是為這次課程卯足全勁了!

 

課程的結果也是十分甜美。根據微軟方面人員的統計,參與課程21位學員的AI AGV車皆成功跑車,一個步驟都沒有漏掉。而微軟方面亦十分肯定CAVEDU教育團隊,在這次課程中展現出的專業能力

圖1 講師之一「阿吉老師」曾吉弘

 

圖2 另外一位講師徐豐智(中著紅衣者)

 

回到這門課程,究竟教授給學員的是什麼呢?

 

課程的設計是屬於實務導向,簡而言之,就是訓練無人車達成路牌辨識的目標,等學員訓練好模型後,再至CAVEDU教育團隊設計、製作的地墊上試跑。

圖3 學員讓RK Car在CAVEDU製作的道路地墊上試跑

 

我們運用什麼工具訓練模型呢?答案是微軟的Azure DSVM資料科學虛擬機器。Azure DSVM是一種雲端服務,透過常用於資料分析、機器學習服務及AI訓練的數個熱門工具,預先安裝、設定及測試的Azure虛擬機器映像。

圖4 資料蒐集並訓練模型

 

下圖是課程中使用的無人載具RK Car,車子由CAVEDU教育團隊自造,以Raspberry Pi單板電腦為核心。RK Car上藍色的是Intel Movidius神經運算棒,阿吉老師有向學員們展示Intel的AI模型,透過Movidius的加速,針對道路上各種車輛進行分類,以及街景影像的辨識,例如街道上的人、車牌、摩托車⋯⋯等等。透過Intel Movidius,能使硬體等級沒有非常高的Raspberry Pi單板電腦,以更快速度進行影像辨識。(若欲購買RK Car,請洽機器人王國商城。)

圖5 安裝上Intel Movidius神經運算棒的RK Car

 

下圖是學員們跑車的情況。每位學員的無人載具皆需學會辨識左轉、右轉、停止標示,才能成功完成道路地墊上的試跑。在阿吉老師、豐智及助教的悉心準備、指導下,所有學員皆跑車大成功!

圖6 所有學員順利完成跑車

 

對CAVEDU教育團隊而言,這次課程使我們在AI人工智慧領域又邁進一步。之前我們較著重在「邊緣運算」,也就是將應用程式、資料及服務的運算,由網路中心節點移至網路邏輯上的邊緣節點進行處理。

 

這次,我們實作了機器學習中的影像辨識,並整合剛剛提及的邊緣運算,成功達成一次AI實務的軟硬整合課程。套一句阿吉老師的課後感言:「我想,我們應是最先推出AI實務軟硬整合課程的團隊吧。」歡迎跟著我們一起成長、一起學習AI,微軟將繼續於9月份、10月開課,歡迎點此報名

 

最後,播放一段輪型機器人視角的跑車影片,給各位讀者欣賞。

 

相關文章

[Movidius神經運算棒] 認識與操作Neural Compute SDK:mvNCCheck

作者/攝影曾吉弘
文章分類教學(翻譯)
時間3小時
成本
難度******   (1~10)
材料表
  • Raspberry Pi 3單板電腦
  • Intel Movidius神經計算棒

(Original post from Intel Movidius NCS blog: “Using and Understanding the Neural Compute SDK: mvNCCheck”:https://movidius.github.io/blog/mvNCCheck/

 

Neural Compute SDK Toolkit: mvNCCheck

Intel® Movidius™ 神經運算軟體開發套件(Neural Compute Software Development Kit,NCSDK)包含三套工具,用於幫助使用者順利上手,操作Intel® Movidius™ 神經運算棒(Intel® Movidius™ NCS)。這些工具包含:mvNCCheck,mvNCCompile及mvNCProfile。本文將幫助您更認識mvNCCheck工具程式的運作方式,以及如何將它整合至Neural Compute SDK的整體工作流程中。

圖1

 

使用mvNCCheck的網路會有怎樣的效果呢?

您將學到:

  • 如何使用mvNCCheck tool
  • 如何解釋mvNCCheck的輸出結果

 

您會需要:

  • Intel Movidius Neural Compute Stick 神經運算棒 – 購買請按我
  • 執行Ubuntu 16.04的 x86_64 筆記型電腦

 

如果尚未做過的話,請在您的開發電腦上安裝NCSDK。安裝步驟請參考Intel Movidius NCS Quick Start GuideCAVEDU的Intel Movidius相關文章

 

檢查網路

Step 1:開啟terminal,切換至ncsdk/examples/caffe/GoogLeNet目錄下

Step 2:使用mvNCCheck 來使Intel Movidius NCS上的網路生效。

mvNCCheck deploy.prototxt -w bvlc_googlenet.caffemodel

 

Step 3:完成了!您應該會看到類似下面的畫面訊息:

USB: Myriad Connection Closing.
USB: Myriad Connection Closed.
Result:  (1000,)
1) 885 0.3015
2) 911 0.05157
3) 904 0.04227
4) 700 0.03424
5) 794 0.03265
Expected:  (1000,)
1) 885 0.3015
2) 911 0.0518
3) 904 0.0417
4) 700 0.03415
5) 794 0.0325
------------------------------------------------------------
 Obtained values 
------------------------------------------------------------
 Obtained Min Pixel Accuracy: 0.1923076924867928% (max allowed=2%), Pass
 Obtained Average Pixel Accuracy: 0.004342026295489632% (max allowed=1%), Pass
 Obtained Percentage of wrong values: 0.0% (max allowed=0%), Pass
 Obtained Pixel-wise L2 error: 0.010001560141939479% (max allowed=1%), Pass
 Obtained Global Sum Difference: 0.013091802597045898
------------------------------------------------------------

 

mvNCCheck的功能為何,為何要用到它?

作為NCSDK的一部分,mvNCCheck提供以下三項主要功能:

  • 確保資料從fp32轉為fp16時的正確性
  • 快速確認指定網路是否相容於Intel NCS
  • 對網路各層進行快速除錯

 

確保結果的準確性

為確保結果的正確性,mvNCCheck會比較Intel Movidius NCS 與網路原生框架(Caffe/TensorFlow™)兩者間的推論結果。由於Intel Movidius NCS與NCSDK採用16-bit 浮點數資料,因此必須將收進來的32-bit浮點數資料轉為16-bit。fp32/fp16的轉換過程可能在推論結果中產生minor rounding的問題,這時候mvNCCheck工具程式就很好用了,它可檢查您所使用的網路是否產生正確的結果。

 

首先,mvNCCheck工具程式會讀取網路,並將模型轉換為Intel Movidius NCS可用的格式。接著它會在Intel Movidius NCS上使用網路來推論,也會用網路原生框架(Caffe/TensorFlow)來執行推論。

 

最後,mvNCCheck 會產生一份簡易的報表,比較Intel Movidius NCS與網路原生框架兩者的推論結果。這些結果可用於確認某個神經網路在fp32/fp16轉換後,是否還能產生一定正確性以上的結果。比較結果接下來會詳細討論。

 

判斷網路與Intel Movidius NCS的相容性

mvNCCheck也可用於檢查某個網路是否相容於Intel Movidius NCS。有蠻多原因都會造神經網路與Intel Movidius NCS不相容,其中包括(但不限於)記憶體限制、不支援的層或不支援的神經網路架構。若想了解更多原因,請參考 Intel Movidius NCS documentation website 上關於TensorFlow與Caffe框架的說明。另外,最新的 NCSDK Release Notes也會說明關於SDK的勘誤與最新功能⋯⋯等等。

 

使用mvNCCheck對網路進行偵錯

若您的網路執行不如預期,可運用mvNCCheck來對網路偵錯,只要執行 mvNCCheck 時加上 -in-on 選項即可。

  • -in 選項可讓您將某個節點指定為輸入節點
  • -on 選項可讓您將某個節點指定為輸出節點

使用mvNCCheck並搭配 -in-on 參數,透過逐層分析或二元搜尋分析,比較Intel NCS 與Caffe/TensorFlow的結果,這樣便有機會找出發生錯誤/差異的層。

 

偵錯範例:

假設您的網路架構如下:

  • Input – Data
  • conv1 – Convolution Layer(卷積層)
  • pooling1 – Pooling Layer(池化層)
  • conv2 – Convolution Layer(卷積層)
  • pooling2 – Pooling Layer(池化層)
  • Softmax – Softmax

假設您執行mvNCCheck所取得的結果為nan(並非數字)。請用以下指令搭配 -on  選項來檢查第一卷積層(Convolution layer) “conv1” 的輸出結果:

mvNCCheck user_network -w user_weights -in input -on conv1 

 

若是較大的網路時,使用二元搜尋法將有助於降低找到發生問題的那一層所需的時間。

 

理解mvNCCheck的輸出結果

圖2

 

來看看上述 mvNCCheck 輸出所代表的意義:

  • 綠色方框為Intel NCS的前五項推論結果
  • 紅色方框為原生框架(可能是Caffe或TensorFlow)的前五項推論結果
  • 藍色方框是兩者推論結果的各項比較結果

若想要深入理解這些結果,我們得先了解Intel Movidius NCS與Caffe/TensorFlow的輸出都是儲存在一個tensor中(tensor 要簡單定義的話,就是一個值的陣列)。五項測試都是兩個tensor間的數學性比較。

 

名詞解釋:

  • ACTUAL – 神經運算棒的tensor輸出
  • EXPECTED– 框架(Caffe或TensorFlow)的 tensor 輸出
  • Abs – 計算絕對值
  • Max – 計算一個(或多個)tensor的最大值
  • Sqrt – 計算某數值的平方根
  • Sum – 計算某數值的加總

 

 

最小像素正確度(Min Pixel Accuracy):

本數值代表兩個輸出tensor值之間的最大誤差。

圖3

 

平均像素正確度(Average Pixel Accuracy):

兩個 tensor 數值的均差。

圖4

 

錯誤值百分比:

本數值代表Intel Movidius NCS的tensor值,與框架tensor間的誤差是否超過 2%。

圖5

 

為什麼是2%?這個閾值設定扣掉了來自fp32/fp16轉換後的精度降低的影響程度。

 

Pixel-wise L2 error:

本數值代表整個輸出tensor的約略相對誤差。

圖6

 

將差異加總起來:

將Intel Movidius NCS tensor與框架tensor之間的所有差異加總起來。

圖7

 

沒有輸入的話,mvNCCheck如何進行推論?

在神經網路中進行向前傳遞時,常見的作法是以一個tensor或一個數值陣列作為輸入。如果未指令輸入的話,mvNCCheck使用範圍在 -1 至 1之間的隨機浮點數作為輸入tensor。只要在圖像路徑後加上 “-i” 參數,也可將讓 mvNCCheck 接受圖像輸入。

 

可能發生的錯誤與解決方法

若執行 mvNCCheck 但網路發生錯誤時,可能原因如下:

 

輸入值縮放

某些神經網路要求輸入值得先被縮放(scale)調整過。若輸入未經縮放的話,可能造成Intel Movidius NCS與網路原生框架的推論結論不一致的狀況。

 

使用 mvNCCheck 時,可用–S選項來指定用於縮放輸入值的除數。圖像通常以每個顏色通道數值範圍介於 0 到 255 間的方式儲存。若有個神經網路需要輸入值介於 0.0 到 1.0 之間,請用–S 255選項將所有輸入數值除以255,就可以把它們縮放到 0.0 到 1.0 之間了。

 

  –M 選項可用於對輸入值減去均值。例如,若某個神經網路需要輸入值介於 -1 到 1 之間的話,請同時用–S 128–M 128選項將做到此事。

 

未支援的層

Intel Movidius NCS 並未支援前所有的神經網路架構與層。若執行 mvNCCheck 後看見“Stage Details Not Supported”的錯誤訊息,就代表您所選用的網路需額外處理步驟,或是Neural Compute SDK尚未支援這些層。想知道目前支援哪些層,請參考 Neural Compute Caffe SupportNeural Compute TensorFlow Support 等說明網頁。

 

其他Bug

其他造成不正確結果的可能原因就是bug啦!請來這邊回報吧:Intel Movidius Neural Compute Developer Forum.

 

更多關於mvNCCheck

關於 mvNCCheck 所以有可用的參數,請參考 mvNCCheck 文件頁面

 

延伸閱讀

 

相關文章

[Movidius神經運算棒]在Intel® Movidius™ NCS上部署客製化Caffe模型來進行影像分類

作者/攝影曾吉弘
文章分類教學(翻譯)
時間3小時
成本
難度******   (1~10)
材料表
  • Raspberry Pi 3單板電腦
  • Intel Movidius神經計算棒

 

(Original post from Intel Movidius NCS blog: “Deploying Your Customized Caffe Models on Intel® Movidius™ Neural Compute Stick”:https://movidius.github.io/blog/deploying-custom-caffe-models/ )

 

為什麼需要客製化模型?

Neural Compute Application Zoo (NCAppZoo) 會下載數個預先訓練好的神經網路,例如GoogLeNet、AlexNet、SqueezeNet與MobileNets⋯⋯等等。這些網路多數是根據ImageNet的資料集進行訓練,其中包含了上千個影像類別(class,也稱為category)。這些範例網路與程式,使開發者很容易評估所採用的平台,並以此建立簡易專題。不過,如果您打算對邊緣產品進行概念驗證,例如智慧型數位相機、能以手勢控制的無人機,或工業用的智慧攝影機的話,就應該需要客製化的神經網路才行。

如果今天要做的是一台放在住家門口的智慧監控攝影機,應該就不需要用到ImageNetLet上那上千個已經定義好的類別,比如「zebra」、「armadillo」或 「lionfish」。反之,您應該只需要大約15至20個類別,例如「person」、「dog」、「mailman」、「person wearing hoody」這樣就好。把資料集的類別從上千個降至20個的話,同時也大大降低所需要提取的特徵。這與您網路的複雜度直接相關,影響到其大小、訓練時間及推論時間⋯⋯等等。換言之,神經網路最佳化有以下好處:

  1. 資料集變小了,訓練網路的時間自然縮短。
    • 節省硬體的運行與訓練成本。
    • 縮短開發時間。
  2. 節省所需記憶體,進而降低硬體成本。
  3. 由於網路複雜度降低,藉此提高推論結果的向前傳遞(forward pass)速度,這樣就能讓邊緣裝置以更快速度處理攝影機影像。

本文將依序介紹如何使用客製化的資料集訓練一個預先定義好的神經網路,使用Intel® Movidius™ Neural Compute SDK (NCSDK)來剖析、修改網路,以改善執行時間,最後則是將客製化模型部署至Intel® Movidius™ 神經運算棒(NCS)上。

讓我們邊做邊學!

您會製作:

可以辨識狗與貓兩種類別的客製化GoogLeNet 深度神經網路。

您會學到:

  • 使用NCSDK中的mvNCProfile工具軟體來剖析神經網路

您會需要:


讓我們開始吧!

為了簡化,我將本文分成四大段:

  1. 訓練(Train) -選用神經網路、準備資料集及訓練。
  2. 剖析(Profile) -分析所採用神經網路的頻寬、複雜度與執行時間。
  3. 微調(Fine tune)-修改神經網路拓樸來改善執行時間
  4. 部署(Deploy)-將客製化完成的神經網路部署至可運行NCS的邊緣裝置上。

註:如果您的訓練機器與安裝NCSDK的系統並非同一台的話,請在您的訓練硬體上執行Step 1至3,並在安裝好NCSDK的系統上執行Step 2與4。

首先,請由NCAppZoo下載原始碼與說明文件,如以下指令:

mkdir -p ~/workspace
cd ~/workspace
git clone  https://github.com/movidius/ncappzoo

mkdir -p ~/workspace
cd ~/workspace
git clone https://github.com/movidius/ncappzoo


1. 訓練

選用神經網路

除非您打算從頭打造一套深度神經網路,不然選用何種神經網路對於您裝置的執行效能是最關鍵的事情。以這個鮭魚種類分類器來說,您只要選擇足以處理少數幾種類別的網路拓樸即可(這樣要檢查的特徵就少多了),但系統的速度還是要夠快才能成功分類不停游來游去的魚兒。另一方面,如果是倉儲物流的存貨掃描機器人的話,這時可能需要犧牲一點速度來提高分類超大量庫存商品的正確性。

一旦選好網路之後,您就得不斷微調它直到在正確性、執行時間與功耗方面達到平衡為止。GoogLeNet是針對ImageNet 2014比賽所設計的,具備超過1000個類別,顯然用它來分類貓狗是小題大作了,但為了讓本範例盡量簡單,我們還是採用它,但會清楚說明神經網路在客製化之後對於正確性與執行時間的影響。

準備資料集

  • 從Kaggle下載zip and train1.zip,放到 ~/workspace/ncappzoo/apps/dogsvscats/data路徑下。
  • 準備資料集所需的步驟都包在Makefile中了,包括:
    • 影像預處理、調整大小、裁切與直方圖均化(histogram equalization)等等
    • 影像洗牌(shuffling)
    • 將所有影像分成訓練用與驗證用兩組
    • 對這些影像建立一個lmdb資料庫
    • 計算影像均值 – 這是資料正規化的常用深度學習技術
# The helper scripts use $CAFFE_PATH to navigate into your caffe installation directory.
export CAFFE_PATH=/PATH/TO/CAFFE/INSTALL_DIR
cd ~/workspace/ncappzoo/apps/dogsvscats
make

註:請把畫面上的均值(mean)記下來,後續推論時會用到。

一切順利的話,會看到以下目錄架構:

tree ~/workspace/ncappzoo/apps/dogsvscats/data

data
├── dogsvscats-mean.binaryproto
├── dogsvscats_train_lmdb
│   ├── data.mdb
│   └── lock.mdb
├── dogsvscats_val_lmdb
│   ├── data.mdb
│   └── lock.mdb
├── test1
│   ├── cat.92.jpg
│   ├── cat.245.jpg
│   └── ...
├── test1.zip
├── train
│   ├── cat.2388.jpg
│   ├── cat.465.jpg
│   └── ...
└── train.zip

訓練

如果硬體效能夠強的話,要從頭開始訓練我們的「」資料集(25000張影像)應該不會太久,但在此要運用遷移學習(transfer learning)技術來節省開發的力氣。由於GoogLeNet是根據ImageNet資料集(包含了各種貓與狗的影像)所訓練,我們當然可以好好運用預先訓練好的GoogLeNet模型中的各個權重值。

Caffe讓我們只要在訓練指令後加入–weights 旗標就能輕鬆應用遷移學習。另外還要根據我們所採用的遷移學習類型來修改 training & solver prototxt (模型定義) 這兩個檔案。本範例選用最簡單的fixed feature extractor。

本文的dogsvscats專題github也一併提供了修改好的prototxt檔。想深入了解我改了哪些地方的話,請實際執行Caffe的範例網路檔與本專題所用網路來比較看看。

export CAFFE_PATH=/PATH/TO/CAFFE/INSTALL_DIR
cd ~/workspace/ncappzoo/apps/dogsvscats
diff -u $CAFFE_PATH/models/bvlc_googlenet bvlc_googlenet/org

請用以下指令開始訓練。根據您採用的硬體,所需時間可能從喝杯飲料到睡個午覺都有可能。

# The helper scripts use $CAFFE_PATH to navigate into your Caffe installation directory.
export CAFFE_PATH=/PATH/TO/CAFFE/INSTALL_DIR
cd ~/workspace/ncappzoo/apps/dogsvscats

# Download pre-trained GoogLeNet model
$CAFFE_PATH/scripts/download_model_binary.py $CAFFE_PATH/models/bvlc_googlenet

# Start training session
$CAFFE_PATH/build/tools/caffe train --solver bvlc_googlenet/org/solver.prototxt --weights $CAFFE_PATH/models/bvlc_googlenet/bvlc_googlenet.caffemodel 2>&1 | tee bvlc_googlenet/org/train.log

一切順利的話,會在dogsvscats/bvlc_googlenet/org資料夾中看到一大堆.caffemodel 與 .solverstate 檔。

註:我的模型在測試過程中收斂得不太理想,所以後來就不再從頭訓練,結果也好多了。如果您也遇到相同問題的話,只要拿掉 –weights 再重新跑一次訓練就好。如果想知道為什麼我的模型不會收斂的話,請到 Intel Movidius 開發者論壇 留言。

2. Profile

bvlc_googlenet_iter_xxxx.caffemodel包含了方才訓練好模型的各個權重。現在要看看它在Intel Movidius神經運算棒的執行效果如何。NCSDK ships with a 神經網路 profiler tool called mvNCProfile, ,它專門用來分析神經網路,並可對執行在某硬體平台上的神經網路提供逐層說明。

請在已安裝NCSDK的系統上執行以下指令,並確保NCS已經正確接上系統:

cd ~/workspace/ncappzoo/apps/dogsvscats/bvlc_googlenet/org
mvNCProfile -s 12 deploy.prototxt -w bvlc_googlenet_iter_40000.caffemodel

ls -l graph 
-rw-rw-r-- 1 ashwin ashwin 11972912 Dec 24 17:24 graph

 

您應該會看到各層關於頻寬、複雜度與執行時間的相關資訊。或者可透過output.gv.svg與output_report.html將這些資訊以圖形介面來呈現。

 

3. 微調

請注意Inception 4a, 4b, 4c  4d是最複雜的層,並且它們用了相當長的時間來向前傳遞。理論上來說,把這些層刪掉可以讓效能提升20~30ms,但這會影響到正確性嗎?重新用custom/deploy.prototxt 來訓練看看就知道了。

以下是我對bvlc_googlenet/org/train_val.prototxt 所作修改之圖形畫呈現。

CAFFE_PATH/python/draw_net.py 這個python程式是用於繪製網路。Netscope是另一個不錯的線上Caffe網路繪製工具。

cd ~/workspace/ncappzoo/apps/dogsvscats/bvlc_googlenet/org
python $CAFFE_PATH/python/draw_net.py train_val.prototxt train_val_plot.png

cd ~/workspace/ncappzoo/apps/dogsvscats/bvlc_googlenet/custom
python $CAFFE_PATH/python/draw_net.py train_val.prototxt train_val_plot.png

 

 

# The helper scripts use $CAFFE_PATH to navigate into your caffe installation directory.
export CAFFE_PATH=/PATH/TO/CAFFE/INSTALL_DIR
cd ~/workspace/ncappzoo/apps/dogsvscats

# Start training session
$CAFFE_PATH/build/tools/caffe train --solver bvlc_googlenet/custom/solver.prototxt 2>&1 | tee bvlc_googlenet/custom/train.log

註:請注意,在此沒有看到 –weights旗標,代表我沒有用到遷移學習。那為什麼您會期待我這麼做呢?預先訓練好的網路,其權重會與該網路架構直接相關。由於本範例刪除了inception層,因此遷移學習的效果不會太好。

這次的訓練過程顯然會比喝杯飲料的時間久一點,耐心等一下吧。訓練好 之後,請再次執行mvNCProfile來分析客製化之後的神經網路。

cd ~/workspace/ncappzoo/apps/dogsvscats/model
mvNCProfile -s 12 dogsvscats-custom-deploy.prototxt -w dogsvscats-custom.caffemodel

ls -l graph
-rw-rw-r-- 1 ashwin ashwin 8819152 Dec 24 17:26 graph

 

看起來我們的模型與原本的GoogLeNet相比,速度快了21.26 ms,網路也小了3 MB。不過網路正確性又如何呢?現在我們要把客製化前後的訓練學習曲線畫出來。

# The helper scripts use $CAFFE_PATH to navigate into your Caffe installation directory.
export CAFFE_PATH=/PATH/TO/CAFFE/INSTALL_DIR
cd ~/workspace/ncappzoo/apps/dogsvscats/bvlc_googlenet/org

# Plot learning curve
python $CAFFE_PATH/tools/extra/plot_training_log.py 2 bvlc_googlenet_train.png train.log

接著在另一個終端機中把客製化網路的學習曲線畫出來:

# The helper scripts use $CAFFE_PATH to navigate into your Caffe installation directory.
export CAFFE_PATH=/PATH/TO/CAFFE/INSTALL_DIR
cd ~/workspace/ncappzoo/apps/dogsvscats/bvlc_googlenet/custom

# Plot learning curve
python $CAFFE_PATH/tools/extra/plot_training_log.py 2 bvlc_googlenet_train.png train.log

註:graph的標籤不太好懂,因為我們期待“Test Loss”會在執行多次之後下降,不過它反而上升。這個graph實際上繪製的是loss3/top-1, 這就是您網路的正確性。更多細節請參考位於train_val.prototxt中的loss3/top-1定義。

在執行訓練過程時,我發現兩個網路在正確性差異非常小。我認為原因是來自類別數量很少導致特徵也變少的關係。類別數量增加的話應該就能看到更明顯的差異。

 

4. 部署

對於這個神經網路的效能滿意了嗎?可以準備將網路部署到像是Raspberry Pi或是MinnowBoard這樣的邊緣裝置上了。在此採用image-classifier來載入graph並對指定影像進行推論。原本的程式碼要修改一下才能運用正確的均值與比例因數(scaling factor),接著將程式碼搭配正確的graph檔之後才能測試影像。

--- a/apps/image-classifier/image-classifier.py
+++ b/apps/image-classifier/image-classifier.py
@@ -16,10 +16,10 @@ import sys

# User modifiable input parameters
NCAPPZOO_PATH           = '../..'
-GRAPH_PATH              = NCAPPZOO_PATH + '/caffe/GoogLeNet/graph'
-IMAGE_PATH              = NCAPPZOO_PATH + '/data/images/cat.jpg'
-CATEGORIES_PATH         = NCAPPZOO_PATH + '/data/ilsvrc12/synset_words.txt'
-IMAGE_MEAN              = numpy.float16( [104.00698793, 116.66876762, 122.67891434] )
+GRAPH_PATH              = NCAPPZOO_PATH + '/apps/dogsvscats/bvlc_googlenet/custom/graph'
+IMAGE_PATH              = NCAPPZOO_PATH + '/apps/dogsvscats/data/test1/173.jpg'
+CATEGORIES_PATH         = NCAPPZOO_PATH + '/apps/dogsvscats/data/categories.txt'
+IMAGE_MEAN              = numpy.float16( [106.202, 115.912, 124.449] )
IMAGE_STDDEV            = ( 1 )
IMAGE_DIM               = ( 224, 224 )

@@ -77,7 +77,7 @@ order = output.argsort()[::-1][:6]

# Get execution time
inference_time = graph.GetGraphOption( mvnc.GraphOption.TIME_TAKEN )

-for i in range( 0, 4 ):
+for i in range( 0, 2 ):
print( "Prediction for "
+ ": " + categories[order[i]]
+ " with %3.1f%% confidence"

 

修改完成之後執行image-classifier:

cd ~/workspace/ncappzoo/apps/image-classifier
python3 image-classifier.py

應該會看到以下類似訊息:

——- predictions ——–
Prediction for : Dog with 98.4% confidence in 90.46 ms
Prediction for : Cat with 1.7% confidence in 90.46 ms

 

rapid-image-classifier是一個用於測試影像分類效果的實用工具軟體,它會讀取某個資料夾(包含子資料夾)中的所有影像,並顯示推論結果。請把剛剛對image-classifier做的再做一次,最後執行程式。

cd ~/workspace/ncappzoo/apps/rapid-image-classifier
python3 rapid-image-classifier.py

應該會在terminal看到以下訊息:

Pre-processing images…
Prediction for 6325.jpg: Cat with 100.0% confidence in 90.00 ms
Prediction for 7204.jpg: Cat with 100.0% confidence in 73.67 ms
Prediction for 3384.jpg: Dog with 100.0% confidence in 73.72 ms
Prediction for 5487.jpg: Dog with 100.0% confidence in 73.27 ms
Prediction for 1185.jpg: Cat with 100.0% confidence in 73.60 ms
Prediction for 3845.jpg: Dog with 68.5% confidence in 73.29 ms

    讚!您已經成功將以Caffe為基礎的客製化深度神經網路部署在邊緣裝置上了。

註:有注意到第一個與第二個推論嗎?兩者之間的差異超過20ms。這是由於要先開啟裝置與載入graph才能首次呼叫loadTensor,因此耗時較長。

上述image-classifier與rapid-image-classifier這兩個範例使用了來自mvNCProfile的預設graph檔,但您可以改用自定義的graph檔。

cd ~/workspace/ncappzoo/apps/dogsvscats/bvlc_googlenet/org
mvNCCompile -s 12 deploy.prototxt -w bvlc_googlenet_iter_40000.caffemodel -o dogsvscats-org.graph

還可以試試

  • 運用資料增強(data augmentation)技術來提高您所用模型的正確度。.
  • GoogLeNet (本範例的客製版也算) 對於分類貓狗來說真的是小題大作;換成像是VGG 16、Resnet-18或 LeNet這類型的簡易網路試試看吧
    • 在NCSDK的release note可以找到一系列已驗證的可用網路

延伸閱讀

 

相關文章

 

[Raspberry Pi] 如何使用遠端桌面

作者

袁佑緣

時間

三小時

難度

***

材料表

  1. 電腦
  2. Raspberry Pi  (2018 Pi3+測試中)
  3. 網路線
  4. USB轉RJ45接頭(如果電腦需要額外的網路孔的話))

[Raspberry Pi] 完全不接螢幕鍵盤滑鼠,電腦一開始就用網路線遠端連線Pi 中, 我們有介紹過如何指透過網路線就可以連進去Raspberry Pi中, 但是有時候我們還是需要一個圖形化的界面來操作, 或者是要顯示圖像或影片, 所以本篇文章要來介紹一下如何使用遠端桌面來解決類似的問題。

以下是兩種常用的方法,VNC以及Xrdp。

使用VNC遠端桌面

首先請先將電腦與Raspberry Pi做連線, 並用SSH登入到Raspberry Pi中, 關於這部份有問題的話, 可以直接參考這篇文章的教學 [Raspberry Pi] 完全不接螢幕鍵盤滑鼠,電腦一開始就用網路線遠端連線Pi

登入之後, 請打上以下的指令來安裝tight vnc server, 好用來在Raspberry Pi上跑一個VNC遠端桌面的服務。

sudo apt-get install tightvncserver -y

安裝完成後, 可以在終端機中輸入以下的指令來開啟這個server,

vncserver

第一次啟動的話, 程式會提示使用者設定一組密碼, 長度為八個英文字母或數字, 另外, 讀者也可以設定一組只能觀看螢幕畫面的密碼, 在本範例是略過這一步, 所以輸入n,跳過這個選項, 設定完成後, 就會在家目錄底下的.vnc資料夾生成一些設定檔,如下圖。

在Raspbian中, 管理圖形話界面的xserver會有一個DISPLAY的環境參數可以去設定, 也就是說可以透過這個參數, 來設定你要輸出的畫面到那一個顯示上, 好比說我們現在開啟的vnc server是開在:1號上,

你可以輸入以下的指令來確認現在的vnc server是開在那一個DISPLAY上。

ps a | grep vnc

所以說vnc server可能會有好幾個DISPLAY正在活動, 例如:1, :2, :3, …​好幾個桌面這樣, 每一個桌面都可以讓各別的使用者進行不同的操作, 但如果說我想要關掉特定的DISPLAY的話, 可以透過以下的指令來關掉特定的桌面, 如以下範例中的:1 號DISPLAY。

vncserver -kill :1

順帶一提, 如果我想要開一個Full HD的桌面, 而且指定為DISPLAY :2號的話, 可以透過下面的指令來完成。

vncserver -geometry 1920x1080 :2

到這邊我們已經把server端的部份搞定了, 接下來就剩下我們的電腦要安裝vnc viewer, 來遠端連線到Raspberry Pi上的桌面系統了。

讀者可以下載Chrome瀏覽器, 並安裝 VNC Viewer for Google Chrome 這個插件。

安裝完成後可以在網址列那邊輸入 chrome://apps 就可以切換到Google Chrome瀏覽器裡的App清單中, 請點擊清單中的VNC Viewer,如下圖中的左上角。

打開VNC Viewer後, 我們就可以透過連到<Raspberry Pi的ip>:<vncserver的port>, 來開啟指定port下的遠端桌面。

理論上我們要透過ssh連線到Raspberry Pi時, 就會需要用到Raspberry Pi的IP位址, 但是如果我們忘記了想要再重新查詢一遍的話, 可以在終端機中打上以下的指令查詢, 如下圖中的10.42.0.135

ip a

至於在連線時, 我們會有指定一個<vncserver的port>, 意思是5900加上DISPLAY的編號, 好比說我要連到DISPLAY :1這個桌面, 就打上5901, :2 就5902, 依此類推。

如以下的範例, 連到10.42.0.135下的:1號桌面。

連線時, 同意非加密的連線。

並打上前面設定過的vncserver的密碼。

成功登入後如下圖。

使用瀏覽器的插件來連到vnc viewer的好處是跨平台, 但是如果讀者想使用其他方法, 例如下載自己作業系統上的vnc viewer程式的話, 以下推薦一個比較常用的 RealVNC Viewer 請根據您電腦的作業系統來下載安裝。

指定SSH中的圖形畫面要在哪一個桌面上輸出

如果說讀者是從ssh登入之後, 直接在終端機上呼叫一個需要跑圖形界面的程式, 例如呼叫xterm

xterm

那麼讀者應該會看到系統回傳一個錯誤, 表示無法開啟顯示, 因為在SSH中, 預設是沒有DISPLAY的設定的。

但是如果我們把DISPLAY設定成:1, 也就是指定到我們vnc server上的:1號桌面, 並再重新跑一次xterm

export DISPLAY=:1
xterm

如此一來就可以在vnc viewer的port 5901上的這個桌面, 看到xterm成功被啟動了,如下圖。

另外, 如果說你想要查一下這個vnc viewer連到的桌面, 現在DISPLAY是設定多少的話, 可以點擊桌面上方的終端機圖示,

打開終端機後,

輸入以下的指令來顯示DISPLAY這個環境變數,

echo $DISPLAY

可以看到, 在這個桌面下,確實是DISPLAY :1呢!

使用Xrdp遠端桌面

另外一個常用的方法是使用Xrdp, 這是一套由windows發展出來的protocal, 因為它一套專門用來做遠端桌面溝通的協定, 所以在功能上會比vnc來的多,而且處理效能會較好一些。

在Raspberry Pi上要使用Xrdp的話, 只要輸入以下指令下載安裝, 系統就會自動執行了。

sudo apt-get install xrdp -y

至於連到Xrdp的工具可以從以下的網址來下載

安裝完成後, 基本上跟vnc viewer的操作上是很類似的, 不過在這邊是指定Raspberry Pi的IP後, 把使用者的帳密打上去, 如下圖所示。

成功登入後就會看到熟悉的桌面系統囉!

[AI人工智慧] 在Raspberry Pi上安裝NCSDK

作者

袁佑緣

時間

三小時

難度

***

材料表

前言

本篇文章將帶領讀者在Raspberry Pi上安裝Intel Movidius SDK, 並測試Movidius NCS是否能成功跑NCSDK的範例檔, 請讀者準備好Raspberry Pi以及要燒錄映像檔的SD Card, 另外為了要能夠從電腦直接連到Raspberry Pi上進行操作, 所以我們還需要額外一條乙太網路線來做連接。

燒錄Raspberry Pi映像檔

首先我們必須到 Raspbian的官方網站 下載Raspberry Pi的映像檔, Raspbian目前有提供兩個版本可以用, Lite版是輕量版本, Desktop版則是會連同桌面系統都內建在裡面, 但相對的檔案會比較大。

接下來為了要燒錄Raspberry Pi的映像檔, 我們需要一些工具來做燒錄, 在這邊我們推薦一款來不錯的跨平台燒錄工具 Etcher, 請根據您的作業系統來選擇安裝檔。

下載完成後, 請打開Etcher, 如下圖所示,

接著點選Select image, 並選擇剛剛下載的Raspbian映像檔的壓縮檔 (這個zip檔不需要解壓縮,Etcher會自動解壓縮成映像檔)

接下來將SD Card插入電腦上, 並在Etcher上選擇系統上顯示的裝置, 例如下圖中的/dev/mmcblk0 (Windows作業系統的話則常見是F,G槽等等)

最後就可以按下Flash開始燒錄囉! 燒錄完成後後如下圖。

將Raspberry Pi預設為啟用SSH

通常為了安全的考量, 剛燒錄完全新的Raspberry Pi系統預設都會關閉SSH Server, 因為Raspbian預設的使用者帳密都是一樣的, 所以預設開啟的話, 有可能被其他有心人士利用。

但因為在這個範例中, 我們希望可以不需要連接螢幕跟鍵盤就可以操作Raspberry Pi, 所以我們會需要改成預設開啟SSH。

以下以Windows作業系統為例, 其他作業系統也是同樣概念。

首先我們先將燒錄完系統的SD Card插到電腦上, 此時電腦會讀到一個新的裝置, 如下圖中的boot(F:)。

點進去boot之後, 按下右鍵新增一個Text Document,

將此新增的空白文件命名為ssh, 而Raspbian再開機時, 會讀取boot中有沒有名為ssh的檔案, 如果有,就會預設為啟動SSH Server, 這樣我們就可以透過ssh連進去了。

至於怎麼透過電腦做SSH連線到Raspberry Pi, 有興趣的讀者可以連到以下的文章查看詳細的教學 “[Raspberry Pi] 如何透過網路線連接Raspberry Pi的SSH連線到Raspberry Pi小節

安裝NCSDK

在安裝之前, 我們先更新一下Raspberry Pi的系統套件。

請輸入以下的指令, 來更新系統套件。

[ sourcecode language=”cpp”] sudo apt-get update
[ /sourcecode]

接著請輸入以下的指令來升級系統的套件。

sudo apt-get upgrade -y

接著輸入以下指令將NCSDK的原始碼下載下來

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

使用cd指令將工作目錄移到nscdk這個資料夾中。

cd ncsdk

緊接著輸入以下的指令, 將NCSDK透過Makefile的設定安裝起來。

make install

安裝的過程中, 會需需要超級使用者的權限, 請打上Raspberry Pi的超級使用者的帳密, 預設帳密是pi/raspberry

另外, 除了安裝NCSDK的套件之外, 做影像辨識還需要額外的函式庫OpenCV, 請輸入y來同意安裝。

值得注意的是, 由於Raspbian系統上並沒有編好的OpenCV3函式庫, 所以必須讓Raspberry Pi從頭編譯, 這個步驟會花掉不少時間, 例如下圖是筆者的實測編譯總計時間是171分鐘, 幾乎快要三個小時呢! (筆者使用的是Raspberry Pi最新的第三代,不同代處理效能會不一樣,所花的時間也會不一樣)

最後為了要測試Raspberry Pi是否能正確使用NCS, 請先插入NCS到USB孔上, 再輸入以下的指令來執行範例程式hello_ncs_py

cd examples/apps/hello_ncs_py/
make run

如果顯示NCS device working就代表成功囉!

備份安裝完NCSDK的Raspbian系統

走筆至此, 我們好不容易裝好了NCSDK, 並且把OpenCV函式庫也編譯完成了, 最後也確認Raspberry Pi可以讀取到NCS裝置了, 如果說我想要再新的一塊Raspberry Pi上也完成這樣的設定, 能不能不要在重新來過, 而是就直接使用已經完成的備份檔呢? 答案是可以的喔!

關於在Raspberry Pi進行系統備份以及重新燒錄檔案的教學請參考這邊教學文章, [Raspberry Pi] 如何備份Raspberry Pi的系統

另外,如果是想要直接使用Cave團隊提供的系統備份檔的話, 可以從以下的連結來下載, 總大小約4GB左右, 裡面已經有完成所有的設定, 只要按照 [Raspberry Pi] 如何備份Raspberry Pi的系統 的 燒錄映像檔到新的SD Card上 (麻煩做一下文章連結) 小節的教學燒錄即可。

[AI 人工智慧應用] MovidiusNCS在PC中設定Ubuntu虛擬機並執行NCSDK(下)

 

作者

袁佑緣

時間

三小時

難度

***

材料表

  1. 電腦/筆記型電腦
  2. Movidius Neural Computer Stick

本篇是接續MovidiusNCS在PC中設定Ubuntu虛擬機並執行NCSDK(上), 在(下)篇中,我們將完成剩下的NCSDK安裝設定,分享如何讓虛擬機也可以跟Raspberry Pi遠端連線、在虛擬機中的Ubuntu作業系統可以使用Movidius NCS來做運算、壓縮並備份虛擬機的作業系統。

在Ubuntu虛擬機中安裝NCSDK

首先請將Ubuntu虛擬機開機,並登入您的使用者帳號,如下圖。

接下來請點選左上角的圖示, 叫出搜尋應用程式的選單, 接下來打上”terminal”來搜尋終端機, 最後點選terminal應用程式打開終端機。

另外補充一下,如果要是使用快捷鍵的方式來打開終端機, 可以按下<Ctrl>+<Alt>+T來開啟。

接下來請在終端機中輸入以下的指令, 來更新系統套件。

sudo apt-get update

接著請輸入以下的指令來升級系統的套件。

sudo apt-get upgrade -y

因為我們需要使用git來下載NCSDK的github原始碼, 所以請輸入以下指令來使用apt套件管理員來安裝git

sudo apt-get install git -y

 

接下來我們將NCSDK的github下載下來

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

 

下載完成後, 我們使用cd指令將工作目錄移到nscdk這個資料夾中。

cd ncsdk

緊接著輸入以下的指令, 將NCSDK透過Makefile的設定安裝起來。

make install

 

安裝過程會花上不少時間, 請讀者耐心等候。

等安裝完成後, 程式會自動提示使用者要重新開一個新的終端機才會生效, 如下圖。

請讀者再重新開一個新的終端機, 並輸入以下的指令, 將工作目錄指定到一個hello_ncs_py的範例資料夾。

cd examples/apps/hello_ncs_py/

 

接著請將Movidius NCS 接到電腦的USB孔, 我們將要跑跑看這隻範例程式是否能正確的辨識到NCS, 並且能夠成功使用NCSDK的功能。

make run

如果說回傳的結果是上圖, 顯示NCS device working就代表成功囉!

測試NCSDK的examples

如果前面的NCSDK安裝與NCS裝置都可以正常運作的話, 我們可以來試試看跑其他的範例程式。

請打開終端機, 並切換工作目錄到ncsdk資料夾中, 並執行ncsdk中的examples。

cd ncsdk
make examples

 


執行程式的過程中, NCS會去下載並執行範例中的網路模型, 並實際評測跑出來的結果。

安裝SSH Server

有時候我們可能需要能透過SSH來連線到VirtualBox中的虛擬機, 那們這個時候就需要在Ubuntu作業系統中安裝SSH的server,

請輸入以下的指令來安裝openssh-server

sudo apt-get install openssh-server -y

安裝完成後, 我們必須將SSH的Service設置為啟用

sudo systemctl enable ssh

接下來下次虛擬機重開機的時候就會自動執行SSH Server了。

另外我們也可以透過指令的方式直接啟用SSH Server,

sudo systemctl start ssh

或者是查看SSH Server的狀態。

sudo systemctl status ssh

順帶一提, 如果是想要在Ubuntu作業系統中關機的話, 可以點選右上角的開關鍵, 並選擇Shutdown選項即可。

接下來我們看一下怎麼透過電腦來連到虛擬機中的Ubuntu系統中, 首先我們先下載Google Chrome瀏覽器, 並在瀏覽器中安裝一個 Chrome瀏覽器的插件Secure Shell

安裝完成後, 讀者可以直接在瀏覽器的網址列直接打上”ssh”, 接下來再按下Tab鍵就會自動進入ssh插件模式, 然後就可以打上”Ubuntu使用者名稱@localhost:2222″ 來連線到虛擬機中, 至於為什麼要連線到port 2222呢, 我們在之前的文章”完全不接螢幕鍵盤滑鼠,電腦一開始就用網路線遠端連線Pi” 有提到,在網路設定中有設定了Port Forwarding的緣故。

初次登入的話,一開始會先建立金鑰的認證, 請輸入”yes”來同意認證。

以下是成功登錄的畫面

另外這邊在分享一個進階的技巧, 其實有時候我們並不需要真的進到Ubuntu系統中的桌面環境, 大部分的時候我們只需要能夠登入系統中的shell即可對系統下指令, 讀者可以試著在啟動虛擬機時, 按下右鍵選擇Start→Headless Start, 這樣就可以省去開啟畫面的動作, 對電腦的計算負擔也會比較小喔。

虛擬機的Import/Export

最後,我們辛辛苦苦安裝完虛擬機並安裝了NCSDK函式庫後, 當然會希望可以把這個虛擬機直接存起來成一個VirtualBox的壓縮檔, 如此一來,在新的電腦上也可以使用VirtualBox來讀取這個輸出的壓縮檔, 直接引入安裝就可以使用。

首先點選左上角的File → Export Appliance

選擇要輸出的虛擬機,

接下來選擇檔名及儲存位置,

設定完成後就會開始輸出囉!

輸出完成後, 我們來看看如何引入這個OVA檔, 首先請點選File → Import Appliance

最後確認一下設定有沒有需要調整的, 比如說記憶體大小,USB Controller等, 預設的話會跟原始Export的虛擬機設定一樣。

另外,如果是想要直接使用CAVEDU團隊提供打包好的ova檔的話, 可以從以下的連結來下載,總大小約7GB左右, 裡面已經有完成本文上下兩篇的所有設定, 只要按照這一小節的教學引入即可喔。

 

相關文章:

[AI 人工智慧應用] MovidiusNCS在PC中設定Ubuntu虛擬機並執行NCSDK(上)

作者

袁佑緣

時間

三小時

難度

***

材料表

前言

為了要能夠在電腦上使用Movidius Neural Computation Stick(NCS), 我們必須在個人電腦上準備一些必要的工具, 例如:Ubuntu 16.04作業系統(目前NCS正式支持的系統版號)以及安裝必要的函式庫NCSDK。

由於一般人的電腦的作業系統都不是Ubuntu16.04, 所以我們必須要在電腦上安裝虛擬機來跑一個虛擬的系統。

以下我們將一步一步的帶各位讀者在自己的電腦上完成詳細的虛擬機設定, 如果是想要直接使用我們已經幫您做完的版本, 請直接跳到 “[Movidius NCS] 如何在PC中設定Ubuntu虛擬機並執行NCSDK(下) 的虛擬機的Import/Export 小節“。

懶人包教學影片可以看這裡,想一步一步自己設定請往下繼續看:

懶人包影片軟體連結,想一步一步自己設定請往下繼續看

1、更多Movidius AI運算連結,請下載2、3、4的檔案

2、VirtualBox軟體安裝檔連結

3、VirtualBox 作業系統懶人包安裝檔, Ubuntu for intel Movidius 神經運算棒 作業系統連結

4、VirtualBox USB2.0、USB3.0 Extension Pack.下載連結

安裝VirtualBox與下載Ubuntu作業系統

首先請先到以下的網址下載VirtualBox虛擬機, 並且根據您的作業系統來選擇要下載的安裝檔, 例如:假設讀者的電腦作業系統是Windows的話, 就在VirtualBox 52.6 platform packages, 就點選”Windos hosts”來下載。

接下來我們還必須要去下載VritulBox Extension Pack, 才能讓虛擬機使用USB3.0的功能。

再來請到以下的網站去下載Ubuntu 16.04系統,

新增虛擬機

下載完成後,請打開Virtualbox,並按下New新增一個虛擬機器。

接下來在Name上打上虛擬機的名稱, 並選擇Type為Linux, 選擇Version為Ubuntu (64-bit),如下圖。

接下來指定記憶體的大小,基本上至少要有2GB會比較夠。

接下來選擇建立一個虛擬的硬碟。

選擇硬碟檔案格式為VDI(VritualBox Disk Image)

指定硬碟維dynamically allocated。

最後指定虛擬硬碟的大小,建議10~15GB,或15GB以上。

設定安裝光碟

完成後在VirtualBox左邊的選單應該可以看到剛剛新增的虛擬機, 如下圖中的ubunutu-NCS, 接下來請按下右鍵,並點選Settings。

先選擇擇Storage, 然後在Optical Device點選光碟小圖示, 並選擇剛剛下載的Ubunutu 16.04安裝光碟。

設定USB Controller

接下來我們要來設定USB界面, 為了要讓虛擬機可以辨識到Movidius的NCS, 請先選擇Enable USB Controller, 並勾選USB 3.0 (xHCI) Controller。 如果不能勾選USB3.0的話,有可能是您沒有安裝前面提過的VirtualBox Extension Pack。

接下來在下面的USB Filter新增USB2跟USB3的設定,如下圖。

網路設定

最後,為了要讓使用者可以使用SSH遠端登入虛擬機中, 我們必須設定一個Port Forwarding的設定。

如下圖,將Host的port 2222轉送到Guset的port 22, 也就是說在讀者的電腦上如果用SSH連線到自己localhost的port 2222, 就會連線到虛擬機中的Ubuntu系統中(一般SSH Server預設是port 22)。

安裝Ubuntu系統

以上的設定都完成後, 請點選向右的箭頭(Start), 將虛擬機開機。

進入Ubuntu安裝光碟後, 請選擇右邊的Install Ubuntu。

接下來選擇Erase disk and install Ubuntu。

按下Continue繼續安裝。

選擇時區設定,如下範例中的台北。

在台灣的話,選擇預設的Keyboard Layout即可。

最後設定一下使用者名稱及密碼。

以上設定完成後, 虛擬機會需要花上一點時間安裝全新的Ubuntu作業系統。

當出現以下的圖示時, 就代表已經安裝完成了, 接下來只要按下Restart Now重新開機即可。

一般來說, 安裝完新的系統後,就會需要退出當初使用的安裝光碟, 不過不用擔心,VirtualBox會自動幫你做完, 所以讀者只要直接按下Enter繼續即可。

虛擬機重開之後, 應該就能夠進到新安裝的Ubuntu作業系統, 請輸入您設定的使用者密碼。

成功登入後, 讀者應該就可以看到如下圖的桌面, 代表已經安裝成功囉!

接下來,請讀者繼續到 [Movidius NCS] 如何在PC中設定Ubuntu虛擬機並執行NCSDK(下)完成剩下的NCSDK安裝設定。

 

相關文章:

[Raspberry Pi] 完全不接螢幕鍵盤滑鼠,電腦一開始就用網路線遠端連線Pi

 

作者

袁佑緣

時間

三小時

難度

***

材料表

  1. 電腦
  2. Raspberry Pi  (2018 Pi3+測試中)
  3. 網路線
  4. USB轉RJ45接頭(如果電腦需要額外的網路孔的話))

我們在使用Raspberry Pi時,常會需要額外的設備例如準備螢幕、鍵盤、滑鼠才可以操作, 使用上非常的不方便,而本文就是我們將介紹如何只透過一條網路線就能操作Raspberry Pi, 並且還可以透過筆電或桌電分享網路給Raspberry Pi,不用再辛苦地去接無線網路。

在PC中設定網路分享

以下的內容將會以Windows的作業系統為主(本範例用的是Win10), 使用macOS的朋友請直接參考另外一篇教學文 Raspberry Pi 教學-使用網路線讓電腦與樹莓派進行連線(For Mac OS X)

首先請先打開控制台(control panel),並打開網路設定。

接下來進到網路共用中心(Network and Sharing Center)。

應該會看到電腦上可以用的網路裝置,以筆者的電腦為例, 筆者有兩個乙太網路裝置,一個是讓電腦可以連到外網的裝置(“乙太網路”), 另外一個則是USB轉乙太網路卡(“乙太網路 2”),我們希望可以將這個連到外網的網路, 透過這個USB轉乙太網路卡分享網路給Raspberry Pi。

如果讀者現在打開左邊的網路介面卡設定(Change adapter settings)的話, 應該可以看另外一個網路裝置是打叉的, 因為我們在這上面還沒有設定網路, 如果直接接到Raspberry Pi上是不會有任何反應的。

所以為了要讓這個要分享給Raspberry Pi能有網路, 我們必須要從另外一個有接到外網的裝置, 分享網路給另外一個裝置。

點選功能(properties), 接下來選擇分享(Sharing)的選項, 並將分享的功能勾選如下圖, 並指定裝置為欲分享網路的裝置, 例如本範例中的”乙太網路 2″。

完成後可以點選欲分享網路的裝置中的詳細資料(Details), 如下圖,讀者可以看到右邊的IPv4 Address是192.168.137.1, 這是所分享的網路中的電腦IP位址, 但實際上Raspberry Pi的IP位址還不知道。

掃描Raspberry Pi的IP

所以我們還需要額外的工具來掃描Raspberry Pi的IP位址, 例如本篇範例中用到的Advaned IP Scanner, 這是一款免費的IP掃描工具, 讀者可以從以下的網址來下載。

接下來請安裝IP Scaner。

安裝完成後,執行IP Scanner, 如下圖,按下Scan之後就可以掃描電腦網域附近的可能裝置, 另外為了要節省少描的時間, 建議讀者可以把欲掃描的IP範圍給定, 例如本範例中的192.168.137.1-254。

最後我們記下掃到的Raspberry Pi IP位址, 例如本範例的(192.168.137.173)。

接下來我們只剩下最後一步, 就是要如何透過網路連線到Raspberry Pi, 一般來說我們會用SSH來去連這個IP, 進而登入Raspberry Pi的系統當中。

SSH連線到Raspberry Pi

為此我們必須準備好SSH的工具, 筆者建議可以透過 Chrome瀏覽器的插件Secure Shell 來進行SSH連線,因為瀏覽器是跨平台的,所以就算在macOS的系統上也可以適用。

安裝完成後,讀者可以直接在瀏覽器的網址列直接打上”ssh”, 接下來再按下Tab鍵就會自動進入ssh插件模式, 然後就可以打上”Raspberry Pi使用者@Raspberry Pi IP位址”, 例如本範例的”pi@192.168.137.173″。

初次登入的話,一開始會先建立金鑰的認證, 請輸入”yes”來同意認證。

成功登入後就會如下圖, 會進到一個Raspberry Pi中的shell中。

補充

如果讀者是在Raspberry Pi上安裝官方推薦的Raspbian系統的話, 一般來說,為了安全考量,預設都是會關閉SSH的功能, 所以說如果Raspberry Pi可以拿到電腦分享網路的IP, 但是卻SSH卻登不進去的話,可以按照下面的步驟來強制開啟SSH的功能,

首先請先將Raspberry Pi的燒錄過系統的SD卡插到電腦上面, 並打開裡面的”boot”磁區,如本範例中的F槽。

接著再右鍵新增一個空白文件,命名為ssh。

 

當Raspbian開機時,如果說boot磁區中有一個檔案檔名叫做ssh的話, 就會強制開啟ssh的功能,如下圖。

相關文章:

 

[Movidius神經運算棒]五步驟打造Intel Movidius NCS影像分類器

(Original post from Intel Movidius NCS blog: “Build an Image Classifier in 5 steps”:https://movidius.github.io/blog/ncs-image-classifier/

 

什麼是影像分類?

影像分類是電腦視覺的重要課題。目標在於把圖像中的某個主題或物體歸類到預先定義的類別中。現實生活中的影像分類問題是把印有各種物體的卡片拿給小孩子看,並讓他們分辨卡片上所印的東西是什麼。傳統的作法是讓機器具備一定的視覺感知能力,這有賴於使用特徵描述器的各種複雜電腦演算法,描述器像是邊緣、角落與顏色等等,來辨識或辨認影像中的一或多個物體。

深度學習採用另一個更有效率的做法來解決現實生活中的影像問題。它運用了多層彼此互聯的神經元,每一層都採用了特定的演算法去辨識或分類某個描述符(descriptor)。舉例來說,如果您想要對交通的[STOP]號誌進行分類的話,要用到深度神經網路 (DNN) 來偵測號誌的邊緣與邊界,第一層則是用來偵測邊角的數量、下一層則是偵測紅色、再下一層偵測紅色周圍的白色邊界,一直反覆執行下去。DNN可以把一個任務分配到執行單一檢算法的多個層,這樣可以處理大量的描述符,讓基於DNN的影像處理應用於現實生活中能更有效率。

作者/攝影  曾吉弘
時間  2小時
成本
難度 * * * * *
材料表
  • Raspberry Pi 3單板電腦
  • Intel Movidius神經計算棒

 

Layer 1: 邊緣偵測(八角形)

Layer 2: 邊緣附近的白色邊界

Layer 3: 紅色本體

Layer 4: “STOP”字樣

注意:上圖僅用於示範DNN如何辨識物體中的不同描述符,並非DNN用於分類STOP標示的正確呈現。

影像分類與物件偵測是不一樣的。分類是假設整張圖中只有一個物體,例如上述的幼童圖卡範例。另一方面,物件偵測可以在同一張圖中處理多個物體,並計算各物體在圖中的位置。

邊做邊學!

您會製作:

從資料夾中讀取單張影像並進行分類。

您會學到:

  • 如何使用預訓練的網路來進行影像分類
  • 如何使用Intel® Movidius™ NCS 的API框架來編寫程式

您會需要:

  • Intel Movidius Neural Compute Stick 神經運算棒 – 購買請按我
  • 32/64位元的桌上型/筆記型電腦,作業系統須為Ubuntu 16.04 (“開發機器”)

如果還沒做的話,請在您的開發機器上安裝完整的NCSDK。請參考Intel Movidius NCS Quick Start Guide上的安裝步驟來完成。

先看結果…

如果想先看看程式輸出結果的話,請用以下使令來取得範例程式 (NC App Zoo) 並執行

mkdir -p ~/workspace
cd ~/workspace
git clone https://github.com/movidius/ncappzoo
cd ncappzoo/apps/image-classifier
make run

make run 指令會下載並建置所有的相依檔案,例如預訓練網路、二元graph檔、ilsvrc資料集均值等。只有第一次執行時要先執行make run;後續只要執行 python3 image-classifier.py 就可以了。應該會看到類似以下的訊息:

 ——- predictions ——–
prediction 1 is n02123159 tiger cat
prediction 2 is n02124075 Egyptian cat
prediction 3 is n02113023 Pembroke, Pembroke Welsh corgi
prediction 4 is n02127052 lynx, catamount
prediction 5 is n02971356 carton

開始吧!

感謝NCSDK 完整的API framework,只需要幾行Python就可以完成影像分類器。以下是image-classifier.py 中一些需要調整的使用者參數::

  1. GRAPH_PATH:要進行推論的graph檔路徑
    • 預設值為 ~/workspace/ncappzoo/caffe/GoogLeNet/graph
  2. IMAGE_PATH:想要分類的影像路徑
    • 預設值為 ~/workspace/ncappzoo/data/images/cat.jpg
  3. IMAGE_DIM:所採用神經網路之影像尺寸規格
    • 例如 GoogLeNet 採用 224×224像素,AlexNet則是227×227像素
  4. IMAGE_STDDEV:您選用之神經網路所定義的標準差(scaling value)
    • 例如:GoogLeNet不採用任何比例因子,但InceptionV3的比例因子為128 (stddev = 1/128)
  5. IMAGE_MEAN:均值減法(Mean subtraction)是深度學習領域中常用的資料整理技巧。
    • 對ILSVRC資料集來說,B、G、R的平均值分別為102、117與123

請先由mvnc函式庫匯入mvncapi模組,才能順利使用NCSDK API framework。

import mvnc.mvncapi as mvnc

 

Step 1:開啟enumerated裝置

如同其他USB裝置,當您將NCS接上應用程式處理器 (執行Ubuntu的桌上型/筆記型電腦) 的USB埠,前者會被後者枚舉為一個USB裝置。我們可以呼叫API來檢視各個NCS裝置。

# Look for enumerated Intel Movidius NCS device(s); quit program if none found.
devices = mvnc.EnumerateDevices()
if len( devices ) == 0:
print( 'No devices found' )
quit()

您知道在同一個應用程式中,可以連接多個NCS神經運算棒來提高推論效能嗎?以下語法是運用API 呼叫單一NCS並開啟 (意即準備好操作).

# Get a handle to the first enumerated device and open it
device = mvnc.Device( devices[0] )
device.OpenDevice()

 

Step 2:將graph檔載入NCS

為了簡易起見,我們採用已訓練好的AlexNet model中的某個已編譯的graph檔,這當您在 ncappzoo 資料夾中執行 make 指令實就已經編譯好了。後續會有文章教您如何編譯一個已經訓練過的網路,但現在先來看看如何把graph載入NCS中。

# Read the graph file into a buffer
with open( GRAPH_PATH, mode='rb' ) as f:
blob = f.read()

# Load the graph buffer into the NCS
graph = device.AllocateGraph( blob )

Step 3:載入單一影像至Intel Movidius NCS並進行推論

Intel Movidius NCS是以Intel Movidius視覺處理元件(VPU)為基礎。這個元件對數百萬種監控攝影機、可用手勢控制的無人機、工業級機器視覺設備提供了視覺智能。如同VPU,NCS在系統中扮演的角色好比是個視覺上的共同處理器。以本範例來說,我們採用Ubuntu系統來讀取資料中的影像並 and offload it to the NCS for inference。NCS負責所有的神經網路運算,,這樣就可以節省CPU與記憶體來執行其它應用層的任務。

我們得先對影像進行處理(預處理)才能將影像載入NCS。

  1. 調整或裁切影像,好符合後續預訓練的網路規格。
    • GoogLeNet格式為224×224像素,AlexNet則是227×227像素
  2. 從整體資料集中,減去各個頻道 (Blue, Green and Red) 的均值。
    • 這在深度學習領域中是常見的 center the data 的技巧。
  3. 將影像轉為半精度浮點數 (fp16) 陣列,接著使用LoadTensor函式將影像載入NCS。
    • 搭配skimage函式庫只要一行程式碼就搞定
# Read & resize image [Image size is defined during training]
img = print_img = skimage.io.imread( IMAGES_PATH )
img = skimage.transform.resize( img, IMAGE_DIM, preserve_range=True )

# Convert RGB to BGR [skimage reads image in RGB, but Caffe uses BGR]
img = img[:, :, ::-1]

# Mean subtraction & scaling [A common technique used to center the data]
img = img.astype( numpy.float32 )
img = ( img - IMAGE_MEAN ) * IMAGE_STDDEV

# Load the image as a half-precision floating point array
graph.LoadTensor( img.astype( numpy.float16 ), 'user object' )

 

Step 4:讀取並顯示NCS的推論結果

根據您想要如何將推論結果整合入應用中,您可以選擇blocking or non-blocking 函式呼叫兩者之一來載入上述步驟中的tensor並讀取推論結果。現在我們使用預設的 blocking 呼叫 (無需使用特定的API).

# Get the results from NCS
output, userobj = graph.GetResult()

# Print the results
print('\n------- predictions --------')

labels = numpy.loadtxt( LABELS_FILE_PATH, str, delimiter = '\t' )

order = output.argsort()[::-1][:6]
for i in range( 0, 5 ):
print ('prediction ' + str(i) + ' is ' + labels[order[i]])

# Display the image on which inference was performed
skimage.io.imshow( IMAGES_PATH )
skimage.io.show( )

 

Step 5:卸載graph與關閉裝置

為了避免記憶體洩漏與/或區段錯誤(segmentation fault),請記得關閉任何開啟中的檔案、資源以及 deallocate 使用中的記憶體。

graph.DeallocateGraph()
device.CloseDevice()

恭喜!您的DNN 影像分類器完成了。

 

還可以試試

延伸閱讀

相關文章

 

[Movidius神經運算棒]在Raspberry Pi 上執行 Intel® Movidius™ NCS應用程式

Original post from Intel Movidius NCS blog: “Run NCS Applications on Raspberry Pi”:https://movidius.github.io/blog/ncs-apps-on-rpi/ )

 

什麼是嵌入式板?

Intel® Movidius™ Neural Compute Stick (簡稱Intel® Movidius™ NCS) 是將Intel® Movidius™視覺處理單元(VPU)整合在USB裝置上。這樣就可對數百萬種低功耗的嵌入式裝置提供視覺智能,例如監控攝影機、可用手勢控制的無人機、工業級機器視覺設備等等。由於Intel Movidius NCS是針對低功耗應用所設計,因此將其與像是MinnowBoardUP BoardRaspberry Pi (RPi) 等低功耗嵌入式系統搭配是很合適的應用。

作者/攝影  曾吉弘
時間  2小時
成本
難度* * * * *
材料表

 

開發 vs 部署 Development vs Deployment

Raspbian (RPi專用的作業系統)提供了相當好的圖形化使用者介面(GUI),使用者可以接上螢幕、鍵盤滑鼠之後就可以直接操作Pi。雖然這種作法便於探索Pi的各種功能以及進行一些輕量化的開發作業,但在headless mode(不接上任何螢幕鍵盤滑鼠)下部署嵌入式產品/專案也是常見的做法。例如想要做一台Pi 追乒乓球機器人的話,顯然是無法接上螢幕鍵盤滑鼠的吧。

嵌入式產品的軟體一般來說都是在開發平台(例如桌上型/筆記型電腦或伺服器)上完成的,最後產生的二元檔再部署到嵌入式硬體上即可。為了要支持開發與部署這兩件事,Intel® Movidius™ Neural Compute SDK (NCSDK) 有兩種執行模式:

  1. Full SDK模式 – 在Pi安裝toolkit與API framework
  2. API-only模式 – 只在Pi安裝API framework
    • 安裝較快;但剖析(profiling)與編譯網路需在桌上型/筆記型電腦上完成

即便未安裝toolkit,API-only模式也讓您可以在Pi上開發各種app。API-only模式的限制在於無法剖析、檢查/驗證與編譯以及將神經網路編譯為二元graph檔。例如mvNCProfile、mvNCCheck與 mvNCCompile 都沒有安裝。

邊做邊學!

您會製作:

結合Raspberry Pi與NCS神經運算棒的嵌入式深度神經網路(DNN)影像處理系統。

您會學到:

  • 如何在Raspberry Pi的API-only模式下安裝NCSDK mode
  • 如何在Raspberry Pi上執行 NCS應用程式

您會需要:

  • Intel Movidius Neural Compute Stick 神經運算棒 – 購買請按我
  • 32/64位元的桌上型/筆記型電腦,作業系統須為Ubuntu 16.04 (“開發機器”)
  • Raspberry Pi (RPi) 3 Model B 單板電腦
  • 可外部供電的USB hub

如果還沒做的話,請在您的開發機器上安裝完整的NCSDK。請參考Intel Movidius NCS Quick Start Guide上的安裝步驟來完成。

開始吧!

Step 1:安裝Raspberry Pi為桌面模式,如下圖

樹莓派基金會取得最新的作業系統 Stretch img 檔之後,燒錄開機用的 sd卡。確認Raspberry Pi 開機並連上網路之後,使用以下指令更新系統:

注意:需使用 Raspbian Stretch,上一版 Jessie 確認不支援。

sudo apt-get update

Step 2:安裝Debian與Python相依套件

開啟terminal,輸入以下指令

sudo apt-get install -y libusb-1.0-0-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libatlas-base-dev git automake byacc lsb-release cmake libgflags-dev libgoogle-glog-dev liblmdb-dev swig3.0 graphviz libxslt-dev libxml2-dev gfortran python3-dev python-pip python3-pip python3-setuptools python3-markdown python3-pillow python3-yaml python3-pygraphviz python3-h5py python3-nose python3-lxml python3-matplotlib python3-numpy python3-protobuf python3-dateutil python3-skimage python3-scipy python3-six python3-networkx

您也可用pip package manager (pip3 install)來安裝python相依套件,但我發現用debian package manager (apt-get install python3-xxx)來安裝會比較快。

Step 3:下載NCSDK到Pi

開啟terminal,輸入以下指令

mkdir -p ~/workspace
cd ~/workspace
git clone https://github.com/movidius/ncsdk

Step 4:編譯並安裝NCSDK API framework

開啟terminal,輸入以下指令

cd ~/workspace/ncsdk/api/src
make
sudo make install

Step 5:使用NC App Zoo範例程式來測試安裝是否成功

開啟terminal,輸入以下指令

cd ~/workspace
git clone https://github.com/movidius/ncappzoo
cd ncappzoo/apps/hello_ncs_py
python3 hello_ncs.py

您應該會看到類似的輸出畫面:

Hello NCS! Device opened normally.
Goodbye NCS! Device closed normally.
NCS device working.

恭喜!您成功在Pi 的API-only模式下安裝NCSDK了。 

還能做什麼:部署已編譯的graph檔

Step 5中的hello_ncs_py範例程式只是開始NCS裝置就關閉了;它實際上並沒有執行任何推論。如果要在NCS上進行推論的話,we need a graph file that was generated by mvNCCompile,這是NCSDK Toolkit的一部分,但並沒有安裝在Pi上。

請改用已安裝完整SDK的開發用機器(桌上型/筆記型電腦),並根據 mvNCCompile doc page 上的教學,以GoogLeNet 來產生graph檔。將開發機器上的 ~/workspace/ncsdk/examples/caffe/GoogLeNet/graph 複製到 Pi 的 ~/workspace/ncappzoo/caffe/GoogLeNet/graph路徑下。

現在Pi 上有graph檔了,請根據NCS image classifier 的說明在Pi上執行影像分類器。

還可以試試

  • 在Raspberry Pi上執行NCS image classifier
  • 在RPi上編譯並執行C/C++ 範例程式:
    • ~/workspace/ncappzoo/apps/hello_ncs_cpp

延伸閱讀

相關文章:

 

 

[Movidius神經運算棒] 什麼!用電池就能驅動的深度學習推論引擎?

 

作者/攝影  曾吉弘
時間  3小時
成本
難度 * * * * * *
材料表
  • Intel Movidius Neural Compute Stick 神經運算棒
  • Raspberry Pi (RPi) 3 Model B 單板電腦 (OS需為最新的 Stretch)
  • Raspberry Pi 攝影機模組 (picam)或任何USB webcam
  • Raspberry Pi 觸碰螢幕
  • Raspberry Pi 觸碰螢幕外殼 [選配],也可用這款外殼:Pimoroni® case on Adafruit

(Original post from Intel Movidius NCS blog: “Battery-Powered Deep Learning Inference Engine”:https://movidius.github.io/blog/battery-powered-dl-engine/ )

 

加強邊緣裝置的視覺感知功能

鋰離子聚合物電池(LiPo、lithium polymer batteries)與嵌入式處理器兩者大大助長了物聯網(IoT)市場的發展。它們讓IoT裝置製造商得以在攜帶式(行動)邊緣裝置上加入更多功能,只要充電一次就可以執行相當長的時間。感測科技的長足進步,尤其是視覺相關的感測器、以及可處理來自這類感測器的超大量資料的軟體演算法,對於在更好的運算速度但又不能妥協於電池壽命與即時運算效能等方面上,這類行動邊緣裝置的需求受到了阻礙。

Intel® Movidius™ 視覺處理元件(Intel® Movidius™ VPU) 專門為可由電池供電的商用/企業級邊緣裝置提供即時視覺運算功能,這類裝置像是Google ClipsDJI® Spark droneMotorola® 360 cameraHuaRay® industrial smart cameras 等等。本文目標並非重製它們,而是要做一台小型手持裝置,運用深度神經網路(DNN)來即時辨識物體。

專案實體照片

 

邊做邊學!

您會製作:

一台可由電池(或行動電源)供電的DIY手持裝置,裝有攝影機與觸碰螢幕,可以辨識(分類)位於攝影機前方的物體。

您會學到:

  • 如何使用Raspberry Pi與Intel® Movidius™ NCS神經運算棒製作一台即時影像分類器。

您會需要:

  • Intel Movidius Neural Compute Stick 神經運算棒
  • Raspberry Pi (RPi) 3 Model B 單板電腦 (OS需為最新的 Stretch)
  • Raspberry Pi 攝影機模組 (picam)或任何USB webcam
  • Raspberry Pi 觸碰螢幕
  • Raspberry Pi 觸碰螢幕外殼 [選配],也可用這款外殼:Pimoroni® case on Adafruit

如果還沒完成的話,請在您的Raspberry Pi上安裝Intel Movidius NCSDK,完整SDK或API-only模式都可以。請參考Intel Movidius NCS Quick Start Guide來安裝完整SDK,或參考Run NCS Apps on RPi 來安裝API-only模式。

 

先看結果:

如果想先看看程式輸出結果的話,請用以下指令來取得範例程式並執行

$ mkdir -p ~/workspace

$ cd ~/workspace

$ git clone https://github.com/movidius/ncappzoo

$ cd ncappzoo/apps/live-image-classifier

$ make run

上述指另需在裝有完整SDK的系統中才可執行,單單安裝API framework 是不型的。另外也請確認已經在系統上接了一台UVC攝影機( 筆電內建攝影機也可運作).

這樣應該會在方形外框中看到即時串流影像。在攝影機前方放置一個物體並對齊方形。執行畫面請看本文最後的照片。

 

硬體建置

下圖是我硬體的實際照片:

 

Step1:設定螢幕

觸碰螢幕設定:請參考下方影片

畫面轉向:根據您所用的螢幕外殼或支架,您的畫面可能是倒過來的。如果是的話,請根據以下操作來將畫面反轉180度。

 

$ sudo nano /boot/config.txt



# 在/boot/config.txt 最後一行輸入以下內容,按下Ctrl-x存檔後離開

lcd_rotate=2



$ sudo reboot

如果您是使用USB攝影機的話請跳過STEP2

Step 2:設定攝影機

啟動CSI攝影機模組:請參考Raspberry Pi官方說明文件.

啟動v4l2 driver:基於不明原因,Raspbian預設不會去載入CSI攝影機模組用的V4L2 driver。本專題範例採用OpenCV-Python,作法是逐次使用V4L2來存取攝影機 (路徑:/dev/video0),所以我們得先載入V4L2 driver.

$ sudo nano /etc/modules



# 在/etc/modules最後一行輸入以下內容,按下Ctrl-x存檔後離開

bcm2835-v4l2



$ sudo reboot

來寫程式吧

我強力支持程式再運用,所以本專題的Python程式大部分是來自於[五步驟打造影像分類器]。兩者主要的差別在於我把每一個步驟整合在同一個函式中了,讀者可以比較一下。

本程式的架構不需要大幅修改就可以執行任何分類器神經網路。以下是一些使用者定義的參數:

  1. GRAPH_PATH:要進行推論的graph檔路徑
    • 預設值為 ~/workspace/ncappzoo/caffe/GoogLeNet/graph
  2. CATEGORIES_PATH:列出各分類輸出標籤的文字檔路徑
    • 預設值為 ~/workspace/ncappzoo/tensorflow/mobilenets/categories.txt
  3. IMAGE_DIM:所採用神經網路之影像尺寸規格
    • 例如 GoogLeNet 採用 224×224像素,AlexNet則是227×227像素
  4. IMAGE_STDDEV:您選用之神經網路所定義的標準差(scaling value)
    • 例如:GoogLeNet不採用任何比例因子,但InceptionV3的比例因子為128 (stddev = 1/128)
  5. IMAGE_MEAN:均值減法(Mean subtraction)是深度學習領域中常用的資料整理技巧。
    • 對ILSVRC資料集來說,B、G、R的平均值分別為102、117與123

在操作NCSDK API之前,需要先由 mvnc 函式庫匯入mvncapi 模組:

import mvnc.mvncapi as mvnc

如果您已經完成本連結的影像分類器的話,請跳過Step1 2 5

 

Step 1:開啟裝置

如同其他USB裝置,當您將NCS接上應用程式處理器 (執行Ubuntu的桌上型/筆記型電腦) 的USB埠,前者會被後者枚舉為一個USB裝置。我們可以呼叫API來檢視與開啟各個NCS裝置。

# —- Step 1: 開啟裝置並準備處理 ————-

def open_ncs_device():

   # 尋找 NCS裝置,如果沒有就離開程式

   devices = mvnc.EnumerateDevices()

   if len( devices ) == 0:

       print( ‘No devices found’ )

       quit()

 

   # 取得第一個枚舉裝置並開啟

   device = mvnc.Device( devices[0] )

   device.OpenDevice()

 

   return device

Step 2:將graph檔載入NCS

為了讓本專案簡單化,我們採用來自預訓練好的GoogLeNet模型的預編譯graph,這當您在ncappzoo資料夾中執行 make 指令時已經一併下載與編譯好了。先來看看如何將 graph 載入至NCS。

# —- Step 2: 將graph檔載入NCS ————————-

 

def load_graph( device ):

   # 讀取graph檔至緩衝

   with open( GRAPH_PATH, mode='rb' ) as f:

       blob = f.read()

 

   # 載入緩衝至NCS.

   graph = device.AllocateGraph( blob )

 

   return graph

 

Step 3:預處理來自攝影機的畫面

如影像分類器一文所述,分類器所用的神經網路會假設在影像中只有一個物體。但這件事在即時影像中很難掌控,除非您把桌面清理非常乾淨並採用單色背景。為了處理這件事,我們來偷雞一下。藉由OpenCV API在畫面上畫一個虛擬的盒子,並要求使用者把物件以手動方式對齊到盒子中;接著就切出這個盒子的區域並把該區域影像送到NCS進行分類。

# —- Step 3: 預處理影像 —————————————-

 

def pre_process_image():

   # 取得來自攝影機的一個畫面

   ret, frame = cam.read()

   height, width, channels = frame.shape

 

   # 切割畫面並調整大小

   x1 = int( width / 3 )

   y1 = int( height / 4 )

   x2 = int( width * 2 / 3 )

   y2 = int( height * 3 / 4 )

 

   cv2.rectangle( frame, ( x1, y1 ) , ( x2, y2 ), ( 0, 255, 0 ), 2 )

   cv2.imshow( 'NCS real-time inference', frame )

   cropped_frame = frame[ y1 : y2, x1 : x2 ]

   cv2.imshow( 'Cropped frame', cropped_frame )

 

   # 調整影像大小 [ 根據所選用的網路而異].

   cropped_frame = cv2.resize( cropped_frame, IMAGE_DIM )

 

   # 均值減法或縮放 [常見的資料置中方法].

   cropped_frame = cropped_frame.astype( numpy.float16 )

   cropped_frame = ( cropped_frame - IMAGE_MEAN ) * IMAGE_STDDEV

 

   return cropped_frame

 

Step 4:卸載影像/畫面至NCS來執行推論

感謝Intel Movidius VPU提供的高效能與低功耗,有了NCS之後,Raspberry Pi 唯一要做的事情就是預處理攝影機的畫面(step 3) 並丟給NCS。推論結果會以陣列來呈現,包含了各分類的機率值。透過 argmax() 可以取得 top prediction的索引值以以及相關於該索引的標籤內容。

# —- Step 4: 卸載影像,讀取與顯示推論結果 —————-

 

def infer_image( graph, img ):

   # 將所有分類目錄讀取至清單中

   categories = [line.rstrip('\n') for line in

                 open( CATEGORIES_PATH ) if line != 'classes\n']

 

   # 以半精度浮點數陣列載入影像.

   graph.LoadTensor( img , 'user object' )

 

   # 取得NCS推論結果.

   output, userobj = graph.GetResult()

 

   # 取得最高信心項目之索引值.

   top_prediction = output.argmax()

 

   # 顯示結果.

print( "Prediction: " + str(top_prediction)

         + " " + categories[top_prediction]

         + " with %3.1f%% confidence" % (100.0 * output[top_prediction] ) )

 

   return

如果您想看看NCS的實際輸出的化,請找到ncappzoo/apps/image-classifier.py並如以下修改:

# ---- Step 4: 讀取與顯示NCS的推論結果 -------------------

 

# 取得NCS推論結果.

output, userobj = graph.GetResult()

 

# 顯示輸出結果.

print( output )

...

 

# 顯示 top prediction.

for i in range( 0, 4 ):

   print( "Prediction " + str( i ) + ": " + str( order[i] )

         + " with %3.1f%% confidence" % (100.0 * output[order[i]] ) )

...

執行上述修改後的程式之後,它把整個會輸出陣列都秀出來。以下是使用37個分類的網路來進行推論的結果畫面,請注意陣列大小為37,且top prediction (73.8%)出現在陣列的30號位置(7.37792969e-01),如下紅字:

[ 0.00000000e+00   2.51293182e-04   0.00000000e+00   2.78234482e-04

0.00000000e+00   2.36272812e-04   1.89781189e-04   5.07831573e-04

6.40749931e-05   4.22477722e-04   0.00000000e+00   1.77288055e-03

2.31170654e-03   0.00000000e+00   8.55255127e-03   6.45518303e-05

2.56919861e-03   7.23266602e-03   0.00000000e+00 1.37573242e-01

7.32898712e-04   1.12414360e-04   1.29342079e-04   0.00000000e+00

0.00000000e+00   0.00000000e+00   6.94580078e-02   1.38878822e-04

7.23266602e-03   0.00000000e+00   7.37792969e-01   0.00000000e+00

7.14659691e-05   0.00000000e+00   2.22778320e-02   9.25064087e-05

0.00000000e+00]

Prediction 0: 30 with 73.8% confidence

Prediction 1: 19 with 13.8% confidence

Prediction 2: 26 with 6.9% confidence

Prediction 3: 34 with 2.2% confidence

 

Step 5:卸載graph檔並關閉裝置

為了避免記憶體洩漏與/或區段錯誤(segmentation fault),請記得關閉任何開啟中的檔案、資源以及 deallocate 使用中的記憶體。

# —- Step 5: 卸載graph檔並關閉裝置 ————————-

 

def close_ncs_device( device, graph ):

   cam.release()

   cv2.destroyAllWindows()

   graph.DeallocateGraph()

   device.CloseDevice()

 

   return

恭喜!DNN即時影像分析器完成囉!

 

專案實體照片

Rpi 上接了NCS神經運算棒與無線鍵盤發射器

RPi 與 Pi camera 的配置

分類”碗”的畫面

分類”滑鼠”的畫面

還能做什麼

  • 將本專案移植到執行Raspbian Lite 作業系統的 Raspberry Pi Zero上。
  • 本範例採用MobileNets來分類影像。試著加入分類年紀與性別的功能吧。
    • 提示:使用來自ncappzoo/caffe/AgeNet 與 ncappzoo/caffe/GenderNet 的graph檔。
  • 使用ncappzoo/SSD_MobileNet 或 Tiny YOLO,將本範例改為物件偵測(一張圖中有多個物體)

延伸閱讀

 

相關文章:

 

使用 Intel® Movidius™ Neural Compute Stick搭配Raspberry Pi 3執行MobileNets

(Original post from Intel Movidius NCS blog: “MobileNets on Intel® Movidius™ Neural Compute Stick and Raspberry Pi 3″:https://movidius.github.io/blog/ncs-rpi3-mobilenets/  

作者/攝影  曾吉弘
時間  2小時
成本需要上網下載的費用
難度 * * * * *
材料表

引言

深度學習之於邊緣運算讓世界各地的創新開發者得以建立各種架構與裝置來解決問題,並提出像是內建了Intel Movidius VPU 的 Google Clips Camera 這樣的創新方案。邊緣裝置應該便於攜帶、低功耗但同時又能為深度學習神經網路提供一定彈性的架構。本文將說明如何使用使用 Intel® Movidius™ Neural Compute Stick (神經運算棒) 搭配Raspberry Pi 3 做為深度學習邊緣運算的解決方案。

應用多個現成的分類網路,有許多具備一定擴充性的網路都提供了一定的客製化程度,針對使用者不同的功耗、運算與精確度需求來提供合適的方案。Google MobileNets就是這類網路其中之一,提供兩個可修改的變數讓您自訂網路來解決問題,並可在這類型低功耗裝置上實現高運算效能與高精確度。

 

* 資料來源:https://research.googleblog.com/2017/06/mobilenets-open-source-models-for.html

第一個變數為輸入影像的大小。如上圖,複雜度與精確度會隨著輸入大小而改變。Google 已針對不同影像尺寸提供了預先訓練好的ImageNet分類檢查點。

第二個變數則稱為depth multiplier。雖然網路架構維持不變,調整這個depth multiplier 會影響每一層的頻道(channel) 數量,進而影響網路複雜度並精確度與 frame rate。一般來說,網路的 frame rate 愈高,精確度就愈低。

接下來會介紹如何安裝並執行NCSDK、下載NCAppZoo,以及在 Intel Movidius 神經運算棒上執行MobileNet。最後要使用NCAppZoo 來示範benchmarkncs app 的用途,它可收集一或多個接在電腦 (例如 Pi ) 上的Intel Movidius 神經運算棒之執行效能。

 

所需硬體

Raspberry Pi 3、電源與記憶卡 (外殼建議有,但非必須)
  1. Raspberry Pi 3 外殼
  2. Raspberry PI 3 Model B
  3. micro SD記憶卡 (建議16g以上)
  4. 支援 HDMI 接頭螢幕 (或其他規格的轉接線)
  5. 鍵盤滑鼠
  6. Intel Movidius Neural Compute Stick

 

按部就班

Step 1:安裝最新的Raspberry Pi 3 Raspbian OS

樹莓派基金會取得最新的作業系統 Stretch img 檔之後,燒錄開機用的 sd卡。確認Raspberry Pi 開機並連上網路之後,使用以下指令更新系統:

注意:需使用 Raspbian Stretch,上一版 Jessie 確認不支援。

sudo apt-get update

Step 2:將 Intel Movidius神經運算棒插上Raspberry Pi 3 的 USB接頭

Step 3:安裝Intel Movidius Neural Compute SDK (NCSDK):

請用以下指令來下載並安裝NCSDK

git clone https://github.com/movidius/ncsdk
cd ncsdk
make install
cd ..

Step 4:取得NCAppZoo github

git clone https://github.com/movidius/ncappzoo
cd ncappzoo

Step 5:執行benchmarkncs.py來收集MobileNets執行效能

cd apps/benchmarkncs
./mobilenets_benchmark.sh | grep FPS

結果

在這些選項中,您一定可以根據自身的精確度與效能需求找到最適合的網路。下圖 (來源:Google’s blog) 可看出使用ImageNet分類時,精確度與效能的消長關係。圖中也可看到 Intel Movidius神經運算棒的效能(單位FPS,數據未經Intel原廠確認)。

* Network Accuracy Data from Google’s Blog https://research.googleblog.com/2017/06/mobilenets-open-source-models-for.html

如上圖,Raspberry Pi 3 搭配 Intel Movidius神經運算棒(橘色線)與單單使用Raspberry Pi 3 相比,前者執行 MobileNets 的FPS速度為後者的9倍 (參數皆為DepthMultiplier=1.0 / 輸入影像大小 = 224×224 / Top5 accuracy of 89.5%)。

Raspberry Pi 是一個相當不錯的開發平台。雖然單單使用Raspberry Pi 3 在推論上已能達到相當不錯的frame rate,NCS 卻硬是把效能提升一個量級,並讓這個平台在執行CNN-based的神經網路時的效能更好。如上表,Intel Movidius神經運算棒搭配Raspberry Pi 3 來使用 MobileNets進行推論運算的效能成長了 718% 到 1254%。