Intel Movidius神經計算棒是一個USB外型的神經網絡計算加速引擎,基于Myriad 2芯片,這是Intel收購的Movidius公司的推出的VPU(Visual Processing Unit), 用于加速神經網絡計算,適用于低功耗需求的應用。Movidius NCS可以配合單板計算機板如樹莓派、BeagleBone、Up Board等使用,當然,還有一些特殊的板子如本文的主角PYNQ-Z1。目前上面這些板子都可以單獨運行神經網絡軟件,但是在速度上并不是很快,所以它們在快速移植應用的領域潛力不大,但是如果配合一根Movidius NCS,所有復雜的神經網絡計算都可以傳輸到Myriad 2芯片上,這就可以實現極其快速的推斷時間。
為什么Movidius NCS與PYNQ-Z1 FPGA開發板特別適合?目前,人工智能和神經網絡正在許多應用中找到新的用途,但其中最大、發展最快的是計算機視覺。PYNQ-Z1是當今開發嵌入式視覺應用程序的最佳平臺之一,原因如下:它具有HDMI輸入和HDMI輸出,并且它具有FPGA架構,可用于硬件加速圖像處理算法。所以,嘗試將這些匹配起來,看看可以實現哪些好玩、有趣的內容。
在開始之前可能很多工程師還有疑問:為什么不直接在Zynq FPGA上加速神經網絡?這不才是在PYNQ-Z1開發板上實現加速神經網絡的的理想方式嘛,況且之前就有過在賽靈思FPGA上完成的項目(QNN和BNN項目)。不幸的是,神經網絡非常耗費資源,PYNQ-Z1擁有成本較低的Zynq器件之一,其中FPGA資源可能對神經網絡有一定的限制(這是一個非常普遍的陳述,但顯然取決于你希望的網絡來做)。在筆者看來,PYNQ-Z1上的FPGA資源更好的利用方式是用于圖像處理,以支持外部實現的神經網絡,例如NCS。
安裝硬件
OK,言歸正傳,我們來看看如何在PYNQ-Z1 FPGA開發板上實現NCS運行。首先,您要將Movidius NCS連接到PYNQ-Z1開發板,但要做到這一點,您需要一個帶電的 USB集線器,因為功耗問題,因為你會發現PYNQ-Z1本身無法為NCS提供足夠的電流。筆者首先嘗試沒有USB集線器的情況下PYNQ-Z1甚至不會啟動。是的,所以說這篇文章的封面圖是有誤導性的,但它更簡單,它讓你感興趣,不是嗎?
設置PYNQ-Z1的MicroSD卡
你需要在PYNQ-Z1上安裝大量Linux和Python軟件包,因此建議為PYNQ-NCS項目使用單獨的、全新的MicroSD卡,使用Win32DiskImager將預編譯的PYNQ鏡像燒錄。
安裝依賴關系
啟動PYNQ-Z1,然后當LED閃爍時,打開Web瀏覽器訪問Jupyter(http:// pynq:9090)。使用密碼“xilinx”登錄Jupyter,然后從屏幕右側的下拉菜單中選擇New-> Terminal。在此Linux終端中,你可以使用以下命令安裝依賴項。請注意,你應該已經以root身份登錄,因此不需要在這些命令中使用“sudo”:
apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev apt-get install -y libopencv-dev libhdf5-serial-dev apt-get install -y protobuf-compiler byacc libgflags-dev apt-get install -y libgoogle-glog-dev liblmdb-dev libxslt-dev
為了節省時間,這些命令僅安裝尚未構建到預編譯的PYNQ-Z1鏡像中的軟件包。如果你不是從標準的PYNQ-Z1鏡像開始,那么安裝Raspberry Pi的Movidius指南(它們與PYNQ-Z1相同)中顯示的所有依賴關系可能會更好。
安裝NCS SDK(僅限API模式)
該NCS SDK包含了一個工具包和API。該工具包用于分析,編譯和調整神經網絡,而API則用于將應用程序與NCS連接,這里只安裝API。我們通常會在開發PC上安裝Toolkit,但這篇文章不會詳細討論這些細節。Jupyter中的終端通常會讓你進入/home/xilinx目錄。您可以從該目錄運行以下命令來下載NC SDK和NC App Zoo。
mkdir workspace cd workspace git clone https://github.com/movidius/ncsdk git clone https://github.com/movidius/ncappzoo
進入API源代碼目錄。
cd ncsdk/api/src
在這個目錄中有一個用于編譯和安裝API的Makefile。我們需要對其進行小小的修改,以便將Python庫安裝到Python 3.6而不是Python 3.5。Makefile使用vi編輯器打開進行編輯。
vi Makefile
一旦進入vi編輯器,按“i”命令開始插入文本,使用箭頭向下導航到對“python3”的引用,將光標放在它的末尾,并在該引用的末尾添加“.6”(它應該讀取“python3.6”)。然后按ESC退出插入模式并輸入“:x”(冒號然后x),然后按ENTER保存該文件。
現在我們可以編譯并安裝API。
make make install
安裝NC App Zoo
在NCS App Zoo含有大量的可以借鑒的例子應用,我們將使用其中的一個與我們的NCS一起進行簡單的測試。
cd ../../../ncappzoo/apps/hello_ncs_py
我們將再次修改這個目錄下的Makefile文件,用“python3.6”代替“python3”,修改并保存。
vi Makefile
運行該示例。
make run
可以看到以下輸出:
making run python3.6 hello_ncs.py; Hello NCS! Device opened normally. Goodbye NCS! Device closed normally. NCS device working.
現在我們可以嘗試PYNQ-Z1的YOLO項目,并使用預先編譯好的Graph文件(通常我們必須在PC機上使用NCS工具包編譯graph文件)。首先克隆YOLO作為PYNQ-Z1項目。
cd /home/xilinx/jupyter_notebooks git clone https://github.com/fpgadeveloper/pynq-ncs-yolo.git
然后我們下載編譯好的graph文件。
cd pynq-ncs-yolo wget "http://fpgadeveloper.com/downloads/2018_04_19/graph"
現在我們可以運行YOLO單鏡像示例。
cd py_examples python3.6 yolo_example.py ../graph ../images/dog.jpg ../images/dog_output.jpg
你應該得到這個輸出:
Device 0 Address: 1.4 - VID/PID 03e7:2150 Starting wait for connect with 2000ms timeout Found Address: 1.4 - VID/PID 03e7:2150 Found EP 0x81 : max packet size is 512 bytes Found EP 0x01 : max packet size is 512 bytes Found and opened device Performing bulk write of 865724 bytes... Successfully sent 865724 bytes of data in 211.110297 ms (3.910841 MB/s) Boot successful, device address 1.4 Found Address: 1.4 - VID/PID 03e7:f63b done Booted 1.4 -> VSC total time is " milliseconds 285.022 (768, 576) class : car , [x,y,w,h]=[566,131,276,128], Confidence = 0.29101133346557617 class : bicycle , [x,y,w,h]=[384,290,455,340], Confidence = 0.24596166610717773 root@pynq:/home/xilinx/jupyter_notebooks/pynq-ncs-yolo/py_examples#
在Jupyter中,您將能夠瀏覽輸出圖像并查看它(/pynq-ncs/yolo/images/dog_output.jpg)。
最終,你應該能在PYNQ-Z1開發板上運行YOLO項目,視頻演示如下。
在視頻中,當我們不用軟件進行任何調整大小的操作時,我們會得到約3fps的視頻。當我們在軟件中進行大小調整時,幀頻下降到大約1.5fps。如果我們將調整大小的操作放到FPGA上運行,我們會將幀速率提高到3fps,如果我們使用線程和Zynq-7000 SoC中的第二個處理器,我們應該能夠將其提升到6fps。