Jetson Xavier NX 試玩 (二)

2023-03-14 15:00:08

Jetson Xavier NX 試玩 (二)

Hello AI World Inference

人工智慧推理模型

0 前言

想玩一玩 jetson 的人工智慧功能,官方的 instructional guide 地址:https://github.com/dusty-nv/jetson-inference .

就是有個函數庫,怎麼用呢,有使用docker的方法,有從原始碼編譯的方法。我選擇了從原始碼編譯的方法。編譯需要準備一下環境,首先在下載映象階段,我只下了OS,這次需要用到一些SDK COMPONENTS,所以需要先用 SDK Manager 將SDK COMPONENTS下到jetson裡去。

1 下載 SDK COMPONENTS

這個沒啥難度,和下載映象時一樣,就不再多說了。

下完後有個VPI Demos v1.2

開啟可以跑 demo,雖然我也看不懂,不過似乎有點意思

2 編譯 jetson library

1)更新軟體源

sudo apt-get update

2)安裝需要用的軟體

sudo apt-get install git cmake libpython3-dev python3-numpy

3)克隆倉庫

git clone --recursive https://github.com/dusty-nv/jetson-inference.git

recursive 表示將該倉庫下的子倉庫一起克隆下來

這個過程中因為網路問題可能會出現一些問題,可以給 git 設定一下全域性代理啥的,網路問題,懂得都懂。

4)構建cmake

cd jetson-inference/
mkdir build
cd build/
cmake ../

然後就是等待,會有個圖形化的圖框互動出現讓你選擇你想下的模型,可以都取消,需要啥再下啥。當然,也可以選擇要用的元件,比如 SSD-Mobilenet-v2 ,這個會使用 detectNet 檢測動態物體,下載模型時因為網路問題可能會下載失敗,因此我還是推薦不要在這個階段下載模型,之後要用到某個模型,可以在本地下載下來再傳給jetson。地址:https://github.com/dusty-nv/jetson-inference/releases

然後,會問你要不要安裝pytorth,可以不用安裝。

5)編譯

make -j$(nproc)

nproc就是可用的cpu核數, NX有6個cpu,但是有2個cpu預設是關閉狀態,因此這裡是4個

6)安裝

sudo make install

7)共用動態連結庫

安裝完成某個工程後生成許多動態庫,為了讓這些動態連結庫為系統所共用,還需執行動態連結庫的管理命令

sudo ldconfig

8)驗證

jetson_utils庫可以import,應該是成功把庫安裝下來了

3 玩玩

detectNet

玩這個要先下 SSD-Mobilenet-v2.tar.gz ,在這 https://github.com/dusty-nv/jetson-inference/releases/tag/model-mirror-190618

detectnet challenge_video.mp4

imageNet

玩這個要先下 GoogleNet.tar.gz ,在這 https://github.com/dusty-nv/jetson-inference/releases/tag/model-mirror-190618

cd ~/Desktop/jetson-inference/build/aarch64/bin

./imagenet-console來呼叫imageNet程式對輸入圖片檢測,並將結果輸出到指定位置

./imagenet-console ~/baiyug_ws/230312aPicture2.png ~/baiyug_ws/230312aPicture2_ouput.png

230312aPicture2_ouput.png如下

...

......

4 在程式中呼叫庫介面

新建一個python程式,名為app.py

import jetson_inference
import jetson_utils

net = jetson_inference.detectNet("ssd-mobilenet-v2", threshold = 0.5)
camera = jetson_utils.videoSource("/home/jetson/baiyug_ws/challenge_video.mp4")

display = jetson_utils.videoOutput("display://0")

while display.IsStreaming():
    img = camera.Capture()
    detections = net.Detect(img)
    display.Render(img)
    display.SetStatus("OUTPUT")

其實這就呼叫了detectNet這個程式

python3 app.py

效果和使用 detectNet 這個命令是一樣的

5 在程式中呼叫庫介面同時使用opencv

用resize視窗為例,有使用到imutils庫

sudo apt install python3-pip
pip3 install imutils

需要點明,pip這個工具和git一樣是不走系統全域性代理的,要讓他走代理要使用類似以下的命令

pip3 --proxy=192.168.0.17:7890 install imutils

192.168.0.17:7890就是代理伺服器埠地址

然後新建python程式,名為app_use_cv2.py

import cv2
import jetson_inference
import jetson_utils
import imutils

#read the video
capture = cv2.VideoCapture("/home/jetson/baiyug_ws/challenge_video.mp4")
#load the model in need
net = jetson_inference.detectNet("ssd-mobilenet-v2")

while True:
    #read the frame 
    res, frame = capture.read()
    if not res:
        break
    #resize the window
    frame = imutils.resize(frame, width = 800)
    #convert the  format from numpy to cuda
    img = jetson_utils.cudaFromNumpy(frame)
    #pass the cuda fomat image to the model
    detections = net.Detect(img)
    
    #printing all the boundary boxes of the detections
    for obj in detections:
        cv2.rectangle(frame, (int(obj.Left), int(obj.Bottom), int(obj.Right), int(obj.Top)), (0, 0, 255), 2)
    
    #display the img
    cv2.imshow("OUTPUT", frame)
    key = cv2.waitKey(1)
    if key == ord("q"):
        break

cv2.destroyAllWindows
python3 app_use_cv2

效果

6 Build OPENCV with CUDA

NX在安裝SDK COMPONENTS的過程是有opencv預裝的,

但是,存在一個問題,這個opencv庫是不會使用cuda加速的,可以使用jtop工具檢視jetson上的資料,

使用jtop要先下載一個庫,jetson-stats,

sudo -H pip3 --proxy=192.168.0.17:7890 install --no-cache-dir -U jetson-stats

之所以加了一些奇怪的引數,似乎是因為jetson-stats的一個bug,詳見https://github.com/rbonghi/jetson_stats/issues/86, 另外,我還使用了代理。

然後,就可以使用jtop了,

jtop

可以看到,預裝的opencv no with cuda,那麼如何讓他yes with cuda呢

其實很簡單,見 https://github.com/JetsonHacksNano/buildOpenCV

JetsonHacksNano 有個開源指令碼 buildOpenCV.sh 就是用來編譯opencv的,預設是 jetson nano 的引數,在 jetson NX 上使用只需要改一個地方

ARCH_BIN=5.3 改為 ARCH_BIN=7.2

為什麼呢?

這個其實是cuda的架構引數

然後直接執行這個指令碼即可

./buildOpenCV.sh |& tee build.log

這個命令分兩個部分,一個是執行buildOpenCV.sh指令碼, 一個是將輸出到終端的紀錄檔儲存在build.log檔案裡。

如果一切正常,一個小時差不多就可以編譯完,然後就可以檢視到 opencv yes with cuda 了。

當然,在國內網路條件下,如果沒有合適的手段,一般會遇到問題,而且大多數是git存取問題。

這種問題首先要保證你原生的區域網上下行的速度,其次就是代理伺服器的設定或者是VPN的設定問題了。


 

本文參考這個博主:https://www.youtube.com/@RocketSystems/videos