前言
說起 OpenVINO,可能很多人沒啥印象。但是如果改說 Intel Movidius 神經運算棒 (Neural Compute Stick,簡稱 NCS),那就應該會有不少人發出”喔”的一聲。嚴格來說,NCS 並非很新的產品。即使是第二代的 NCS (亦即 NCS2),也已經是去年 (2018) 年底就推出市場的產品了。只不過目前中文的資料相對來說還是比較欠缺些,所以還是值得好好介紹一下。

Intel Neural Compute Stick 2
NCS/NCS2 的外觀就像一個大尺寸的 USB 硬碟,透過 USB 的隨插即用,提供一般設備一定的人工智慧運算能力。尤其對像樹莓派這種小型電腦裝置而言,很難像一般電腦可利用顯示卡或類似的介面卡獲得人工智慧的運算能力,因此使用 USB 方式的外接運算設備,就是較為可行的解決方案。根據著名的 pyimagesearch.com 上的一篇文章,在 Raspberry Pi 3 Model B+ 使用搭配 OpenVINO 的 NCS 2 其運算速度與單純的 Raspberry Pi 3 Model B+ 相較有大幅度的提升。
在你採購 Intel Movidius 神經運算棒之前,請注意下列幾點:
- 目前市面上同時可見一代與二代兩種產品,常又分別稱為 NCS 與 NCS2。兩者之間只有幾百塊的價差,但是效能部分卻有很大的差距(至少 Intel 如此宣稱),所以不用想,買 NCS2 就對了。
- 雖然 Raspberry Pi 3 Model B/B+ 本身擁有四個 USB 插槽,但是因為 NCS/NCS2 實在太胖,一旦插上就會擋住其他三個 USB 插槽的使用,因此建議利用 USB 延長線來連結樹莓派與 NCS/NCS2。
- 當同時插上多個 NCS/NCS2 時,可以達到進一步的加速效果。但是實際的成效則需要更嚴謹的評估方式。
簡單介紹完了 NCS/NCS2,那麼 OpenVINO 又是甚麼東西?簡單來說,OpenVINO 就是由 Intel 所釋出基於 CNN 的人工智慧開發工具包。既然是 Intel 所推出的工具包,當然基本上是一定優先支援 Intel 的硬體,其中自然也包含了 NCS/NCS2。除此之外,Intel 在官網上亦提到,OpenVINO 主要可用於視覺方面的邊緣運算加速。
在接下來的兩篇文章中,我們將一步步在樹莓派下完成 OpenVINO 與 OpenCV 的安裝,並撰寫 Python 程式使用人工智慧來進行影像的判斷。過程需要一點時間,請先準備好一杯咖啡陪伴著吧。
好了,廢話不多說,我們就實際來看看如何利用 NCS/NCS2 來讓我們的樹莓派變得更聰明吧!
前置作業
我們需要先準備下列設備:
- Raspberry Pi 3 Model B 或 B+
- NCS2 或 NCS (如果你已經有 NCS 的話)
- 16 GB 以上的記憶卡,並安裝最新版的 Raspbian Stretch 作業系統
- USB 延長線
樹莓派開機後,可以選擇直接本機操作,或是利用網路進行遠端操作。因為後面的範例需要使用圖形介面,所以如果是遠端操作必須開放 VNC Server 的連線。
安裝套件
首先,我們必須在 Raspbian Stretch 中安裝必要的套件,依序分別執行下列指令:
1 | sudo apt-get update && sudo apt-get upgrade |
1 | sudo apt-get install libjpeg-dev libpng-dev libtiff5-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev |
1 | sudo apt-get install cmake libgtk-3-dev libcanberra-gtk* |
1 | sudo apt-get install libatlas-base-dev gfortran |
1 | sudo apt-get install vim |
下載並安裝 OpenVINO
建立安裝目錄
1 2 3 | cd /opt sudo mkdir -p intel cd intel |
下載並解開 OpenVINO 壓縮包,目前 (2019/05/28) 最新版本為 2019 R1。
1 2 3 | sudo wget https://download.01.org/opencv/2019/openvinotoolkit/R1/l_openvino_toolkit_raspbi_p_2019.1.094.tgz sudo tar xf l_openvino_toolkit_raspbi_p_2019.1.094.tgz sudo mv inference_engine_vpu_arm openvino |
設定並初始化 OpenVINO 所需環境
利用編輯器 (如 vim) 修改檔案 /opt/intel/openvino/bin/setupvars.sh
1 | sudo vim /opt/intel/openvino/bin/setupvars.sh |
將
1 | INSTALLDIR= |
修改為
1 | INSTALLDIR=/opt/intel/openvino |
利用 source 指令使其生效
1 | source /opt/intel/openvino/bin/setupvars.sh |
程式執行完後畫面應顯示
1 | [setupvars.sh] OpenVINO environment initialized |
設定每次登入時自動初始化 OpenVINO 環境
在每次使用 OpenVINO 前,我們都必須正確地初始化 OpenVINO 環境。我們可以透過 ~/.bashrc 設定檔,讓我們在每次登入時自動初始化 OpenVINO 環境。利用編輯器 (如 vim) 修改 ~/.bashrc
1 | vim ~/.bashrc |
在檔案最後加上
1 | source /opt/intel/openvino/bin/setupvars.sh |
雖然這樣做很方便,但是如果你的樹莓派安裝了多個 Python 的虛擬環境,而且同時包含了一般的 OpenCV 與支援 OpenVINO 的特別版 OpenCV,將會變成每次引用 OpenCV 都變成特別版,進而造成程式的錯誤。因此你可以自行判斷是否需要執行此一非必要性的設定。
安裝 NCS/NCS2 裝置的規則
執行下列指令
1 | sudo sh /opt/intel/openvino/install_dependencies/install_NCS_udev_rules.sh |
程式執行完後畫面應顯示
1 2 | Update udev rules so that the toolkit can communicate with your neural compute stick [install_NCS_udev_rules.sh] udev rules installed |
測試 OpenVINO 與 NCS/NCS2 是否正常運作
如果我們僅是為了在 Python 下使用 OpenCV,這一段的測試其實是可以略過的。不過如果你在後面的過程中遇到錯誤,或許你可以回到這裡利用此處的方法來確認 OpenVINO 環境與 NCS/NCS2 是否正常運作。
初始化 OpenVINO 環境
在此過程中我們需要編譯 OpenVINO 的程式,編譯過程全程使用 root 權限。為了方便我們直接切換成 root 身分,並重新初始化 OpenVINO 環境。請依序執行下列指令
1 | sudo su - |
1 | cd /opt/intel/openvino |
1 | source bin/setupvars.sh |
增加虛擬記憶體
因為編譯過程需要耗用較多的記憶體,因此我們透過增加虛擬記憶體的方式來避免發生記憶體不足的錯誤。
利用編輯器 (如 vim) 修改檔案 /etc/dphys-swapfile
1 | vim /etc/dphys-swapfile |
將
1 | CONF_SWAPSIZE=100 |
修改為
1 | CONF_SWAPSIZE=2048 |
重新啟動虛擬記憶體服務
1 2 | systemctl stop dphys-swapfile systemctl start dphys-swapfile |
進行編譯
請依序執行下列指令
1 | mkdir build && cd build |
1 | cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=armv7-a" /opt/intel/openvino/deployment_tools/inference_engine/samples |
1 | make -j2 object_detection_sample_ssd |
恢復虛擬記憶體設定
利用編輯器 (如 vim) 修改檔案 /etc/dphys-swapfile
1 | vim /etc/dphys-swapfile |
將
1 | CONF_SWAPSIZE=2046 |
修改回
1 | CONF_SWAPSIZE=100 |
重新啟動虛擬記憶體服務
1 2 | systemctl stop dphys-swapfile systemctl start dphys-swapfile |
測試人臉辨識範例程式
OpenVINO 提供不少範例程式,在此我們僅測試人臉辨識的部分。
首先,我們從線上抓取訓練過的模型與參數
1 2 | wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R1/models_bin/face-detection-adas-0001/FP16/face-detection-adas-0001.bin wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R1/models_bin/face-detection-adas-0001/FP16/face-detection-adas-0001.xml |
接著取得有人臉的圖片,在此我們使用網路上的免費資源,指令與圖片內容如下:
1 | wget "https://images.pexels.com/photos/1308783/pexels-photo-1308783.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" -O pexels-photo.jpg |
執行範例程式
1 | ./armv7l/Release/object_detection_sample_ssd -m face-detection-adas-0001.xml -d MYRIAD -i pexels-photo.jpg |
程式執行完不會有任何的訊息文字,不過我們可以在目錄下發現一個名為 out_0.bmp 的檔案,打開後可以發現圖片上的三張臉孔已經被正確地標上方形的框線,如下圖所示:
至此,我們順利地完成了 OpenVINO 的安裝。休息一下,好好品嘗手邊的咖啡,然後繼續進行 OpenCV 的安裝吧。

