Jetson Nano DLI 教學(一):環境準備與 Hello Camera

Jetson Nano DLI 教學(一):環境準備與 Hello Camera

NVIDIA 線上學習資源 DLI (Deep Learning Institute) 有個非常實用的入門課程-Getting Started with AI on Jetson Nano ,在這免費課程中將使用 JupyterLab 介面快速進入 Edge AI 領域,完成課程還可獲得 NVIDIA 線上課程證書喔!本篇文章將做第一部分的入門介紹以及避坑指引。

Getting Started with AI on Jetson Nano (一): 環境準備與 hello Camera

一、事先準備

1. Camera

開始之前需要先準備一個 Camera,過程會做 Camera 擷取即時影像做為訓練與推論用。Camera 可以使用 CSI 介面的 IMX-219 樹莓派 Camera V2 或是 USB 介面的羅技 C270 Webcam。這邊推薦使用 C270,因為 USB 介面插拔比較不會有問題,CSI 介面對硬體新手較不友善,不小心可能就會接觸不良甚至造成硬體損毀。而 USB Webcam 只要是標準 UVC(USB video class) 介面在 Linux 有驅動的裝置皆可使用,各位手上也可以將既有的 UVC Webcam 拿來使用,沒有的話推薦 C270 比較不會有問題,價錢也可以接受。

2. 註冊課程

註冊 Getting Started with AI on Jetson Nano 課程並非必要,因為只要啟動 Docker 容器就可以自行在 JupyterLab 進行操作。但是完成課程可以換一張電子證書來滿足自己的虛榮心,好像蠻值得的d(`・∀・)b!前往課程頁進行註冊,裡面也有官方教學可以參考。

二、安裝與啟動 Docker(⚠️前方有坑,請注意!)

在現行版本沒辦法像 DLI 課程中可以直接啟動 Docker image,會發生錯誤,必須安裝對應的套件並且參考 NVIDIA 論壇討論串來進行解決。這邊已整理為以下流程:

1. 安裝對應套件

sudo apt-get install nvidia-container-toolkit nvidia-container-runtime nvidia-container-csv-*

2. 重新安裝指定版本 docker

wget https://launchpad.net/ubuntu/+source/docker.io/20.10.2-0ubuntu1~18.04.2/+build/21335731/+files/docker.io_20.10.2-0ubuntu1~18.04.2_arm64.deb
sudo dpkg -i docker.io_20.10.2-0ubuntu1~18.04.2_arm64.deb
rm docker.io_20.10.2-0ubuntu1~18.04.2_arm64.deb
sudo apt-get install containerd 

3. 建立 package 對應版本文件,使用圖形介面的文字編輯器 gedit 編輯。若熟悉 vi 或是 nano 終端機的文字編輯器可以自行調整。

sudo gedit /etc/apt/preferences

4. 填入以下內容並存檔

Package: docker.io
Pin: version 20.10.2*
Pin-Priority: 1001

Package: containerd
Pin: version 1.5.2*
Pin-Priority: 1001

5. 重新啟動系統

sudo reboot

6. 建立資料存放目錄

mkdir -p ~/nvdli-data

7. 執行啟動 docker,第一次執行會到 NVDIA NGC 下載 DLI Getting Started with AI on Jetson Nano 的課程 docker image,並且啟動。其中最後一段的 v2.0.1-r32.6.1tw 指的是版本以及 ipynb 筆記本中的說明語言,我們要指定 Jetpack 4.6 版本前輟 v2.0.1-r32.6.1 加上 tw 是繁體中文說明。若要閱讀英文的內容則是把最後的 tw 刪去。完整 image tag 可參閱說明頁。注意 Jetpack 4.6 與 4.6.1 兩個版本所對應的 docker image 有所不同,輸入前務必再次確認。

sudo docker run --runtime nvidia -it --rm --network host \
     --volume ~/nvdli-data:/nvdli-nano/data \
     --device /dev/video0 \
     nvcr.io/nvidia/dli/dli-nano-ai:v2.0.1-r32.6.1tw

8. 此外,如果開發者是使用 CSI Camera,需要額外加一個 voulme 參數,完整指令如下:

sudo docker run --runtime nvidia -it --rm --network host \
 --volume ~/nvdli-data:/nvdli-nano/data \
 --volume /tmp/argus_socket:/tmp/argus_socket \
 --device /dev/video0 \
 nvcr.io/nvidia/dli/dli-nano-ai:v2.0.1-r32.6.1tw

9. 下載 image 進度顯示如下圖:

Getting Started with AI on Jetson Nano (一): 環境準備與 hello Camera

10. 啟動完成就會看到以下提示訊息。

Getting Started with AI on Jetson Nano (一): 環境準備與 hello Camera

11. 這時我們就可以到相同區域網路內的任何一台電腦,在瀏覽器輸入 Jetson Nano 的 IP 位置,並指定埠號 8888,就會看到 JupyterLab 登入畫面,輸入預設密碼 dlinano 即可完成登入!筆者建議可以在 PC 上操作 JupyerLab 會比較順暢,若真不得已才在 Jetson Nano 的瀏覽器操作。

Getting Started with AI on Jetson Nano (一): 環境準備與 hello Camera

三、媽!我上電視啦!?

登入後就會看到標準的 JupyterLab 介面,這部分的操作我們就不贅述了,若沒有使用過可自行摸索或是上網找相關資料應該是相當豐富。

Getting Started with AI on Jetson Nano (一): 環境準備與 hello Camera

左側欄位的目錄結構可以看到幾個目錄:

  • classification – 影像分類的 ipynb 筆記本
  • data – 存放擷取的影像資料
  • hello_camera – Camera 測試用的 ipynb 筆記本
  • regression – 影像資料回歸的 ipynb 筆記本

點進去 hello_camera 目錄,有存放兩個檔案-csi_camera.ipynbusb_camera.ipynb。依據我們接上的 Camera 是 CSI 界面或是 USB 界面來做選擇,筆者這邊就選擇開啟 usb_camera.ipynb

開啟後會到可愛的繁體中文說明以及對應的程式碼,依序執行各個程式碼 cell,執行到下方這一段:

camera.running = True

def update_image(change):
    image = change['new']
    image_widget.value = bgr8_to_jpeg(image)
    
camera.observe(update_image, names='value')

就會看到 ipynb 上所建立的 camera widget 會將 camera 串流即時顯示在畫面上,就代表設備已經準備就緒囉!因為程式碼都有中文的說明內文,筆者就不再額外贅述了,針對幾點重點做補充:

  • 當有多個 camera 裝置的話,務必指定到正確的裝置名稱。
  • 顯示的影像會這麼小而且變形的原因是已經被壓縮成 224×224 像素了,這是因為後面要使用的深度學習模型 shape 就是 224×224 RGB,當然你也可以自行修改參數玩玩看。
  • 關閉 ipynb 前務必依定要釋放 camera 硬體資源,否則可能會造成系統資源卡死, camera 無法再被別處的程式碼使用,必須重新啟動才能復原。
Getting Started with AI on Jetson Nano (一): 環境準備與 hello Camera

四、小結

這個 DLI 課程不斷的在進化,最早在 NVIDIA Jetson Nano Developer Kit 上只要燒錄完提供的 image 到 SD 就可以使用了,後來則是改用 docker 的方式來啟動 JupyterLab,並且還增加了多國語言的說明,真是非常便利。但筆者在測試時發現新版 Docker 套件有相容性問題,好在網路上已經有人提供解法,只要按照上述內容操作就沒問題了。接下來就可以開始做 AI 影像分類囉!下篇文章見~(ゝ∀・)