將 NVIDIA Isaac SDK 物件偵測工作流程與 Docker 和 NVIDIA 遷移學習工具套件搭配使用

作者 NVIDIA Developer

本文章是說明如何透過 NVIDIA 遷移學習工具套件(TAO Toolkit),使用 Docker 進行物件偵測之系列的第二篇。第一篇,請參閱利用 NVIDIA Isaac SDK 和 NVIDIA 遷移學習工具套件部署即時物件偵測模型。

圖 1:在模擬影像(左)和真實影像(右)上經過模擬訓練之預設網球模型的推論定界框。

做為 NVIDIA Isaac SDK 2020.1 版本的一部分,NVIDIA NGC 中提供了 Docker 映像,包括在 Linux 上執行物件偵測工作流程需要的所有工具。若需要更多與使用 Docker 映像產生資料、使用 TLT 進行訓練及推論有關的資訊,請參閱 Training Object Detection from Simulation in Docker。此 Docker 映像讓任何人都能輕鬆使用 Isaac,並為自訂物件集合部署偵測模型。

本文章是說明如何逐步完成物件偵測工作流程,包括產生資料、使用 TLT 進行訓練,以及使用單一 Docker 容器在機器人平台上進行推論。

設定 Docker 容器

在使用提供的 Docker 映像啟動容器之前,請先安裝必要的軟體:

  • Ubuntu 18.04 主機
  • 支援 CUDA 的 GPU
  • Docker 19.03
  • 已配置 API 存取權的 NGC 帳戶。NGC 帳戶為免費建立。

若需要更多資訊,請參閱 Host setup

Docker 映像包含一個提供產生資料、TLT 微調和推論步驟之互動式逐步解說的Jupyter notebook。在開始時,請依據 Docker 映像文件中的指示執行 ./start.sh 指令碼,並遵循畫面上的指示。將會啟動執行圖 2 所述流程的 Jupyter notebook。

圖 2:結合 Isaac SDK 和 TLT 的 Docker 工作流程。

以自訂 3D 物件模型產生資料集

在 Docker 容器中使用 Jupyter notebook 產生資料集,並訓練新的物件偵測模型。~/isaac-experiments/models 中應有兩個 FBX 檔案(圖 1 中的網球和圖 3 中的 NVIDIA 馬克杯)。將這些 3D 物件模型載入至模擬場景,以產生訓練資料。

圖 3:使用在自訂 3D 物件模型上訓練的 DetectNetv2 進行推論。

您可以將這些模型更換成自己的模型,但是具有下列限制:

  • 檔案必須是 FBX 格式
  • 在此模式中不支援透明紋理。如果您的模型中含有透明紋理,可能無法正確渲染或正確標示。
  • 紋理應嵌入 FBX 模型中。如果紋理看起來似乎缺少時,請嘗試使用嵌入的紋理重新產生模型。不支援將模型紋理新增為其他檔案。
  • 使用檔案名稱做為偵測的類別標籤時,在做為類別之前將會轉換成小寫,且任何空格都會被底線取代。請避免使用大寫或空格,以避免類別名稱發生問題。
  • 如果硬體可以支援,則能使用任何數量的 3D 模型。每一個模型都會載入記憶體,並在模擬中進行渲染。
  • 請使用小於 10 英寸或 25cm 的物件,因為產生資料集的隨附場景,已針對小型桌面物件進行最佳化。欲瞭解如何偵測許多使用案例的大型物件,包括產生物件偵測資料集,請參閱 IsaacSim Unity3D

Jupyter notebook 說明如何執行 Isaac Sim Unity3D 場景,以便同時載入提供的自訂 FBX 模型以及產生資料集的 Isaac 應用程式。此步驟會將產生的 KITTI 資料集儲存在 ~/isaac-experiments/data/ 中。若想要修改任何參數,請重新執行 Jupyter notebook 上的對應部分,以重新產生。

使用 TLT 進行微調

根據提供的 FBX 模型清單,透過 ~/isaac-experiments/generate_specs.py 指令碼,自動產生訓練和推論配置。此單元會產生 tlt-train 需要的規格檔案,以及 Isaac SDK 中之推論應用程式需要的 JSON 配置檔。

之後,Jupyter notebook 會逐步完成訓練、修剪和重新訓練流程,並在產生的合成資料上微調經過預先訓練的 DetectNetv2 模型。經過訓練和修剪的最終 .etlt 模型檔案,是包含在 ~/isaac-experiments/tlt-experiments/experiment_dir_final/ 中。

在影像上執行推論

最後,Jupyter notebook 會在 ~/isaac-experiments/data/testing/image_2 目錄中的資料,執行 Isaac DetectNetv2 推論範例應用程式。如果存有與執行推論之合成資料集不同的影像集合,則 Jupyter notebook 上的單元會包含一個指示從哪一個資料夾載入影像的選項 –image_directory。支援 PNG 和 JPEG 影像。

確認 Docker 容器可以存取您指定的路徑。最簡單的方式是在 ~/isaac-experiments 目錄中建立子資料夾,並將其命名為 ~/your-custom-sub-folder

若想要查看正在處理,以進行推論之影像的投影片,請在執行應用程式時,開啟 Jupyter notebook 單元中的 https://localhost:3000 連結。

在即時影像上進行推論

如果在容器啟動時已連接網路攝影機,則可利用其即時影像套入訓練好的模型進行推論。

方式是使用以下內容,在提供的 Jupyter notebook 中建立與執行新單元。選擇 –rows–cols 參數的值,以符合使用之攝影機支援的解析度。

! cd /workspace/isaac \
&& bazel run packages/detect_net/apps:detect_net_inference_app — \
  –mode v4l \
  –rows 480 \
  –cols 864\
  –config “$SPECS_DIR/isaac_detect_net_inference.json”

最重要的是在啟動容器時,將網路攝影機連線至主機,因為必須設定區塊裝置存取權限。

若想要觀看攝影機的影像,請在執行應用程式時,開啟 Jupyter notebook 單元中的 https://localhost:3000 連結。將一些為了偵測而訓練之物件放入攝影機的視野中,應用程式應開始進行偵測。

在真實機器人上進行推論

影片:已訓練模型同時在 Jetson 和 x86 主機上執行推論。

影片顯示出兩部攝影機的影像,x86 主機在左上角,Kaya 在左下角。兩者都呈現出白色桌子上同一個 NVIDIA 品牌的馬克杯,僅位置稍微不同。右側為人類的視角,可看到 Kaya 機器人、網路攝影機和馬克杯。影片開始後由一隻手旋轉和滑動馬克杯。此動作是出現在左側影片上,馬克杯的周圍有覆疊的物件偵測框,且兩個影像中都設有標籤「nvidia_mug」。

Kaya 物件偵測應用程式是 Isaac SDK 隨附的範例,示範如何在安裝於機器中的感測器上進行 DetectNetv2 推論。此應用程式是預設使用 Isaac SDK 隨附的單一類別網球偵測模型執行推論。

若想要在 NVIDIA Jetson 裝置(例如 Kaya)上使用自訂模型執行推論,必須:

之後,進行下列操作:

  • 在容器至 Jetson 裝置之間建立連線。
  • 編譯 object_detection 應用程式,並部署至機器人。
  • 將經過訓練的模型複製到機器人。
  • 配置應用程式,以使用自訂模型。

現在,請確認在 Docker 容器中可以取得 SSH 金鑰。假設 /isaac-experiments 資料夾是位於主目錄中,請建立新的 SSH 金鑰,以從 Docker 容器中使用。即可將原始金鑰固定於其位置,且可在有必要時,較容易從機器人/Jetson 裝置中撤銷,而不會影響從主機系統連線的能力。

在自訂變數值,以符合 Jetson 設定之後,從主機之桌面環境開啟新的終端機視窗,並執行以下命令。此動作僅需要執行一次。

export JETSON_USER=nvidia
export JETSON_HOST=ip_of_jetson
mkdir ~/isaac-experiments/.ssh
ssh-keygen -f ~/isaac-experiments/.ssh/id_rsa
chmod 600 ~/isaac-experiments/.ssh/id_rsa
ssh-copy-id -i ~/isaac-experiments/.ssh/id_rsa $JETSON_USER@$JETSON_HOST
#Set user account inside the container
ISAAC_ML_CONTAINER=`docker ps –format “{{.ID}} {{.Image}}” | grep nvcr.io/nvidia/isaac-ml-training:2020.1 | awk ‘{print $1}’ `
docker exec -u 0 $ISAAC_ML_CONTAINER useradd -M -d /workspace -u $(id -u) $(whoami)

在完成此步驟之後,可以隨時執行以下命令,在 Docker 內部取得命令列。

eISAAC_ML_CONTAINER=`docker ps –format “{{.ID}} {{.Image}}” | grep nvcr.io/nvidia/isaac-ml-training:2020.1 | awk ‘{print $1}’ `
docker exec -u 0 $ISAAC_ML_CONTAINER useradd -M -d /workspace -u $(id -u) $(whoami)
docker exec -it -u $(id -u) $ISAAC_ML_CONTAINER /bin/bash

此將有助於手動執行命令,或從 Docker 內部的命令列連線至 Kaya。

在主機電腦的桌面中使用文字編輯器複製檔案:

~/isaac-experiments/specs/isaac_detect_net_inference.json to ~/isaac-experiments/specs/isaac_detect_net_inference_kaya.json

找出設定 model_file_path 的命令列,並將值設為:

‘/home/<JETSON_USER>/isaac-experiments/resnet18_detector.etlt’

將 JETSON_USER 值轉換成在 Kaya 中設定的使用者名稱,並儲存檔案。

在 Docker 與 Kaya 之間已建立安全連線,且存有該 Kaya 應用程式的配置檔時,即可將應用程式和經過訓練的模型部署至機器人。將以下程式碼新增至 Jupyter notebook 推論部分的新單元中,然後執行。

%env JETSON_USER=nvidia

%env JETSON_HOST=kaya_ip

%env LOCAL_USERNAME=your_username
! cd /workspace/isaac \

&& ./engine/build/deploy.sh –user $LOCAL_USERNAME –remote_user “$JETSON_USER” -h $JETSON_HOST -p //apps/kaya:object_detection-pkg -d jetpack43

! ssh $JETSON_USER@$JETSON_HOST mkdir -p isaac-experiments

! scp $SPECS_DIR/isaac_detect_net_inference_kaya.json
$USER_EXPERIMENT_DIR/experiment_dir_final/resnet18_detector.etlt
$JETSON_USER@$JETSON_HOST:isaac-experiments
!echo “# Copy and Run the following commands on a terminal window\n# on your desktop and then go to ”

!echo “# https://$JETSON_HOST:3000 to access WebSight on Kaya”

!echo ssh -i \~/isaac-experiments/.ssh/id_rsa $JETSON_USER@$JETSON_HOST

!echo “# Then run the following commands”

!echo cd \~/deploy/$LOCAL_USERNAME/object_detection-pkg ‘&&’ ./apps/kaya/object_detection –more \~/isaac-experiments/isaac_detect_net_inference_kaya.json

最後,在 Kaya 上執行應用程式。該單元應已建立兩個命令,可以在主機系統的終端機視窗上執行。第一個命令可以連線至 Kaya,第二個命令則是從 Kaya 取得命令提示字元之後執行的命令。

您應能在 https://<kaya_ip_address>:3000 使用 WebSight 或開啟單元產生的連結,以觀看 Kaya 偵測需要的物件。

圖 4:NVIDIA 馬克杯偵測:Kaya 和網路攝影機的同時推論。

本文章是說明 Docker 映像的用途,以及如何使用 Isaac Sim 和 Isaac SDK 產生合成資料集。利用此資料集和 TLT 可以在自訂物件上訓練模型,以實現模擬至真實轉移。

若需要更多資訊,請參閱以下資源:

請在開發人員論壇上提出與產品有關的問題或意見。