自由空间分割
自由空间深度神经网络(DNN)的目标是将图像分割成感兴趣的类别,例如可驱动空间和障碍物。DNN的输入是单眼图像,而输出是按像素分割。该程序包使您可以轻松地在仿真中训练自由空间DNN并将其用于执行真实世界的推理。尽管此模块化程序包可以支持各种应用程序,但本文档说明了用于室内的自由空间分段和用于室外的人行道分段的工作流。
本文档首先介绍如何快速进行推理和训练。随后介绍有关数据源,网络体系结构,多GPU训练和应用程序布局的详细信息。
自由空间分割的一种潜在用例是使用单眼相机避免障碍物。成本图或机器人环境的障碍图可以从各种来源创建,例如激光雷达和来自相机的深度信息。融合来自不同传感器的信息可以对成本图进行微调,并使机器人的避障功能更加强大。可以将由路径分割模型确定的自由空间投影到现实世界的坐标系统上,并用作避障的输入信息。
快速开始
推理
首先,输入以下命令:
bob@desktop:~/isaac$ bazel run packages/freespace_dnn/apps:freespace_dnn_inference_image -- --config inference:packages/freespace_dnn/apps/freespace_dnn_inference_medium_warehouse_tensorrt.config.json
然后在http://localhost:3000/打开Sight Web界面 。您应该看到在样本图像上使用预先训练的模型对仓库中的多类细分进行推断。左侧的绿色,黄色,蓝色和红色分别代表地板(自由空间),障碍物,墙壁和车道线。
小费
要使用TensorFlow代替TensorRT进行推理,请使用 freespace_dnn_inference_medium_warehouse_tensorflow.config.json
文件而不是 freespace_dnn_inference_medium_warehouse_tensorrt.config.json
上面的命令。结果看起来应该相同,但是TensorRT提供了更好的性能。
要使用针对室内训练的模型进行推断,请更改color_filename
参数在freespace_dnn_inference_image.app.json文件中./external/path_segmentation_images/sidewalk1.png
并运行以下命令:
bob@desktop:~/isaac$ bazel run packages/freespace_dnn/apps:freespace_dnn_inference_image -- --config inference:packages/freespace_dnn/apps/freespace_dnn_inference_sidewalk_tensorrt.config.json
在Sight中,您应该看到使用预先训练的人行道分割模型对样本图像进行推断。左侧的绿色,黄色,蓝色和红色分别表示道路,路缘,人行道和草地。
要对在室内训练过的模型进行推断,请将freespace_dnn_inference_image.app.json文件中的color_filename
参数更改为, 然后运行以下命令:./external/path_segmentation_images/indoor1.png
<pre style="box-sizing: border-box; font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; font-size: 12px; white-space: pre; margin: 0px; padding: 12px; line-height: normal; display: block; overflow: auto; color: rgb(64, 64, 64);">bob @ desktop:〜/ isaac $ bazel运行包/ freespace_dnn / apps:freespace_dnn_inference_image---config推断:packages / freespace_dnn / apps / freespace_dnn_inference_indoor_tensorflow.config.json </pre>
这次,自由空间和其他空间分别用黑色和红色表示。
如果我们看一下上面使用的应用程序文件,位于 packages / freespace_dnn / apps / freespace_dnn_inference_image.app.json,它的结构非常简单。推论子图被提供一个图像,该图像是从用color_filename
参数指定的路径读取的 。软件包/ freespace_dnn / apps /中有四个应用程序。您可以通过简单地更改下表中列出的图像源来使用它们:
<colgroup style="box-sizing: border-box;"><col width="50%" style="box-sizing: border-box;"><col width="50%" style="box-sizing: border-box;"></colgroup>
应用名称 | 图片来源 |
---|---|
freespace_dnn_inference_image | 磁盘上的图像 |
freespace_dnn_inference_replay | 磁盘上的视频 |
freespace_dnn_inference_v4l2 | 相机 |
freespace_dnn_inference_unity3d | 使用Unity3D模拟 |
通过使用推理子图并添加所需的组件(例如,机器人轮子驱动程序和避障),可以创建各种其他应用程序。
要将推理应用程序与Unity场景一起使用,您还必须提供定义摄像头隐形传送参数的配置文件。您可以通过在运行应用程序时将路径传递到配置文件来实现。例如,使用仓库场景运行推理应用程序的命令为:
<pre style="box-sizing: border-box; font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; font-size: 12px; white-space: pre; margin: 0px; padding: 12px; line-height: normal; display: block; overflow: auto; color: rgb(64, 64, 64);">bob @ desktop:〜/ isaac $ bazel运行包/ freespace_dnn / apps / freespace_dnn_inference_unity3d---config推断:packages / freespace_dnn / apps / freespace_dnn_inference_medium_warehouse_tensorrt.config.json,packages / freespace_dnn / apps / freespace_dnn。 </pre>
训练
要开始培训,请输入以下命令:
bob@desktop:~/isaac$ bazel run packages/freespace_dnn/apps:freespace_dnn_training
这将启动TensorFlow实例,并将其与通过TCP接收的带标签的图像一起训练。
如稍后所述,可以从使用Isaac SDK或公共数据集捕获并标记的真实数据中获取标记的图像,但是我们鼓励对“无限”标记的数据进行模拟训练。
Isaac当前支持用于训练自由空间DNN的Unity 3D引擎。要在Unity 3D中进行仿真训练,请运行以下命令来启动中型仓库场景的场景3:
bob@desktop:/<isaac_sim_unity3d_binary_dir>$ ./isaac_sim_unity3d.x86_64 --scene medium_warehouse --scenario 3
场景加载后,您可以按“ C”键禁用主摄像机。这样可以提高仿真帧速率,从而加快数据生成速度。
训练开始后,默认情况下,Tensorflow将定期将日志和检查点以及以下文件输出到/ tmp / path_segmentation:
- .meta文件:表示模型的图形结构。
- .data文件:存储所有已保存变量的值。
- .index文件:存储变量名称和形状的列表。
要在Tensorboard上查看培训进度,请运行以下命令并在浏览器中打开http:// localhost:6006。
tensorboard --logdir=/tmp/path_segmentation
训练完成后,请使用以下命令将最新检查点序列化为protobuf文件:
bob@desktop:~/isaac$ python3 packages/freespace_dnn/apps/freespace_dnn_training_freeze_model.py --checkpoint_dir /tmp/path_segmentation --output_nodename prediction/truediv --output_filename model.pb --output_onnx_filename model.onnx
使用生成的model.onnx文件,创建一个类似于 package / freespace_dnn / apps / freespace_dnn_inference_medium_warehouse_tensorrt.config.json文件的配置文件。您现在可以执行推理了。
数据
模拟数据
能够通过仿真生成无限的数据点是一项强大的资产,弥合了将仿真机器人与实际实验区分开的“现实差距”。模拟器提供了多种使之成为可能的功能,即域随机化和传送。
域随机化尝试通过改善无偏数据的可用性来弥合现实差距。领域随机化的训练数据使模型在推理期间对不同的照明条件,地板纹理和视野中的随机对象做出响应时更加健壮。
域随机化可以通过以下几种方式实现:
- 灯光随机化:更改灯光的颜色和强度
- 材料随机化:在所需表面上应用不同的物质材料
- 纹理随机化:对材质应用不同的纹理
- 颜色随机化:对材料应用不同的颜色
- 材料特性:改变材料特性,例如粗糙度,金属性和镜面性。这可以改变表面的摩擦,反射和折射特性以及其他特性。
传送使您可以在一定范围(平移和旋转)内随机采样相机姿势,以捕获来自不同高度和角度的数据。
设置与模拟器的通信
Isaac SDK和模拟器使用pub / sub架构进行通信:通过在创建数据的一侧建立TCP发布者,在接收数据的一侧建立TCP订阅者,在两个进程之间来回传递数据。
对于Unity 3D模拟,发布基本事实数据的应用程序为 packages / navsim / apps / navsim.app.json。这是由medium_warehouse
NavSim中的场景直接加载的 。
该应用程序使用TcpPublisher将传感器数据发布到用户定义的端口。该数据由培训应用程序使用。训练应用程序进而将传送命令发送到NavSim应用程序,该命令通过TcpSubscriber节点接收。
默认情况下,Unity场景中可使用Substance进行域随机化。这使您可以将不同的材质应用于场景中的网格,向角色应用随机姿势等。地面被标记为“地板”,每像素索引为1。
来自公共数据集的真实数据
像MSCoco和ADE20K这样的数据集提供了多个类别的每像素分割数据。路径细分的相关类别包括路面,道路,地毯,大地,地面和多种类型的地板。在具有多个相机角度和遮挡度的各种环境中捕获图像,使其成为具有更好泛化能力的理想模型训练对象。MSCoco和ADE20K都用于训练室内自由空间的二进制分割模型。
具有自主数据收集功能的真实数据用于自由空间分割
艾萨克(Isaac)提供了从现实中自动创建数据的方法,以训练用于检测可穿越地面空间的模型。
自主数据收集
使用机器人自动收集数据是在真实条件下引入训练数据的好方法。大致可分为2个工作流程:
- 通过地图进行路径规划
- 监控机器人位移
通过地图进行路径规划
- TravellingSalesman:此小代码在地图上可自由穿越的空间上绘制航点,并计算出最短路径。每个航点表示地图上的2D点。
注意
售货员路径仅反映通过航点的图形化路径。它不考虑空间的可到达性,可视化时可能会在无法到达的区域绘制路径。
- MoveAndScan:这将2D航点列表作为输入,并将其扩展为包括多个方向。每个2D位置包含的方向数量是用户定义的。因此,如果地图中有N个航路点和M个方向,则输出为NxM个姿势的列表。
- FollowPath:这将一个姿态列表作为输入,并将每个姿态(或航路点)发布到GoTo小码作为目标。这使机器人可以按顺序移动到每个航路点。
监控机器人位移
- NavigationMonitor:连续监视机器人的线性和角度位移。如果位移大于用户定义的阈值,它将发布RobotStateProto消息,其中包含当前姿态,当前速度和自上次更新以来的位移。在这种情况下,NavigationMonitor小码主要充当调节记录器功能何时记录一对原型消息的信号。
- 油门:相对于另一信号调节一个信号。在这种情况下,它相对于NavigationMonitor的RobotStateProto输出来调节摄像机输入。节流组件的主要目的是确保按间隔收集数据,以防止日志大小过快膨胀。
资料注解
手动执行数据注释是一项耗时的任务,尤其是在语义分割的情况下,需要每个像素的标签。对现实中收集的数据进行自动化处理可以节省大量时间。
估算值
- RgbdSuperpixels:使用单次通过聚类算法计算RGB-D图像的超像素聚类,该算法根据颜色和深度的相似性将每个像素分配给局部聚类。
- RgbdSuperpixelFreespace:将每个超像素标记为自由空间或障碍物。假设接地平面符合方程Z = 0,则超像素将转换为地面坐标系。
- SuperpixelImageLabelling:基于超像素标签创建原始相机的逐像素分段。
运行应用程序
使用配备有英特尔实感摄像头的卡特机器人,可以使用位于apps / carter / autonomous_data_collection / carter_data_collection.app.json上的应用程序从映射的环境中收集彩色和深度图像。此参考应用程序可以用作其他应用程序的基础。要收集数据,请通过运行以下命令将应用程序部署到Carter机械手:
bob@desktop:~/isaac$ ./engine/build/deploy.sh -h <robot_ip> -p //apps/carter/autonomous_data_collection:carter_data_collection-pkg -d jetpack43 --remote-user <username_on_nano>
<robot_ip>
机器人的IP地址在哪里,<username_on_robot>
是您在机器人上的用户名。如果未使用该--remote_user
选项指定用户名,则使用默认用户名“ nvidia”。
部署后,请按照以下步骤运行应用程序:
登录到机械手(通过SSH)。
导航到
~/deploy/<user>
默认情况下部署应用程序的目录。修改以下命令后,运行应用程序:
./apps/carter/autonomous_data_collection --config "apps/carter/robots/carter_1.config.json,apps/assets/maps/nvidia_R_180306.config.json" --graph="apps/assets/maps/nvidia_R_180306.graph.json"
机器人应在地图上绘制航点图,导航至每个点,然后旋转一个完整的圆。NavigationMonitor小代码监视位移并仅以特定间隔启用日志记录。
转至位于http: /// <robot_ip>:3000 / 的Sight Web界面,然后在“ 记录控制面板****”上单击“ 记录 ” 。这会将颜色和深度图像保存到文件中。
然后,您可以使用package / freespace_dnn / apps / freespace_dnn_data_annotation.subgraph.json 文件重播此日志,以标记可遍历空间并训练模型。
网络架构
对于二进制分段,Isaac SDK使用U-Net,因为它满足以下条件:
- 它易于在小型数据集上进行训练。
- 它能够在较短的推理时间内快速训练。
- 它支持TensorRT推理。
- 它具有兼容的许可证,因此可以完全集成到Isaac SDK中。
U-Net是一个端到端的全卷积网络(FCN)(即,它仅包含卷积层而没有密集层)。
U-Net可以支持二进制和多类分割。唯一的区别在于最后一层的激活,对于二进制分段,它是Sigmoid;对于多类分段,它是Softmax。
训练网络
多GPU训练
在多GPU主机系统上,并行化所有GPU上的工作负载可能是一项强大的资产。Tensorflow中的并行性可以分为两种类型:
- 数据并行性:数据分布在多个GPU或主机上。
- 模型并行性:模型本身分散在多台计算机或GPU中。例如,单层可以适合单台机器(或GPU)的内存,并且正向和反向传播涉及从一个主机(或GPU)到另一个主机的输出通信。
Tensorflow通过MirroredStrategyModule库支持数据并行性,该库可在每个GPU上镜像模型图,因此可以在每个GPU上接受独立的数据集进行训练。
讯息类型
消息具有以下类型:
- TensorProto:定义一个n维张量,该张量形成图像和张量对的基础进行训练。
- TensorListProto:定义TensorProto消息的列表,这些消息主要用于传递张量。
- ColorCameraProto:保存彩色图像和相机固有信息。
- SegmentationCameraProto:保存包含图像中每个像素的类标签的图像。它还包含与相机固有的信息,类似于ColorCameraProto。
小码
- TcpSubscriber:由培训应用程序用来从模拟器接收数据。在此示例中,使用了两个TcpSubscriber,每个TcpSubscriber接收来自仿真的彩色图像和检测标签。
- ColorCameraEncoderCpu:接收ColorCameraProto并输出存储在3D张量(WxHx3)中的降采样图像。张量以TensorListProto的形式发布,仅包含一个张量。小码还支持下采样,从而将图像缩小到用户定义的较小尺寸。
- SegmentationEncoder:接收SegmentationCameraProto并输出3D张量(WxHx1)。通过将1.0的概率分配给所考虑的类别的信道索引,并将0.0的概率分配给所有其他信道索引,此小码负责对标记的数据进行编码以进行语义分段。张量以TensorListProto的形式发布,仅包含一个张量。
- TensorSynchronization:接收两个TensorListProto输入,并根据其获取时间对其进行同步。此小代码可确保训练代码获得同步的彩色图像和分段标签数据。
- SampleAccumulator:将训练对(图像张量和分段标签张量)作为TensorListProto并将其存储在缓冲区中。该小代码绑定到Python脚本,以便训练脚本可以使用
acquire_samples()
函数直接从此缓冲区采样。该acquire_samples()
函数将TensorListProto转换为具有相应尺寸的numpy数组列表,并将其传递给Python脚本。 - 传送:以预定义的方式发布RigidBody3GroupProto,以随机更改生成位置。它包括一个选项,用于提供样条曲线参数,以沿样条曲线的切线执行均匀的随机采样。
推理
讯息类型
消息具有以下类型:
- TensorProto:定义一个n维张量,该张量形成图像和张量对的基础进行训练。
- TensorListProto:定义TensorProto的列表。TensorProto消息主要用于传递张量。
- ColorCameraProto:保存彩色图像,包括照相机固有信息。
小码
- CropAndDownsample:以ColorCameraProto为输入,以像素为参数开始裁切,裁切尺寸以及对图像进行下采样的尺寸。该小码有助于将输入图像降采样为网络所需的大小,同时仍保持宽高比。
- ColorCameraEncoderCpu:以ColorCameraProto作为输入,并输出存储在3D张量(WxHx3)中的降采样图像。张量以TensorListProto的形式发布,仅包含一个张量。小码还支持下采样,从而将图像缩小到用户定义的较小尺寸。
- TensorReshape:将TensorListProto作为输入,并根据用户定义的大小调整每个TensorProto的形状。在这种情况下,由于Tensorflow接受NHWC格式的输入,因此此小代码主要用于在输入张量中添加额外的维度来描述批处理大小。因此,小码还用于从神经网络的输出中删除第一维。
- TensorflowInference:将冻结的神经网络加载到内存中,并以TensorListProto作为输入传递到网络。使用Tensorflow对输入图像执行推断。以TensorListProto的形式发布网络输出。
- TensorRTInference:将冻结的神经网络以UFF或ONNX文件的形式加载到内存中。接收TensorListProto作为输入以传递到网络。根据提供的模型创建TensorRT运行时引擎,并使用它对输入图像执行推理。以TensorListProto的形式发布网络输出。
- TensorArgMax:将神经网络的输出(即尺寸(W x H x C)的张量)减小为尺寸(W x H)的张量。它根据用户定义的阈值沿通道维离散张量。