从制造汽车到帮助外科医生和送披萨,机器人不仅逐渐自动化,而且将完成任务的速度提高了许多倍。随着人工智能的出现,机器人可以更加智能化,更好地感知周围环境,并在最少的人工干预下做出决策。
例如,一个用于仓库的自主机器人将有效载荷从一个地方移动到另一个地方。它必须感知周围的自由空间,检测并避免路径中的任何障碍,并做出“即时”决定,选择路径。
而这就是挑战所在,这意味着需要构建一个由人工智能模型支持的应用程序,该模型经过训练和优化,可以在这种环境下工作。训练和优化模型需要收集大量高质量的数据,并开发一个高度精确的人工智能模型来驱动应用程序。这些是将应用程序从实验室转移到生产环境的关键障碍。
在这篇文章中,我们将展示如何使用 NVIDIA Isaac 平台和 TAO 框架解决数据挑战和模型创建挑战。NVIDIA Isaac Sim 是一个机器人模拟应用程序,用于创建虚拟环境和生成合成数据。NVIDIA TAO 工具套件是一种低代码人工智能模型开发解决方案,与从头开始的训练相比,它具有内置的转移学习功能,可以用一小部分数据微调预训练模型。最后,使用 NVIDIA Isaac ROS 将优化模型部署到机器人上,并将其应用于现实世界。
▲ 图 1 概述使用 NVIDIA Isaac Sim 对 TAO 模型进行合成数据训练的工作流程,以适应现实世界的用例
先决条件
开始之前,请确认拥有以下用于训练和部署的资源:
NVIDIA GPU 驱动程序版本:> 470
NVIDIA Docker:2.5.0-1
NVIDIA GPU 云端或内部:
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 Isaac Sim 生成合成数据
在本节中,我们将概述在 NVIDIA Isaac Sim 中生成合成数据的步骤。Synthetic Data 是计算机模拟或算法生成的注释信息。当真实数据难以获取或成本高昂时,合成数据可以帮助解决数据难题。
NVIDIA Isaac Sim 提供三种生成合成数据的方法:
创建 Replicator
Python 脚本
GUI
在这个实验中,我们选择使用 Python 脚本生成具有领域随机化的数据。Domain randomization 改变在模拟环境中定义场景的参数,包括场景中各种对象的位置、比例、模拟环境的照明、对象的颜色和纹理等。
添加域随机化以同时改变场景的多个参数,通过将其暴露于现实世界中看到的各种域参数,提高了数据集质量并增强了模型的性能。
本例中使用了两个环境来训练数据:一个仓库和一个小房间。接下来的步骤包括向场景中添加符合物理定律的对象。我们使用了 NVIDIA Isaac Sim 中的示例对象,其中还包括 YCB dataset 中的日常对象。
▲ 图 2 简单房间和仓库环境中的模拟图像示例
安装 NVIDIA Isaac Sim 后 Isaac Sim App 选择器提供了一个在文件夹中打开的选项,其中包含一个 python.sh 脚本。这将用于运行数据生成的脚本。
按照下方列出的步骤生成数据。
选择环境并将摄影机添加到场景中:
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对于生成正确的自由空间分割掩码是非常重要的。如前所述,应用领域随机化来帮助提高模型的 sim2real 性能。
NVIDIA Isaac Sim 说明中提供的离线数据生成示例是我们脚本的起点。对这个用例进行了更改,包括使用物理向场景添加对象、更新域随机化,以及添加语义。我们已经为数据集生成了近 30,000 张带有相应分割模板的图像。
使用 TAO 工具套件进行训练、适应和优化
在本节中,您将使用 TAO 工具套件生成的合成数据对模型进行微调。为了完成这项任务,我们选择了 NGC 提供的 UNET 模型进行实验。
!ngc registry model list nvidia/tao/pretrained_semantic_segmentation:*
设置数据、规格文件( TAO 规格)和实验目录:
%set_env KEY=tlt_encode
%set_env GPU_INDEX=0
%set_env USER_EXPERIMENT_DIR=/workspace/experiments
%set_env DATA_DOWNLOAD_DIR=/workspace/freespace_data
%set_env SPECS_DIR=/workspace/specs
下一步是选择模型。
选择正确的预训练模型
预训练人工智能和深度学习模型是在代表性数据集上进行训练并使用权重和偏差进行微调的模型。与从头开始的训练相比,只需使用一小部分数据就可以应用迁移学习,您可以快速轻松地微调预训练模型。
在预训练模型领域中,有一些模型执行特定任务,比如检测人、汽车、车牌等。
我们首先选择了一个带有 ResNet10 和 ResNet18 主干的 U-Net 模型。从模型中获得的结果显示,在真实数据中,墙和地板合并为一个实体,而不是两个单独的实体。即使模型在模拟图像上的性能显示出较高的精度,这也是事实。
▲ 表 1 不同预训练模型的实验可从 TAO 的 NGC 平台获得
我们用不同的主干和图像大小进行实验,观察延迟( FPS )与准确性之间的权衡。表中所有型号均相同( UNET ),只有 backbones 不同。
▲ 图 3 ResNet18 模型的预测。(左)模拟图像;(右)真实世界的图像
根据结果,我们显然需要一个更适合用例的不同模型。我们选择了 NGC 目录中提供的 PeopleSemSeg 型号。该模型在“ person ”类的 500 万个对象上进行了预训练,数据集由相机高度、人群密度和视野( FOV )组成。该模型还可以将背景和自由空间分割为两个独立的实体。
在使用相同的数据集对该模型进行训练后,平均 IOU 增加了 10% 以上,得到的图像清楚地显示了地板和墙壁之间更好的分割。
▲ 表 2 PeopleSegNet 可训练模型的实验
▲ 图 4 网络迁移学习的预测结果 PeopleSegTAO 包含合成数据(左)和真实数据(右)的模型
图 4 显示了在使用真实数据对 PeopleSeg 模型进行微调之前,从机器人的角度在模拟图像和真实图像上识别自由空间。也就是说,使用纯 NVIDIA Isaac Sim 数据训练的模型。
关键的一点是,虽然可能有许多经过预训练的模型可以完成这项任务,但选择一个最接近当前应用程序的模型是很重要的。这就是 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
训练模型后,根据验证数据评估模型性能:
!tao unet evaluate --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
当您对 NVIDIA Isaac Sim 数据的模型性能和 Sim2Sim 验证性能感到满意时,请删减模型。
要以最小的延迟运行此模型,请将其优化为在目标 GPU 上运行。有两种方法可以实现这一点:
Pruning :TAO 工具套件中的修剪功能会自动删减,有效地控制模型的大小。必须重新训练模型,以恢复修剪过程中损失的精度。
Post-training quantization :TAO 工具套件中的另一项功能可以进一步缩小模型尺寸。这将其精度从 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
重新训练并修剪模型:
!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
当您对修剪模型的 Sim2Sim 验证性能感到满意时,请转至下一步,对真实数据进行微调。
!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
结果
表 1 显示了未运行和修剪模型之间的结果摘要。最终选择用于部署的经过修剪和量化的模型比在 NVIDIA Jetson Xavier NX 上测量的原始模型小 17 倍,推理性能快 5 倍。
▲ 表 3 Sim2Sim 和 Sim2Real 的结果
sim 数据的训练数据集由 25K 个图像组成,而用于微调的真实图像的训练数据仅由 44 个图像组成。真实图像的验证数据集仅包含 56 幅图像。对于真实世界的数据,我们收集了三种不同室内场景的数据集。模型的输入图像大小为 960 × 544。推理性能是使用 NVIDIA TensorRT trtexec 工具进行测量的。
▲ 图 5 在对真实世界数据进行微调后,机器人真实世界图像的结果
部署 NVIDIA Isaac ROS
在本节中,我们展示了采用经过训练和优化的模型并使用 NVIDIA Isaac ROS 在 Jetson Xavier NX 驱动的 iRobot 的 Create 3 机器人上进行部署的步骤。Create 3 和 NVIDIA Isaac ROS 图像分割节点均在 ROS2 上运行。
本例使用 /isaac_ros_image_segmentation/isaac_ros_unet GitHub repo 部署空闲空间分段。
▲ 图 6 使用 ROS2 中的 rqt _图像_查看器进行图像和分割遮罩
(左)在 Create 3 机器人上使用 USB 摄像头;(右)使用 Isaac ros 图像分割节点
要使用自由空间分段模型,请从 /NVIDIA-ISAAC-ROS/isaac_ros_image_segmentation GitHub repo 执行以下步骤。
创建 Docker 交互式工作区:
$isaac_ros_common/scripts/run_dev.sh your_ws
克隆所有软件包的相关项:
isaac_ros_dnn_encoders
isaac_ros_nvengine_interfaces
推理包(您可以选择其中一个)
isaac_ros_tensor_rt
isaac_ros_triton
构建并获取工作区的源代码:
$cd /workspaces/isaac_ros-dev
$colcon build && . install/setup.bash
从您的工作机器上下载经过训练的自由空间标识(. etlt )模型:
$scp :
将加密的 TLT 模型(. etlt )和格式转换为 TensorRT 引擎计划。对 INT8 模型运行以下命令:
tao converter -k tlt_encode -e trt.fp16.freespace.engine -p input_1,1x3x544x960,1x3x544x960,1x3x544x960 unet_freespace.etlt
按照以下步骤进行演练:Isaac ROS 图像分割 :
将 TensorRT 模型引擎文件保存在正确的目录中
创建 config.pbtxt.
更新 isaac_ros_unet 启动文件中的模型引擎路径和名称
重新生成并运行以下命令:
colcon build --packages-up-to isaac_ros_unet && . install/setup.bash
ros2 launch isaac_ros_unet isaac_ros_unet_triton.launch.py
总结
在本文中,我们向您展示了一个端到端的工作流程,首先是在 NVIDIA Isaac Sim 中生成合成数据,使用 TAO 工具套件进行微调,然后使用 NVIDIA Isaac ROS 部署模型。
NVIDIA Isaac Sim 和 TAO Toolkit 都是抽象出人工智能框架复杂性的解决方案,使您能够在生产中构建和部署人工智能驱动的机器人应用程序,而无需任何人工智能专业知识。
原文标题:使用NVIDIA Isaac Sim和NVIDIA TAO开发和部署人工智能驱动的机器人
文章出处:【微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。
全部0条评论
快来发表一下你的评论吧 !