自由空间分割

2020-03-18  本文已影响0人  YottaYuan

自由空间分割

自由空间深度神经网络(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提供了更好的性能。

../../../_images/inference_warehouse.jpg

要使用针对室内训练的模型进行推断,请更改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中,您应该看到使用预先训练的人行道分割模型对样本图像进行推断。左侧的绿色,黄色,蓝色和红色分别表示道路,路缘,人行道和草地。

../../../_images/inference_sidewalk.jpg

要对在室内训练过的模型进行推断,请将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>

这次,自由空间和其他空间分别用黑色和红色表示。

../../../_images/inference_indoor.jpg

如果我们看一下上面使用的应用程序文件,位于 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

要在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_warehouseNavSim中的场景直接加载的 。

该应用程序使用TcpPublisher将传感器数据发布到用户定义的端口。该数据由培训应用程序使用。训练应用程序进而将传送命令发送到NavSim应用程序,该命令通过TcpSubscriber节点接收。

默认情况下,Unity场景中可使用Substance进行域随机化。这使您可以将不同的材质应用于场景中的网格,向角色应用随机姿势等。地面被标记为“地板”,每像素索引为1。

来自公共数据集的真实数据

MSCocoADE20K这样的数据集提供了多个类别的每像素分割数据。路径细分的相关类别包括路面,道路,地毯,大地,地面和多种类型的地板。在具有多个相机角度和遮挡度的各种环境中捕获图像,使其成为具有更好泛化能力的理想模型训练对象。MSCoco和ADE20K都用于训练室内自由空间的二进制分割模型。

具有自主数据收集功能的真实数据用于自由空间分割

艾萨克(Isaac)提供了从现实中自动创建数据的方法,以训练用于检测可穿越地面空间的模型。

自主数据收集

使用机器人自动收集数据是在真实条件下引入训练数据的好方法。大致可分为2个工作流程:

通过地图进行路径规划

注意

售货员路径仅反映通过航点的图形化路径。它不考虑空间的可到达性,可视化时可能会在无法到达的区域绘制路径。

../../../_images/autonomous_navigation.jpg
监控机器人位移
../../../_images/navigation_monitor.jpg

资料注解

手动执行数据注释是一项耗时的任务,尤其是在语义分割的情况下,需要每个像素的标签。对现实中收集的数据进行自动化处理可以节省大量时间。

估算值
../../../_images/ground_truth_generation.jpg

运行应用程序

使用配备有英特尔实感摄像头的卡特机器人,可以使用位于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”。

部署后,请按照以下步骤运行应用程序:

  1. 登录到机械手(通过SSH)。

  2. 导航到~/deploy/<user>默认情况下部署应用程序的目录。

  3. 修改以下命令后,运行应用程序:

./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,因为它满足以下条件:

U-Net是一个端到端的全卷积网络(FCN)(即,它仅包含卷积层而没有密集层)。

U-Net可以支持二进制和多类分割。唯一的区别在于最后一层的激活,对于二进制分段,它是Sigmoid;对于多类分段,它是Softmax。

训练网络

../../../_images/training.jpg

多GPU训练

在多GPU主机系统上,并行化所有GPU上的工作负载可能是一项强大的资产。Tensorflow中的并行性可以分为两种类型:

Tensorflow通过MirroredStrategyModule库支持数据并行性,该库可在每个GPU上镜像模型图,因此可以在每个GPU上接受独立的数据集进行训练。

讯息类型

消息具有以下类型:

小码

推理

讯息类型

消息具有以下类型:

小码

上一篇 下一篇

猜你喜欢

热点阅读