從制造汽車到幫助外科醫(yī)生和送披薩,機器人不僅逐漸自動化,而且將完成任務(wù)的速度提高了許多倍。隨著人工智能的出現(xiàn),機器人可以更加智能化,更好地感知周圍環(huán)境,并在最少的人工干預(yù)下做出決策。
例如,一個用于倉庫的自主機器人將有效載荷從一個地方移動到另一個地方。它必須感知周圍的自由空間,檢測并避免路徑中的任何障礙,并做出“即時”決定,選擇路徑。
而這就是挑戰(zhàn)所在,這意味著需要構(gòu)建一個由人工智能模型支持的應(yīng)用程序,該模型經(jīng)過訓(xùn)練和優(yōu)化,可以在這種環(huán)境下工作。訓(xùn)練和優(yōu)化模型需要收集大量高質(zhì)量的數(shù)據(jù),并開發(fā)一個高度精確的人工智能模型來驅(qū)動應(yīng)用程序。這些是將應(yīng)用程序從實驗室轉(zhuǎn)移到生產(chǎn)環(huán)境的關(guān)鍵障礙。
在這篇文章中,我們將展示如何使用 NVIDIA Isaac 平臺和 TAO 框架解決數(shù)據(jù)挑戰(zhàn)和模型創(chuàng)建挑戰(zhàn)。NVIDIAIsaac Sim是一個機器人模擬應(yīng)用程序,用于創(chuàng)建虛擬環(huán)境和生成合成數(shù)據(jù)。NVIDIA TAO 工具套件是一種低代碼人工智能模型開發(fā)解決方案,與從頭開始的訓(xùn)練相比,它具有內(nèi)置的轉(zhuǎn)移學(xué)習(xí)功能,可以用一小部分?jǐn)?shù)據(jù)微調(diào)預(yù)訓(xùn)練模型。最后,使用 NVIDIA Isaac ROS 將優(yōu)化模型部署到機器人上,并將其應(yīng)用于現(xiàn)實世界。
▲圖 1 概述使用 NVIDIA Isaac Sim 對 TAO 模型進(jìn)行合成數(shù)據(jù)訓(xùn)練的工作流程,以適應(yīng)現(xiàn)實世界的用例
先決條件
開始之前,請確認(rèn)擁有以下用于訓(xùn)練和部署的資源:
-
NVIDIA GPU 驅(qū)動程序版本:> 470
-
NVIDIA Docker:2.5.0-1
-
NVIDIA GPU 云端或內(nèi)部:
-
NVIDIA A100
-
NVIDIA V100
-
NVIDIA T4
-
NVIDIA RTX 30 × 0 ( NVIDIA Isaac 也支持 NVIDIA RTX 20 系列)
-
NVIDIA Jetson Xavier 或 Jetson Xavier NX
-
NVIDIA TAO 工具套件:4.22 。
-
NVIDIA Isaac Sim 和 NVIDIA Isaac ROS
使用 NVIDIA IsaacSim 生成合成數(shù)據(jù)
在本節(jié)中,我們將概述在 NVIDIA Isaac Sim 中生成合成數(shù)據(jù)的步驟。Synthetic Data 是計算機模擬或算法生成的注釋信息。當(dāng)真實數(shù)據(jù)難以獲取或成本高昂時,合成數(shù)據(jù)可以幫助解決數(shù)據(jù)難題。
NVIDIA Isaac Sim 提供三種生成合成數(shù)據(jù)的方法:
在這個實驗中,我們選擇使用 Python 腳本生成具有領(lǐng)域隨機化的數(shù)據(jù)。Domain randomization 改變在模擬環(huán)境中定義場景的參數(shù),包括場景中各種對象的位置、比例、模擬環(huán)境的照明、對象的顏色和紋理等。
添加域隨機化以同時改變場景的多個參數(shù),通過將其暴露于現(xiàn)實世界中看到的各種域參數(shù),提高了數(shù)據(jù)集質(zhì)量并增強了模型的性能。
本例中使用了兩個環(huán)境來訓(xùn)練數(shù)據(jù):一個倉庫和一個小房間。接下來的步驟包括向場景中添加符合物理定律的對象。我們使用了 NVIDIA Isaac Sim 中的示例對象,其中還包括 YCB dataset 中的日常對象。
▲圖 2 簡單房間和倉庫環(huán)境中的模擬圖像示例
安裝 NVIDIA Isaac Sim 后 Isaac Sim App選擇器提供了一個在文件夾中打開的選項,其中包含一個python.sh 腳本。這將用于運行數(shù)據(jù)生成的腳本。
按照下方列出的步驟生成數(shù)據(jù)。
-
選擇環(huán)境并將攝影機添加到場景中:
def add_camera_to_viewport(self): # Add a camera to the scene and attach it to the viewport self.camera_rig = UsdGeom.Xformable(create_prim("/Root/CameraRig", "Xform")) self.camera = create_prim("/Root/CameraRig/Camera", "Camera")
2. 添加語義 ID:
def add_floor_semantics(self): # Get the floor from the stage and update its semantics stage = kit.context.get_stage() floor_prim = stage.GetPrimAtPath("/Root/Towel_Room01_floor_bottom_218") add_update_semantics(floor_prim, "floor")
3. 在具有物理特性的場景中添加對象:
def load_single_asset(self, object_transform_path, object_path, usd_object): # Random x, y points for the position of the USD object translate_x , translate_y = 150 * random.random(), 150 * random.random() # Load the USD Object try: asset = create_prim(object_transform_path, "Xform", position=np.array([150 + translate_x, 175 + translate_y, -55]), orientation=euler_angles_to_quat(np.array([0, 0.0, 0]), usd_path=object_path) # Set the object with correct physics utils.setRigidBody(asset, "convexHull", False)
4. 初始化域隨機化組件:
def create_camera_randomization(self): # A range of values to move and rotate the camera camera_tranlsate_min_range, camera_translate_max_range = (100, 100, -58), (220, 220, -52) camera_rotate_min_range, camera_rotate_max_range = (80, 0, 0), (85, 0 ,360) # Create a Transformation DR Component for the Camera self.camera_transform = self.dr.commands.CreateTransformComponentCommand( prim_paths=[self.camera.GetPath()], translate_min_range=camera_tranlsate_min_range, translate_max_range=camera_translate_max_range, rotate_min_range=camera_rotate_min_range, rotate_max_range=camera_rotate_max_range, duration=0,5).do()
確保模擬中的攝影機位置和屬性與真實世界的屬性相似。添加語義ID對于生成正確的自由空間分割掩碼是非常重要的。如前所述,應(yīng)用領(lǐng)域隨機化來幫助提高模型的 sim2real 性能。
NVIDIA Isaac Sim 說明中提供的離線數(shù)據(jù)生成示例是我們腳本的起點。對這個用例進(jìn)行了更改,包括使用物理向場景添加對象、更新域隨機化,以及添加語義。我們已經(jīng)為數(shù)據(jù)集生成了近 30,000 張帶有相應(yīng)分割模板的圖像。
使用 TAO 工具套件進(jìn)行訓(xùn)練、適應(yīng)和優(yōu)化
在本節(jié)中,您將使用 TAO 工具套件生成的合成數(shù)據(jù)對模型進(jìn)行微調(diào)。為了完成這項任務(wù),我們選擇了 NGC 提供的 UNET 模型進(jìn)行實驗。
!ngc registry model list nvidia/tao/pretrained_semantic_segmentation:*
設(shè)置數(shù)據(jù)、規(guī)格文件( TAO 規(guī)格)和實驗?zāi)夸洠?/span>
%set_envKEY=tlt_encode
%set_envGPU_INDEX=0
%set_envUSER_EXPERIMENT_DIR=/workspace/experiments
%set_envDATA_DOWNLOAD_DIR=/workspace/freespace_data
%set_env SPECS_DIR=/workspace/specs
下一步是選擇模型。
選擇正確的預(yù)訓(xùn)練模型
預(yù)訓(xùn)練人工智能和深度學(xué)習(xí)模型是在代表性數(shù)據(jù)集上進(jìn)行訓(xùn)練并使用權(quán)重和偏差進(jìn)行微調(diào)的模型。與從頭開始的訓(xùn)練相比,只需使用一小部分?jǐn)?shù)據(jù)就可以應(yīng)用遷移學(xué)習(xí),您可以快速輕松地微調(diào)預(yù)訓(xùn)練模型。
在預(yù)訓(xùn)練模型領(lǐng)域中,有一些模型執(zhí)行特定任務(wù),比如檢測人、汽車、車牌等。
我們首先選擇了一個帶有 ResNet10 和 ResNet18 主干的 U-Net 模型。從模型中獲得的結(jié)果顯示,在真實數(shù)據(jù)中,墻和地板合并為一個實體,而不是兩個單獨的實體。即使模型在模擬圖像上的性能顯示出較高的精度,這也是事實。
▲表 1 不同預(yù)訓(xùn)練模型的實驗可從 TAO 的 NGC 平臺獲得
我們用不同的主干和圖像大小進(jìn)行實驗,觀察延遲( FPS )與準(zhǔn)確性之間的權(quán)衡。表中所有型號均相同( UNET ),只有 backbones 不同。
▲圖 3 ResNet18 模型的預(yù)測。(左)模擬圖像;(右)真實世界的圖像
根據(jù)結(jié)果,我們顯然需要一個更適合用例的不同模型。我們選擇了 NGC 目錄中提供的 PeopleSemSeg 型號。該模型在“ person ”類的 500 萬個對象上進(jìn)行了預(yù)訓(xùn)練,數(shù)據(jù)集由相機高度、人群密度和視野( FOV )組成。該模型還可以將背景和自由空間分割為兩個獨立的實體。
在使用相同的數(shù)據(jù)集對該模型進(jìn)行訓(xùn)練后,平均 IOU 增加了 10% 以上,得到的圖像清楚地顯示了地板和墻壁之間更好的分割。
▲表 2 PeopleSegNet 可訓(xùn)練模型的實驗
▲圖 4 網(wǎng)絡(luò)遷移學(xué)習(xí)的預(yù)測結(jié)果 PeopleSegTAO 包含合成數(shù)據(jù)(左)和真實數(shù)據(jù)(右)的模型
圖 4 顯示了在使用真實數(shù)據(jù)對 PeopleSeg 模型進(jìn)行微調(diào)之前,從機器人的角度在模擬圖像和真實圖像上識別自由空間。也就是說,使用純 NVIDIA Isaac Sim 數(shù)據(jù)訓(xùn)練的模型。
關(guān)鍵的一點是,雖然可能有許多經(jīng)過預(yù)訓(xùn)練的模型可以完成這項任務(wù),但選擇一個最接近當(dāng)前應(yīng)用程序的模型是很重要的。這就是 TAO 的特制模型有用的地方。
!tao unet train --gpus=1 --gpu_index=$GPU_INDEX -e $SPECS_DIR/spec_vanilla_unet.txt -r $USER_EXPERIMENT_DIR/semseg_experiment_unpruned -m $USER_EXPERIMENT_DIR/peoplesemsegnet.tlt -n model_freespace -k $KEY
訓(xùn)練模型后,根據(jù)驗證數(shù)據(jù)評估模型性能:
!taounetevaluate--gpu_index=$GPU_INDEX-e$SPECS_DIR/spec_vanilla_unet.txt
-m $USER_EXPERIMENT_DIR/semseg_experiment_unpruned/weights/model_freespace.tlt -o $USER_EXPERIMENT_DIR/semseg_experiment_unpruned/ -k $KEY
當(dāng)您對 NVIDIA Isaac Sim 數(shù)據(jù)的模型性能和 Sim2Sim 驗證性能感到滿意時,請刪減模型。
要以最小的延遲運行此模型,請將其優(yōu)化為在目標(biāo) GPU 上運行。有兩種方法可以實現(xiàn)這一點:
-
Pruning :TAO 工具套件中的修剪功能會自動刪減,有效地控制模型的大小。必須重新訓(xùn)練模型,以恢復(fù)修剪過程中損失的精度。
-
Post-training quantization :TAO 工具套件中的另一項功能可以進(jìn)一步縮小模型尺寸。這將其精度從 FP32 更改為 INT8 ,在不犧牲精度的情況下提高了性能。
首先,刪減模型:
!tao unet prune -e $SPECS_DIR/spec_vanilla_unet.txt -m $USER_EXPERIMENT_DIR/semseg_experiment_unpruned/weights/model_freespace.tlt -o $USER_EXPERIMENT_DIR/unet_experiment_pruned/model_unet_pruned.tlt -eq union -pth 0.1 -k $KEY
重新訓(xùn)練并修剪模型:
!tao unet train --gpus=1 --gpu_index=$GPU_INDEX -e $SPECS_DIR/spec_vanilla_unet_retrain.txt -r $USER_EXPERIMENT_DIR/unet_experiment_retrain -m $USER_EXPERIMENT_DIR/unet_experiment_pruned/model_unet_pruned.tlt -n model_unet_retrained -k $KEY
當(dāng)您對修剪模型的 Sim2Sim 驗證性能感到滿意時,請轉(zhuǎn)至下一步,對真實數(shù)據(jù)進(jìn)行微調(diào)。
!tao unet train --gpus=1 --gpu_index=$GPU_INDEX -e $SPECS_DIR/spec_vanilla_unet_domain_adpt.txt -r $USER_EXPERIMENT_DIR/semseg_experiment_domain_adpt -m $USER_EXPERIMENT_DIR/semseg_experiment_retrain/model_unet_pruned.tlt -n model_domain_adapt -k $KEY
結(jié)果
表 1 顯示了未運行和修剪模型之間的結(jié)果摘要。最終選擇用于部署的經(jīng)過修剪和量化的模型比在 NVIDIA Jetson Xavier NX 上測量的原始模型小 17 倍,推理性能快 5 倍。
▲表 3 Sim2Sim 和 Sim2Real 的結(jié)果
sim 數(shù)據(jù)的訓(xùn)練數(shù)據(jù)集由 25K 個圖像組成,而用于微調(diào)的真實圖像的訓(xùn)練數(shù)據(jù)僅由 44 個圖像組成。真實圖像的驗證數(shù)據(jù)集僅包含 56 幅圖像。對于真實世界的數(shù)據(jù),我們收集了三種不同室內(nèi)場景的數(shù)據(jù)集。模型的輸入圖像大小為 960 × 544。推理性能是使用 NVIDIA TensorRT trtexec 工具進(jìn)行測量的。
▲圖 5 在對真實世界數(shù)據(jù)進(jìn)行微調(diào)后,機器人真實世界圖像的結(jié)果
部署 NVIDIA IsaacROS
在本節(jié)中,我們展示了采用經(jīng)過訓(xùn)練和優(yōu)化的模型并使用 NVIDIA Isaac ROS 在 Jetson XavierNX 驅(qū)動的 iRobot 的 Create 3 機器人上進(jìn)行部署的步驟。Create 3 和 NVIDIA Isaac ROS 圖像分割節(jié)點均在 ROS2 上運行。
本例使用 /isaac_ros_image_segmentation/isaac_ros_unet GitHub repo 部署空閑空間分段。
▲圖 6 使用 ROS2 中的 rqt _圖像_查看器進(jìn)行圖像和分割遮罩
(左)在 Create 3 機器人上使用 USB 攝像頭;(右)使用 Isaac ros 圖像分割節(jié)點
要使用自由空間分段模型,請從 /NVIDIA-ISAAC-ROS/isaac_ros_image_segmentation GitHub repo 執(zhí)行以下步驟。
創(chuàng)建 Docker 交互式工作區(qū):
$isaac_ros_common/scripts/run_dev.sh your_ws
克隆所有軟件包的相關(guān)項:
-
isaac_ros_dnn_encoders
-
isaac_ros_nvengine_interfaces
-
推理包(您可以選擇其中一個)
-
isaac_ros_tensor_rt
-
isaac_ros_triton
構(gòu)建并獲取工作區(qū)的源代碼:
$cd/workspaces/isaac_ros-dev
$colcon build && . install/setup.bash
從您的工作機器上下載經(jīng)過訓(xùn)練的自由空間標(biāo)識(. etlt )模型:
$scp:
將加密的 TLT 模型(. etlt )和格式轉(zhuǎn)換為 TensorRT 引擎計劃。對 INT8 模型運行以下命令:
tao converter -k tlt_encode -e trt.fp16.freespace.engine -p input_1,1x3x544x960,1x3x544x960,1x3x544x960 unet_freespace.etlt
按照以下步驟進(jìn)行演練:Isaac ROS 圖像分割 :
-
將 TensorRT 模型引擎文件保存在正確的目錄中
-
創(chuàng)建 config.pbtxt.
-
更新 isaac_ros_unet 啟動文件中的模型引擎路徑和名稱
-
重新生成并運行以下命令:
colconbuild--packages-up-toisaac_ros_unet&&.install/setup.bash
ros2 launch isaac_ros_unet isaac_ros_unet_triton.launch.py
總結(jié)
在本文中,我們向您展示了一個端到端的工作流程,首先是在 NVIDIA Isaac Sim 中生成合成數(shù)據(jù),使用 TAO 工具套件進(jìn)行微調(diào),然后使用 NVIDIA Isaac ROS 部署模型。
NVIDIA Isaac Sim 和 TAO Toolkit 都是抽象出人工智能框架復(fù)雜性的解決方案,使您能夠在生產(chǎn)中構(gòu)建和部署人工智能驅(qū)動的機器人應(yīng)用程序,而無需任何人工智能專業(yè)知識。
原文標(biāo)題:使用NVIDIA Isaac Sim和NVIDIA TAO開發(fā)和部署人工智能驅(qū)動的機器人
文章出處:【微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
機器人
+關(guān)注
關(guān)注
210文章
27998瀏覽量
205558 -
NVIDIA
+關(guān)注
關(guān)注
14文章
4817瀏覽量
102637 -
TAO
+關(guān)注
關(guān)注
0文章
10瀏覽量
6987
原文標(biāo)題:使用NVIDIA Isaac Sim和NVIDIA TAO開發(fā)和部署人工智能驅(qū)動的機器人
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論