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的設定問題了。