本教程以飛淩嵌入式RK3399平台為例,講述主動模式和被動模式的人工智能計算棒部署流程。
硬 件 平 台
平台:OK3399-C開發闆
系統:Desktop
子產品:TB-RK1808S0
環境準備:飛淩OK3399-C開發闆,RK1808人工智能計算棒(固件版本為V1.3.4),usb攝像頭,攝像頭和計算棒都插入OK3399-C開發闆。
使用lsusb指令檢視,如下(紅框部分2207:0018即為RK1808人工智能計算棒):
輸入指令如下:
注意:因為被動模式需要安裝的庫檔案較多,占用空間較大,是以需要擴大rootfs分區,修改param/parameter.txt檔案0x00f00000@0x0005a000(rootfs) //0x f00000個塊(512位元組)=7.5G
改為
0x01800000@0x0005a000(rootfs) //0x1800000個塊=12G
修改後進入系統,檢視分區大小:
概 述
AI計算區分為四個不同的象限,分别是雲端訓練、雲端推理,邊緣訓練以及邊緣推理。其中終端推理,幾乎都集中在Arm架構生态上。AI神經網絡計算目前可以通過CPU、GPU、DSP、NPU、FAGA等完成,但不同的硬體特性會導緻效率和功耗的不同。其中NPU——嵌入式神經網絡處理器采用“資料驅動并行計算”的架構,最擅長的就是視訊、圖像類的海量多媒體資料的處理,并且相比GPU等具有更低的功耗。我司推出OK3399-CDesktop+RK1808(含3Tops算力NPU)的組合,在滿足AI邊緣計算的情況下,使得功耗大幅降低。
RK1808人工智能計算棒是一個專用AI應用子產品,擁有主動模式和被動模式兩種模式。
主動模式下:RK1808人工智能計算棒作為主動裝置,RK1808人工智能計算棒内部預設已安裝rknn-toolkit和rknn-api,上位機(也稱主控端)無需安裝rknn-toolkit和rknn-api,模型及算法固化在RK1808人工智能計算棒中,OK3399-C通過USB口向計算棒輸入資料(例如圖檔和視訊流),RK1808人工智能計算棒自動完成資料的前處理、推理、後處理,然後把處理結果通過USB口輸出給OK3399-C。
為了友善使用者通過USB口傳輸資料,RK1808人工智能計算棒會把USB口虛拟成網卡等标準裝置,使用者隻需通過标準裝置接口的操作(例如網絡的socket程式設計)即可完成對RK1808人工智能計算棒資料的輸入和輸出。
被動模式下:OK3399-C通過RKNN-Toolkit将模型及前處理後的資料傳輸給RK1808人工智能計算棒,RK1808人工智能計算棒完成推理,并把結果傳回OK3399-C,OK3399-C進行後處理以及顯示等操作。
主 動 模 式
細節如下:
1. RK1808計算棒插入上位機後,會被虛拟成網卡裝置;
2. 上位機OK3399-C進行虛拟網卡配置,配置IP為192.168.180.1,保證上位機和1808中間的網絡連接配接正常;
3. 計算棒預設IP為192.168.180.8,賬号密碼皆為toybrick,使用者可以SSH登入計算棒,拷貝模型和server服務程式到計算棒;
4. 計算棒端運作server服務程式,用來接收上位機的連接配接請求,并調用RKNN進行處理,再傳回結果;
5. 上位機運作client程式,連接配接server成功之後,發送推理請求,從1808端擷取傳回結果。
1-計算棒網絡配置與網絡共享配置
1、計算棒網絡配置
上位機使用OK3399-C Forlinx Desktop系統,點選右下角網絡按鈕選擇彈出視窗中的“EditConnections...”選項:
選擇計算棒usb網卡生成的有線網絡節點:
配置該節點為手動模式,設定IP:192.168.180.1,子網路遮罩:255.255.255.0,并儲存:
終端輸入ifconfig指令檢視網絡節點配置如下,可見usb網卡配置完成:
ping一下1808計算棒網絡192.168.180.8,如下網絡可以連通:
使用ssh登入1808計算棒,使用者名和密碼預設都為toybrick,如下登陸成功:
2、網絡共享配置
運作ifconfig,可以看到eth0、wlan0等主控端網卡,我們用于通路外網,enx10dcb69f022c為USB網卡(RK1808人工智能計算棒虛拟網卡)。不同的系統網卡名稱可能不一樣,以實際網卡名稱為準。
首先配置主控端網絡,使主控端可以連通以太網,這裡我們使用wlan0節點來上網,具體配置不再贅述。
指令行執行如下指令,其中enx10dcb69f022c需要修改成使用者本地實際值;正常情況隻要設定一次即可,若拔插裝置發現網卡名稱改變了或者使用者手動删除該網卡,則需要重新設定。
1. sudo nmcli connection add con-name toybrick type ethernet ifname enx10dcb69f022c autoconnect yes ip4 192.168.180.1/24
配置NAT功能,執行如下指令,其中eno1需要修改成使用者本地實際值;關機失效,是以每次電腦重新開機都要重新設定。
1. sudo sysctl -w net.ipv4.ip_forward=1
sudo iptable -F
sudo iptables -t nat -F
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
注意:以自己開發闆聯網的實際端口為準,例:eth0
iptables指令部分釋義如下:
iptables --help
--flush -F [chain] Delete all rules in chain or all chains
--table -t table table to manipulate (default: `filter')
--append -A chain Append to chain
--jump -j target target for rule (may load target extension)
MASQUERAD,位址僞裝,算是snat中的一種特例,可以實作自動化的snat
SNAT是source networkaddress translation的縮寫,即源位址目标轉換。比如,多個PC機使用ADSL路由器共享上網,每個PC機都配置了内網IP,PC機通路外部網絡的時候,路由器将資料包的報頭中的源位址替換成路由器的ip,當外部網絡的伺服器比如網站web伺服器接到通路請求的時候,他的日志記錄下來的是路由器的ip位址,而不是pc機的内網ip,這是因為,這個伺服器收到的資料包的報頭裡邊的“源位址”,已經被替換了,是以叫做SNAT,基于源位址的位址轉換。
DNAT是destinationnet workaddress translation的縮寫,即目标網絡位址轉換,典型的應用是,有個web伺服器放在内網配置内網ip,前端有個防火牆配置公網ip,網際網路上的通路者使用公網ip來通路這個網站,當通路的時候,用戶端發出一個資料包,這個資料包的報頭裡邊,目标位址寫的是防火牆的公網ip,防火牆會把這個資料包的報頭改寫一次,将目标位址改寫成web伺服器的内網ip,然後再把這個資料包發送到内網的web伺服器上,這樣,資料包就穿透了防火牆,并從公網ip變成了一個對内網位址的通路了,即DNAT,基于目标的網絡位址轉換。
2、主動模式Mobilenet-ssd測試
01 環境要求
1)參考“計算棒網絡配置與網絡共享配置”章節,完成RK1808人工智能計算棒網絡配置(RNDIS)以及網絡共享配置。
2)主控端需要插入USB攝像頭,并連接配接顯示器。
02 部署計算棒程式
SSH方式
該方式通過ssh連接配接到RK1808人工智能計算棒,運作相應程式。
計算棒系統使用者名:toybrick 密碼:toybrick
計算棒系統使用者名:root 密碼:toybrick
建議用toybrick使用者登入
1)使用官方連結下載下傳Mobilenet-SSD主動模式demo軟體包,解壓,連結如下:
https://eyun.baidu.com/s/3htJNFwS
2)拷貝解壓目錄中的1808目錄至計算棒
1. scp -r 1808/ [email protected]:/home/toybrick/
3)ssh進入計算棒
1. ssh [email protected]
4)安裝依賴包
1. sudo dnf install -y cmake make
5)編譯
1. cd 1808/mkdir buildcd build/cmake ..make -j4
6)直接運作程式或設定程式為開機啟動
•直接運作:
1. ./1808_ssd_demo
3、部署上位機程式(以OK3399-Cdesktop為例)
1)安裝依賴包make/cmake/opencv
1. sudo apt-get install -y make cmake libopencv-dev
2)進入Mobilenet-SSD主動模式demo軟體包中的host目錄,修改host/ssd_demo.cpp,根據開發闆實際情況修改打開的攝像頭節點:
1. cd host/
2. int main(void)
3. {
4. //ret = test.run(VIDEO_NODE, post_process, &data);
5. ret = test.run("/dev/video10", post_process, &data);
6. }
3)編譯
1. mkdir buildcd build/cmake ..make -j4
4)計算棒程式運作起來後,運作上位機程式
1. ./ssd_demo
效果如下:
3、主動模式yolov3測試
01環境要求
1)參考“計算棒網絡配置與網絡共享配置”章節,完成RK1808人工智能計算棒網絡配置(RNDIS)以及網絡共享配置。
2)OK3399-C開發闆需要插入USB攝像頭,并連接配接顯示器。
02部署步驟
計算棒端:
1)使用官方連結下載下傳示例源碼master_yolov3.zip,解壓,連結如下:
2)拷貝解壓目錄中的1808目錄至計算棒:
scp -r 1808/ [email protected]:/home/toybrick/
3)通過ssh連接配接到RK1808人工智能計算棒,運作yolov3master端程式
計算棒系統使用者名toybrick 密碼toybrick
計算棒系統使用者名root 密碼toybrick
建議用toybrick使用者登入,安裝python依賴包,root使用者可能存在未知風險。
進入計算棒:
4)安裝依賴包:
sudodnf install python3-opencv -y
5)進入剛才拷貝的1808目錄,運作1808端程式。
主控端端:
1)安裝依賴庫
pip3 install --user numpy
sudo apt-get install -y python3-opencv
2)運作host端程式
3、效果如下:
被 動 模 式
被動模式開發流程圖如下:
被動模式整體資料流程圖如下:
01
被動模式Mobilenet-ssd測試
1、使用官方連結下載下傳被動模式Mobilenet-ssd源碼
或者使用使用者資料中提供的源碼,目錄為:使用者資料\linux\源碼\被動模式\Mobilenet-ssd\
2、安裝編譯器、OpenCV、rknn-api
sudo apt-get install cmake gcc g++ //安裝編譯器
驗證編譯器已安裝成功:
sudo apt-get install libopencv-dev //安裝opencv庫檔案
rknn-api 安裝腳本在 slave_mobilenet_ssd 壓縮包中
cd slave_mobilenet_ssd/install_rknn
sudo ./install_rknn_api.sh //安裝rknn_api和通信程式
執行腳本後,下載下傳了rknn_api和通信程式:
3、代碼編譯運作
1)cd slave_mobilenet_ssd
修改ssd_demo.cpp檔案中main函數中如下語句,根據開發闆實際情況修改打開的攝像頭節點
ret= test.run(VIDEO_NODE, post_process, &data);
改為:
ret= test.run("/dev/video10", post_process, &data);
2)mkdir build
3)cd build
4)cmake..
5)make
編譯結果生成ssd_demo可執行程式:
6)npu_transfer_proxy& //啟動NPU守護程序,通信代理服務。該程式由原廠提供。
7)在PC上插入USB攝像頭
8)在PC界面終端上執行./ssd_demo,将會在螢幕上顯示SSD圖像結果
9)按'ESC'鍵退出運作
02
被動模式Rock-X測試
1、使用原廠連結下載下傳Rock-X SDK并解壓,連結如下:
https://eyun.baidu.com/s/3o9xqPPC#sharelink/path=%2F
或者使用使用者資料中提供的源碼,目錄為:使用者資料\linux\源碼\被動模式\Rock-X\
2、安裝編譯器
sudo apt-get install cmake gcc g++
3、插入計算棒,等待上位機識别到計算棒
4、上位機運作rock-x依賴rknn_api, npu_transfer_proxy
使用者可以先按照本文檔第三章“被動模式Mobilenet-ssd測試”安裝rknn_api;使用者也可以通過原廠提供的連結位址直接下載下傳rknn_api, npu_transfer_proxy,如下:
http://repo.rock-chips.com/rk1808/rknn-api/
http://repo.rock-chips.com/rk1808/npu_transfer_proxy/
5、運作npu_transfer_proxy和計算棒進行通信
npu_transfer_proxy &
6、編譯測試用demo
cd demo/command_line_demo
./build-linux-rk3399pro-on-device.sh
此時會編譯得到rock-x中demo目錄下的各用例并存放在install目錄下
7、測試生成的用例中的rockx_face_landmark_demo
cd install/rockx_linux_rk3399pro/rockx_face_landmark_demo/
export LD_LIBRARY_PATH=../lib
./rockx_face_landmark face4.jpg 68 //人臉特征點定位(68點)
8、測試效果如下:
9、Rock-X command_line_demo提供的例程
rockx_carplate_demo 車牌識别
rockx_face_attribute_demo 人臉屬性識别(性别、年齡)
rockx_face_detection_demo 人臉檢測
rockx_face_landmark_demo 人臉特征點定位
rockx_head_detection_demo 人頭檢測
rockx_object_detection_demo 物體檢測
rockx_object_track_demo 物體運動檢測
rockx_pose_body_demo 人體姿态檢測
rockx_pose_finger_demo 手掌節點姿态檢測
rockx_face_liveness_demo 活體檢測
rockx_face_recognition_demo 人臉識别對比
3、被動模式yolov3測試
注意該測試中安裝的部分包因為資源問題下載下傳可能會因逾時而無法下載下傳,遇到這種情況,可以使用我司提供的現成的安裝包,目錄為:使用者資料\ linux\源碼\被動模式\yolov3 demo\安裝包\
1、安裝python3.5,ubuntu18.04預設python3.6,該版本部分庫沒有資源無法安裝,是以更換為python3.5
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.5-dev
sudo apt-get --reinstall install python3.5-minimal
sudo mv /usr/bin/python3 /usr/bin/python3-old
sudo ln -s /usr/bin/python3.5 /usr/bin/python3
sudo update-alternatives --install /usr/bin/python python/usr/bin/python3.5 300
驗證python3.5是否安裝成功并且python3已經修改為預設使用3.5:
安裝新版pip:
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
sudo pip3 install setuptools --upgrade
sudo ln -s /usr/local/bin/pip3 /usr/bin/pip3
驗證pip安裝成功且預設使用python3.5的pip工具:
2、安裝依賴庫
sudo apt-get install cmake gcc g++ libprotobuf-dev protobuf-compiler
sudo apt-get install liblapack-dev libjpeg-dev zlib1g-dev
sudo apt-get install python3-dev python3-pip python3-scipy
sudo apt-get install python3-opencv python3-numpy python3-lmd bpython3-h5py
pip3 install wheel setuptools
sudo apt-get build-dep python3-h5py && pip3 install h5py
pip3 install --user scipy
pip3 install --user grpcio==1.26.0
pip3 install --user onnx
pip3 uninstall pillow
pip3 install --user pillow==4.2.1
pip3 uninstall h5py
pip3 install --user h5py==2.8.0rc1
注意部分安裝包因為資源問題下載下傳可能會因逾時而無法下載下傳,可以使用我司提供的現成的安裝包。
檢視上述指令安裝的包是否安裝到python3.5目錄下:
3、安裝TensorFlow
wget http://repo.rock-chips.com/python/tensorflow-1.11.0-cp35-none-linux_aarch64.whl
pip3 install --user tensorflow-1.11.0-cp35-none-linux_aarch64.whl
TensorFlow也可以到/home/forlinx/.local/lib/python3.5/site-packages/目錄下檢視安裝情況
4、Python3.5安裝OpenCV3
1)下載下傳opencv和opencv_contrib,這兩部分代碼下載下傳也比較困難,建議使用我司使用者資料中提供的源碼包,目錄為:使用者資料\linux\源碼\被動模式\yolov3demo\安裝包\:
cd~
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
2)編譯opencv源碼
cd~/opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DWITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -DINSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -DBUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_GTK=ON -D WITH_OPENGL=ON ..
make
編譯結果如下:
3)安裝OpenCV
sudo make install
部分安裝資訊:
OpenCV的安裝檔案也可以在系統中找到,例如:
/usr/local/lib/libopencv_core.so.4.3.0
/usr/local/include/opencv4/opencv2/cvconfig.h
編譯時會有報錯解決方法可以參考如下連結:
https://stackoverflow.com/questions/28776053/opencv-gtk2-x-error
http://www.luyixian.cn/news_show_316237.aspx
或者可以使用我司提供的現成的OpenCV的源碼。
5、安裝rknn-toolkit
wget http://repo.rock-chips.com/python/tensorflow-1.11.0-cp35-none-linux_aarch64.whl
pip3 --default-timeout=100000 install --user rknn_toolkit-1.1.0-cp35-cp35m-linux_aarch64.whl
rknn_toolkit也可以到/home/forlinx/.local/lib/python3.5/site-packages/目錄下檢視安裝情況,可以看到對應安裝目錄:
6、下載下傳yolov3 demo程式測試運作
wget -r -np -nc -nH
cd rk1808/yolov3/
修改rknn_camera_tiny_multiProcess.py中打開的攝像頭節點:
video= cv2.VideoCapture(0)
改為:
video= cv2.VideoCapture("/dev/video10")
注意:攝像頭節點需要依據自己開發闆的實際情況來修改
指令行執行:
python3.5 rknn_camera_tiny_multiProcess.py
運作結果如下:
至此,OK3399-C開發闆+RK1808人工智能計算棒在主動模式和被動模式下的測評就告一段落。