ARM+Movidius VPU 目标识别调试笔记(一)
?
寫在前面
Movidius 是一家被Intel收購的計算機視覺創業公司。Intel收購Movidius之后,在AI和邊緣計算方面的布局又增加了一支生力軍。Movidius的AI芯片分為Myriad x VPU和Myriad 2 VPU兩種。
最近我用Myraid VPU做了一個項目,目標是開發一款目標識別的智能相機。硬件方面使用的是海思3516D做為主芯片,VPU作為深度學習加速芯片。硬件使用的是桐燁科技的智能相機,在此感謝桐燁科技老總的友情贊助以及朋友們的幫助。首先我們可以看看桐燁科技這款相機的技術分析,然后我們再看看這款相機的產品說明。有興趣的朋友們千萬要認準桐燁科技哦。
?
功能設計
通過查看前面的一些鏈接和技術博客,使我們對硬件信息有了基本的了解。
那么如果要在這個智能相機上實現目標識別的應用,我們大致需要研究完成以下幾件工作:
1、實現主芯片Hi3516D和VPU之間的通信。
2、將目標識別的算法模型導入到VPU上運行。
3、從VPU中獲取目標識別的結果。
4、實現目標識別結果的可視化。
5、算法耗時、準確率、召回率等指標的測試。
所以,下文的調試筆記我也準備按照以上這幾個階段來記錄。
?
通信功能
我們看硬件通信鏈路,硬件上,Hi3516D和VPU通過USB2.0通信。既然是使用的USB,那這樣就比較方便調試了,支持熱插拔,調試時可以隨意在PC端和嵌入式端切換。實際上在調試的過程中,我也多次這樣切換后進行對比,先保證VPU板在PC端運行正常,然后再往嵌入式端進行移植。
軟件上,要實現通信功能,首先需要安裝SDK、看demo、運行demo。只有先把官方的demo跑通,才能確保后面的工作順利進行。
?
SDK環境搭建
說到Movidius的SDK,很容易能搜索到,文末列出的參考鏈接[1]中就詳細記錄了VPU的NCSDK的安裝過程以及環境搭建過程。另外就是,前段時間聽說Intel有一套叫做OpenVino Toolkit,這套工具庫提供了一套邊緣計算的解決方案,為Intel的幾套用于邊緣計算的芯片方案搭建了一個集成的中間件平臺。它囊括的硬件AI芯片包括:FPGA、Atom、GPU和Moviduis,我暫時還沒去花精力研究這套解決方案,所以暫時也不太清楚能否用在我手頭上的這套智能相機上。看得出Intel在邊緣計算方面確實是煞費苦心。
言歸正傳,說回到Movidius Ncsdk環境搭建。
網上搜索一下,發現很多人在樹莓派上面搭建環境,基本操作都是先從python安裝開始,在python環境之上安裝Ncsdk的python版本。但是,其實Ncsdk是有C語言版本的,而且,如果我們要在智能相機上面移植一個python3,很顯然是不切實際的。既然Ncsdk支持C語言版本,那么移植python3就完全沒有必要了。
下面來說說SDK移植的詳細步驟:
1、安裝Ncsdk
Ncsdk linux版本需要安裝在ubuntu 64位版本上,所以我使用的是ubuntu 16.04虛擬機來進行安裝,安裝過程參考文末的參考鏈接[1]或者[2],整個安裝過程是基于python3的環境進行自動安裝,基本上安裝問題不大,如果出現問題應該就是一些依賴庫版本不匹配之類的問題導致的。
安裝后的目錄結構如下圖一所示:
其中NCSDK-2.05.00.02.tar.gz壓縮包是安裝過程中自動下載的,真正的SDK源碼和工具等都在這里面。
api目錄:這個目錄是從?NCSDK-2.05.00.02.tar.gz 包中解壓出來的api源碼;
docs目錄:這個目錄是幫助文檔的存儲路徑;
examples目錄:這個目錄是官方demo的存儲路徑;
extras目錄:這個是docker存儲路徑;
同時,默認在/opt路徑下面生成一個名為 movidius 的目錄,目錄結構如下圖二所示:
其中NCSDK目錄里面存放了一些api和編譯計算圖的工具,這些工具在后面會用到,其他的兩個文件夾暫不關注,因為我在項目中使用的是tensorflow作為深度學習模型開發框架,所以沒有關注caffe部分。
至此,基于ubuntu的Ncsdk就安裝完成了,此時我們就可以運行一些demo了。demo的驗證部分我放到后面去說,因為我們最終是要將sdk運行在Hi3516D上面,所以需要移植出基于armv7l的sdk,下面就說說移植過程。
2、移植SDK
將SDK移植到ARM上需要編譯出兩個庫文件:libmvnc.so、libusb.so。
libmvnc.so:這個庫是提供了VPU的相關調用接口的實現,這個庫是通過Ncsdk下面api目錄中的src編譯生成。
libusb.so:這個庫是提供的usb設備調用接口,Ncsdk中直接通過調用該庫來實現usb通信,所以我們使用開源庫編譯即可。
移植過程時需要使用Hi3516D的SDK,Hi3516的SDK需要在ubuntu 32位系統下安裝和編譯目標程序。
所以,我需要切換到一個32的ubuntu虛擬機去編譯mvnc庫文件,編譯配置如下:
1、安裝的是060版本的SDK,使用的交叉編譯器為arm-hisiv400-linux-gcc。
2、進入到圖一所示的Ncsdk根目錄,編譯命令為:
make api ARCH=arm CC=arm-hisiv400-linux-gcc3、編譯過程中會因為C庫的原因出現一些編譯錯誤,所以需要稍微改動改動Makefile文件和源文件,解決編譯報錯即可。
4、我們的目標是編譯出libmvnc.so庫即可,在沒安裝python環境時,會出現一些其他的報錯信息,如下:
/bin/sh: python3: command not found Traceback (most recent call last):File "<string>", line 1, in <module> AttributeError: 'module' object has no attribute 'getsitepackages'這些錯誤信息都可以忽略。
編譯完成之后會生成一個libmvnc.so,大小大概在100KB左右。
有了這兩個動態庫,我們就可以將SDK中的demo程序拷貝到板端進行驗證了。
3、驗證SDK
軟件的世界,從HelloWorld開始,所以理所當然Ncsdk中提供了一個hello_ncs_cpp的demo程序。
進入到圖一所示的路徑,在 examples\app\hello_ncs_cpp 中,我們編譯出?hello_ncs_cpp 程序即可。運行該程序需要三個依賴文件:
1、libmvnc.so
2、libusb.so?
3、MvNCAPI-ma2450.mvcmd:VPU 的固件,默認的程序在打開設備,獲取設備handle時需要先將固件燒錄到VPU中。固件文件存放在?api/src/mvnc 目錄,如果固件不存在,會出現如下圖三所示的錯誤打印:
# ./hello_ncs_cpp ncDeviceOpen: 506, File path ./mvnc/MvNCAPI-ma2450.mvcmd W: [ 0] ncDeviceOpen:510 ncDeviceOpen() XLinkBootRemote returned error 3 Error- ncDeviceOpen failed ncStatus value: -2 D: [ 0] XLinkConnect:782 XLinkConnect() device name 1.4-ma2450 usb 1-1.4: new high-speed USB device number 11 using hiusb-ehci when arch is arm D: [ 0] dispatcherStart:673 dispatcherStart() starting a new thread - schedulerId 0 D: [ 0] dispatcherAddEvent:531 receiving event USB_PING_REQ 0 D: [ 0] addNextQueueElemToProc:371 received event USB_PING_REQ 0 D: [ 0] eventSchedulerRun:432 eventSchedulerRun() schedulerId 0 D: [ 0] dispatcherRequestServe:288 ------------------------UNserved USB_PING_REQ D: [ 0] dispatcherEventSend:726 sending 5 10 D: [ 0] eventReader:234 Reading USB_WRITE_REQ (scheduler Id 0, fd 0x1d14330) usbdev114 -> /dev/usbdev1.11如果需要屏蔽加載過程,需要把Makefile中的 #CFLAGS+=-DXLINK_NO_BOOT 注釋打開。
如果以上三個文件都正確,程序會順利執行。
經過以上這些調試工作,我們就調通了主芯片和VPU之間的通信,接下來就針對算法導入功能進行詳細地說明。請看參考鏈接[3]中的內容。
?
參考鏈接
[1]、Movidius NCS SDK環境搭建
[2]、Movidius 官網
[3]、ARM+Movidius VPU 目標識別調試筆記(二)
總結
以上是生活随笔為你收集整理的ARM+Movidius VPU 目标识别调试笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html分级管理目录,卫生部抗菌药物临床
- 下一篇: 药学【25】