├── CLA.md ├── LICENSE.md ├── README.md ├── cloud ├── README.md ├── cloud_sdg.ipynb └── training │ ├── .ipynb_checkpoints │ └── cloud_train-checkpoint.ipynb │ ├── cloud_train.ipynb │ └── tao │ └── specs │ ├── inference │ ├── .ipynb_checkpoints │ │ └── new_inference_specs-checkpoint.txt │ └── new_inference_specs.txt │ ├── tfrecords │ ├── .ipynb_checkpoints │ │ ├── distractors_additional-checkpoint.txt │ │ ├── distractors_warehouse-checkpoint.txt │ │ └── no_distractors-checkpoint.txt │ ├── distractors_additional.txt │ ├── distractors_warehouse.txt │ └── no_distractors.txt │ └── training │ ├── .ipynb_checkpoints │ └── resnet18_distractors-checkpoint.txt │ └── resnet18_distractors.txt ├── images ├── loco_palletjacks │ ├── 1564562568.298206.jpg │ ├── 1564562628.517229.jpg │ ├── 1564562671.2769265.jpg │ ├── 1564562843.0618184.jpg │ ├── 1564563939.2498121.jpg │ ├── 1564563941.2643266.jpg │ ├── 1564564477.8315344.jpg │ ├── 1564564608.7540288.jpg │ ├── 1564564867702,99.jpg │ ├── 1574674966.043515.jpg │ ├── 1574675023.097059.jpg │ ├── 1574675145.7230172.jpg │ ├── 1574675156.020139.jpg │ ├── 1574675156.7667925.jpg │ ├── 1574675164.5134397.jpg │ ├── 1574675587024,65.jpg │ ├── 1574675590005,88.jpg │ ├── 1574675593.8838139.jpg │ ├── 1574675645.8659928.jpg │ ├── 1574675657.9895825.jpg │ ├── 1574675729.036457.jpg │ ├── 1574676301.361285.jpg │ ├── 1574676447.562495.jpg │ ├── 1574679194.2192037.jpg │ ├── 1576592006.4469478.jpg │ ├── 1576592741574,07.jpg │ ├── 1576592752171,47.jpg │ ├── 1576593611.6224425.jpg │ ├── 1576594779.3298974.jpg │ ├── 1576596021.9482577.jpg │ ├── 1579163389986,09.jpg │ ├── 1579163400.4232957.jpg │ ├── 1579163403.3200178.jpg │ ├── 2044458,0127.jpg │ ├── 426023,9672.jpg │ ├── 509815376,8831.jpg │ ├── 510196244,1362.jpg │ ├── 510664610,1022.jpg │ ├── 516447400,977.jpg │ ├── 516449535,2259.jpg │ ├── 593768,3659.jpg │ └── 598835,2028.jpg ├── real_world_results │ ├── 1564562568.298206.jpg │ ├── 1564562628.517229.jpg │ ├── 1564562671.2769265.jpg │ ├── 1564562843.0618184.jpg │ ├── 1564563939.2498121.jpg │ ├── 1564563941.2643266.jpg │ ├── 1564564477.8315344.jpg │ ├── 1564564608.7540288.jpg │ ├── 1564564867702,99.jpg │ ├── 1574674966.043515.jpg │ ├── 1574675023.097059.jpg │ ├── 1574675145.7230172.jpg │ ├── 1574675156.020139.jpg │ ├── 1574675156.7667925.jpg │ ├── 1574675164.5134397.jpg │ ├── 1574675587024,65.jpg │ ├── 1574675590005,88.jpg │ ├── 1574675593.8838139.jpg │ ├── 1574675645.8659928.jpg │ ├── 1574675657.9895825.jpg │ ├── 1574675729.036457.jpg │ ├── 1574676301.361285.jpg │ ├── 1574676447.562495.jpg │ ├── 1574679194.2192037.jpg │ ├── 1576592006.4469478.jpg │ ├── 1576592741574,07.jpg │ ├── 1576592752171,47.jpg │ ├── 1576593611.6224425.jpg │ ├── 1576594779.3298974.jpg │ ├── 1576596021.9482577.jpg │ ├── 1579163389986,09.jpg │ ├── 1579163400.4232957.jpg │ ├── 1579163403.3200178.jpg │ ├── 2044458,0127.jpg │ ├── 426023,9672.jpg │ ├── 509815376,8831.jpg │ ├── 510196244,1362.jpg │ ├── 510664610,1022.jpg │ ├── 516447400,977.jpg │ ├── 516449535,2259.jpg │ ├── 593768,3659.jpg │ └── 598835,2028.jpg ├── sample_synthetic │ ├── 138.png │ ├── 1545.png │ ├── 203.png │ ├── 21.png │ ├── 215.png │ ├── 220.png │ ├── 378.png │ ├── 411.png │ ├── 444.png │ ├── 512.png │ ├── 56.png │ ├── 653.png │ ├── 896.png │ ├── 897.png │ └── 92.png └── tensorboard │ └── tensorboard_resized_palletjack.png ├── local ├── README.md ├── generate_data.sh ├── local_train.ipynb └── training │ └── tao │ └── specs │ ├── inference │ ├── .ipynb_checkpoints │ │ └── new_inference_specs-checkpoint.txt │ └── new_inference_specs.txt │ ├── tfrecords │ ├── .ipynb_checkpoints │ │ ├── distractors_additional-checkpoint.txt │ │ ├── distractors_warehouse-checkpoint.txt │ │ └── no_distractors-checkpoint.txt │ ├── distractors_additional.txt │ ├── distractors_warehouse.txt │ └── no_distractors.txt │ └── training │ ├── .ipynb_checkpoints │ └── resnet18_distractors-checkpoint.txt │ └── resnet18_distractors.txt └── palletjack_sdg ├── palletjack_datagen.sh └── standalone_palletjack_sdg.py /CLA.md: -------------------------------------------------------------------------------- 1 | ## Individual Contributor License Agreement (CLA) 2 | 3 | **Thank you for submitting your contributions to this project.** 4 | 5 | By signing this CLA, you agree that the following terms apply to all of your past, present and future contributions 6 | to the project. 7 | 8 | ### License. 9 | 10 | You hereby represent that all present, past and future contributions are governed by the 11 | [MIT License](https://opensource.org/licenses/MIT) 12 | copyright statement. 13 | 14 | This entails that to the extent possible under law, you transfer all copyright and related or neighboring rights 15 | of the code or documents you contribute to the project itself or its maintainers. 16 | Furthermore you also represent that you have the authority to perform the above waiver 17 | with respect to the entirety of you contributions. 18 | 19 | ### Moral Rights. 20 | 21 | To the fullest extent permitted under applicable law, you hereby waive, and agree not to 22 | assert, all of your “moral rights” in or relating to your contributions for the benefit of the project. 23 | 24 | ### Third Party Content. 25 | 26 | If your Contribution includes or is based on any source code, object code, bug fixes, configuration changes, tools, 27 | specifications, documentation, data, materials, feedback, information or other works of authorship that were not 28 | authored by you (“Third Party Content”) or if you are aware of any third party intellectual property or proprietary 29 | rights associated with your Contribution (“Third Party Rights”), 30 | then you agree to include with the submission of your Contribution full details respecting such Third Party 31 | Content and Third Party Rights, including, without limitation, identification of which aspects of your 32 | Contribution contain Third Party Content or are associated with Third Party Rights, the owner/author of the 33 | Third Party Content and Third Party Rights, where you obtained the Third Party Content, and any applicable 34 | third party license terms or restrictions respecting the Third Party Content and Third Party Rights. For greater 35 | certainty, the foregoing obligations respecting the identification of Third Party Content and Third Party Rights 36 | do not apply to any portion of a Project that is incorporated into your Contribution to that same Project. 37 | 38 | ### Representations. 39 | 40 | You represent that, other than the Third Party Content and Third Party Rights identified by 41 | you in accordance with this Agreement, you are the sole author of your Contributions and are legally entitled 42 | to grant the foregoing licenses and waivers in respect of your Contributions. If your Contributions were 43 | created in the course of your employment with your past or present employer(s), you represent that such 44 | employer(s) has authorized you to make your Contributions on behalf of such employer(s) or such employer 45 | (s) has waived all of their right, title or interest in or to your Contributions. 46 | 47 | ### Disclaimer. 48 | 49 | To the fullest extent permitted under applicable law, your Contributions are provided on an "as is" 50 | basis, without any warranties or conditions, express or implied, including, without limitation, any implied 51 | warranties or conditions of non-infringement, merchantability or fitness for a particular purpose. You are not 52 | required to provide support for your Contributions, except to the extent you desire to provide support. 53 | 54 | ### No Obligation. 55 | 56 | You acknowledge that the maintainers of this project are under no obligation to use or incorporate your contributions 57 | into the project. The decision to use or incorporate your contributions into the project will be made at the 58 | sole discretion of the maintainers or their authorized delegates. -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 2 | SPDX-License-Identifier: MIT 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a 5 | copy of this software and associated documentation files (the "Software"), 6 | to deal in the Software without restriction, including without limitation 7 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 | and/or sell copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in 12 | all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20 | DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Synthetic Data Generation and Training with Sim Ready Assets 2 | This project provides a workflow for Training Computer Vision models with Synthetic Data. We will use Isaac Sim with Omniverse Replicator to generate data for our use case and objects of interest. To ensure seamless compatibility with model training, the data generated is in the KITTI format. 3 | 4 | These steps can be followed on a Cloud/remote GPU instance or locally 5 | 6 | ## How to use this repository 7 | - [Guide](local/README.md) for running the workflow locally 8 | - [Guide](cloud/README.md) for running on a cloud/remote instance 9 | 10 | ## Workflow Components: 11 | * Generating Data: Use Isaac Sim to generate data 12 | * Training: We will use TAO toolkit, however users can train a model in a framework of their choice with data generated 13 | 14 | ### SDG 15 | - Using the `palletjack` assets from the Warehouse Sim Ready Asset collection 16 | 17 | - Carry out Domain Randomization in the scene with Replicator: 18 | - Various attributes of the scene like lighting, textures, object pose and materials can be modified 19 | - Important to generate a good quality dataset to ensure model detects objects in the real world 20 | 21 | - Data output KITTI format 22 | - We will use the KITTI Writer for generating annotations 23 | - Possible to implement a custom writer (can be useful when data is expected in a certain format for your model) 24 | 25 | - Sample generated images: 26 | 27 |

28 | 29 | 30 |

31 | 32 |

33 | 34 | 35 |

36 | 37 | 38 | 39 | ### Training 40 | - TAO: Outline of steps 41 | - Generating Tfrecords 42 | 43 | - Model training and evaluation 44 | - Model backbone selction 45 | - Hyperparameters specified via `spec` file (provided with repo) 46 | - Running inference with trained model 47 | 48 | - Sample real world detections on LOCO dataset images: 49 | 50 |

51 | 52 | 53 |

54 | 55 |

56 | 57 | 58 |

59 | 60 |

61 | 62 | 63 |

64 | 65 | 66 | ### Deployment 67 | - Perform Optimizations: Pruning and QAT with TAO to reduce model size and improve performance 68 | - Deploy on NVIDIA Jetson powered Robot with Isaac ROS or Deepstream 69 | 70 | 71 | ## References: 72 | - Real world images from the [LOCO dataset](https://github.com/tum-fml/loco) are used for visualizing model performance 73 | -------------------------------------------------------------------------------- /cloud/README.md: -------------------------------------------------------------------------------- 1 | # Requirements 2 | - Access to a cloud/remote GPU instance (workflow tested on a `g4dn` AWS EC2 instance with T4 GPU) 3 | - Docker setup instructions are provided in the notebooks 4 | - Entire workflow can be run in `headless` mode (SDG script and training) 5 | 6 | 7 | ## Synthetic Data Generation 8 | - Use the Isaac Sim docker container for running the Data Generation [script](../palletjack_sdg/palletjack_datagen.sh) 9 | - We will generate data for warehouse `palletjack` objects in KITTI format 10 | - Follow the steps in the `cloud_sdg` notebook 11 | - This generated data can be used to train your own model (framework and architecture of your choice), in this workflow we demonstrate using TAO for training 12 | 13 | 14 | ## Training with TAO Toolkit 15 | - The `training/cloud_train` notebook provides a walkthrough of the steps: 16 | - Setting up TAO docker container 17 | - Downloading pre-trained model, we will use the `DetectNet_v2` model with a `resnet_18` backbone 18 | - Running TAO training with `spec` files provided 19 | - Visualizing model performance on real world data 20 | - Visualize model metric with Tensorboard 21 | 22 | 23 | 24 | ## Next steps 25 | 26 | ### Generating Synthetic Data for your use case 27 | - Make changes in the Domain Randomization under the Synthetic Data Generation [script](../palletjack_sdg/standalone_palletjack_sdg.py) 28 | - Add additional objects of interest in the scene (similar to how palletjacks are added, you can add forklifts, ladders etc.) to generate dataUse different models for training with TAO (for object detection, you can use YOLO, SSD, EfficientDet) 29 | - Replicator provides Semantic Segmentation, Instance Segmentation, Depth and various other ground truth annotations along with RGB. You can also write your own ground truth annotator (eg: Pose Estimation: Refer to [sample](https://docs.omniverse.nvidia.com/isaacsim/latest/tutorial_replicator_offline_pose_estimation.html) These can be used for training a model of your own framework and choice) 30 | - Exploring the option of using Synthetic + Real data for training a network. Can be particularly useful for generating more data around particular corner cases 31 | 32 | ### Deploying Trained Models 33 | - The trained model can be pruned and optimized for inference with TAO 34 | - This can then be deployed on a robot with NVIDIA Jetson -------------------------------------------------------------------------------- /cloud/cloud_sdg.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Part 1: Synthetic Data Generation and Training Workflow with Warehouse Sim Ready Assets\n", 8 | "\n", 9 | "This notebook is the first part of the SDG and Training Workflow. We will be focusing on generating Synthetic Data for our use case\n", 10 | "\n", 11 | "A high level overview of the steps:\n", 12 | "* Pulling Isaac Sim Docker Container \n", 13 | "* Using Replicator API for Data Generation with Domain Randomization\n" 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": {}, 19 | "source": [ 20 | "### Table of Contents\n", 21 | "\n", 22 | "This notebook shows provides an overview of generating synthetic data using Warehouse Sim Ready assets with Isaac Sim and Omniverse Replicator. We will generate data for the `palletjack` class of objects. \n", 23 | "\n", 24 | "1. [Set up Isaac Sim via Docker Container](#head-1)\n", 25 | "2. [Generate Data for Detecting Palletjacks](#head-2)\n", 26 | "3. [Deeper dive into SDG script](#head-3)\n" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## 1. Set up Isaac Sim: Docker Container Installation \n", 34 | "\n", 35 | "### This step can be skipped if the Isaac Sim Docker container has already been set up on your Cloud/Remote Instance\n", 36 | "\n", 37 | "* Follow the [instructions](https://docs.omniverse.nvidia.com/isaacsim/2022.2.1/install_container.html) for Isaac Sim Container Installation\n", 38 | "* Ensure that `docker run` command on Step 7 works as expected and you are able to enter the container. \n", 39 | "\n", 40 | "We will use `./python.sh` in the container to run our SDG script. Please make sure you exit the container before running the next cells " 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": { 46 | "tags": [] 47 | }, 48 | "source": [ 49 | "## 2. Generate Data for Detecting Palletjacks \n", 50 | "\n", 51 | "* We can find the Palletjack USDs in the Warehouse Sim Ready asset collection (`http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/DigitalTwin/Assets/Warehouse/Equipment/Pallet_Trucks`)\n", 52 | "* First, we will mount our current local directory while running the docker container. This will ensure that we can run our scripts inside the Isaac Sim container. Data generated in the container will also be saved in this mounted directory." 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 1, 58 | "metadata": { 59 | "tags": [] 60 | }, 61 | "outputs": [ 62 | { 63 | "name": "stdout", 64 | "output_type": "stream", 65 | "text": [ 66 | "/home/karma/Downloads/getting_started_v4.0.1/notebooks/tao_launcher_starter_kit/detectnet_v2/sdg_and_training/sdg-and-training/palletjack_sdg\n" 67 | ] 68 | } 69 | ], 70 | "source": [ 71 | "import os\n", 72 | "\n", 73 | "# This is the directory which will be mounted into the Isaac Sim container. Make sure is updated correctly\n", 74 | "# os.environ[\"MOUNT_DIR\"]=os.path.join(, \"palletjack_sdg\")\n", 75 | "os.environ[\"LOCAL_PROJECT_DIR\"]=os.path.dirname(os.getcwd())\n", 76 | "os.environ[\"MOUNT_DIR\"] = os.path.join(os.getenv(\"LOCAL_PROJECT_DIR\"), \"palletjack_sdg\")\n", 77 | "print(os.getenv(\"MOUNT_DIR\"))" 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": null, 83 | "metadata": { 84 | "scrolled": true, 85 | "tags": [] 86 | }, 87 | "outputs": [], 88 | "source": [ 89 | "# Make sure the MOUNT_DIR location is correct, it shold have the scripts needed for SDG there\n", 90 | "\n", 91 | "!docker run --name isaac-sim --entrypoint bash -it --gpus all -e \"ACCEPT_EULA=Y\" --rm --network=host \\\n", 92 | " -v ~/docker/isaac-sim/cache/kit:/isaac-sim/kit/cache/Kit:rw \\\n", 93 | " -v ~/docker/isaac-sim/cache/ov:/root/.cache/ov:rw \\\n", 94 | " -v ~/docker/isaac-sim/cache/pip:/root/.cache/pip:rw \\\n", 95 | " -v ~/docker/isaac-sim/cache/glcache:/root/.cache/nvidia/GLCache:rw \\\n", 96 | " -v ~/docker/isaac-sim/cache/computecache:/root/.nv/ComputeCache:rw \\\n", 97 | " -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \\\n", 98 | " -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \\\n", 99 | " -v ~/docker/isaac-sim/documents:/root/Documents:rw \\\n", 100 | " -v $MOUNT_DIR:/isaac-sim/palletjack_sdg \\\n", 101 | " nvcr.io/nvidia/isaac-sim:2022.2.1 \\\n", 102 | " ./palletjack_sdg/palletjack_datagen.sh\n", 103 | " \n", 104 | "# Make sure $MOUNT_DIR is set correctly from the cell above" 105 | ] 106 | }, 107 | { 108 | "cell_type": "markdown", 109 | "metadata": {}, 110 | "source": [ 111 | "\n", 112 | "The data generation will begin in `headless` mode. We will be generating 5k images and using a 90:10 split for training and validation. " 113 | ] 114 | }, 115 | { 116 | "cell_type": "code", 117 | "execution_count": null, 118 | "metadata": { 119 | "tags": [] 120 | }, 121 | "outputs": [], 122 | "source": [ 123 | "# Once the data generation is complete, list the folders in the data directory\n", 124 | "\n", 125 | "!ls -rlt $MOUNT_DIR/palletjack_data\n", 126 | "\n", 127 | "# There hould be 3 folders -> 1. distractors_warehouse 2. distractors_additional 3. no_distractors " 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": {}, 133 | "source": [ 134 | "## 3. Deeper Dive into SDG Script \n", 135 | "\n", 136 | "* The `standalone_palletjack_sdg.py` is the Python script which runs and generates data in headless mode inside the container.\n", 137 | "* The overall flow of the script is similar to the `standalone_examples/replicator/offline_generation.py` file provided as a starting point with Isaac Sim\n", 138 | "\n", 139 | "\n", 140 | "* We will be carrying out specific randomizations targeted to our use case. Some of them are:\n", 141 | " * Camera Pose Randomization -> Should be similar to a robot perspective in the scene\n", 142 | " * Palletjack Color Randomization -> To ensure model is robust to variations in Palletjack colors\n", 143 | " * Distractors Pose Randomization -> To enable the model to *focus* on the right object (Our object of interest: Palletjack)\n", 144 | " * Lighting Randomization-> Model robust to lights and reflections/shadows in the scene\n", 145 | " * Floor and Wall Texture Randomization -> Model more robust to changes in background textures and features

\n", 146 | " \n", 147 | " \n", 148 | "* We are only interested in the `palletjack` object class, all other semantics are removed from the stage with the `update_semantics()` function\n", 149 | "\n", 150 | "* You can use a model of your own choice to train with this data (Pytorch/Tensorflow or other frameworks)\n", 151 | "\n", 152 | "* The data is written in the KITTI Format, this allows seamless integration with TAO to train a model. Refer to `training/cloud_train.ipynb` notebook (Part 2) for training with TAO\n" 153 | ] 154 | } 155 | ], 156 | "metadata": { 157 | "kernelspec": { 158 | "display_name": "Python 3 (ipykernel)", 159 | "language": "python", 160 | "name": "python3" 161 | }, 162 | "language_info": { 163 | "codemirror_mode": { 164 | "name": "ipython", 165 | "version": 3 166 | }, 167 | "file_extension": ".py", 168 | "mimetype": "text/x-python", 169 | "name": "python", 170 | "nbconvert_exporter": "python", 171 | "pygments_lexer": "ipython3", 172 | "version": "3.8.10" 173 | }, 174 | "vscode": { 175 | "interpreter": { 176 | "hash": "f23a2831654361cfd8b219e05b5055fdda3e37fe5c0b020e6226f740844c300a" 177 | } 178 | } 179 | }, 180 | "nbformat": 4, 181 | "nbformat_minor": 4 182 | } 183 | -------------------------------------------------------------------------------- /cloud/training/tao/specs/inference/.ipynb_checkpoints/new_inference_specs-checkpoint.txt: -------------------------------------------------------------------------------- 1 | inferencer_config{ 2 | # defining target class names for the experiment. 3 | # Note: This must be mentioned in order of the networks classes. 4 | target_classes: "palletjack" 5 | 6 | # Inference dimensions. 7 | image_width: 960 8 | image_height: 544 9 | # Must match what the model was trained for. 10 | image_channels: 3 11 | batch_size: 32 12 | gpu_index: 0 13 | # model handler config 14 | tlt_config{ 15 | model: "/workspace/tao-experiments/cloud/training/tao/detectnet_v2/resnet18_palletjack/weights/model.tlt" 16 | } 17 | } 18 | bbox_handler_config{ 19 | kitti_dump: true 20 | disable_overlay: false 21 | overlay_linewidth: 2 22 | 23 | classwise_bbox_handler_config{ 24 | key:"palletjack" 25 | value: { 26 | confidence_model: "aggregate_cov" 27 | output_map: "palletjack" 28 | bbox_color{ 29 | R: 255 30 | G: 0 31 | B: 0 32 | } 33 | clustering_config{ 34 | coverage_threshold: 0.005 35 | clustering_algorithm: DBSCAN 36 | coverage_threshold: 0.005 37 | dbscan_eps: 0.3 38 | dbscan_min_samples: 0.05 39 | dbscan_confidence_threshold: 0.9 40 | minimum_bounding_box_height: 20 41 | } 42 | } 43 | } 44 | classwise_bbox_handler_config{ 45 | key:"default" 46 | value: { 47 | confidence_model: "aggregate_cov" 48 | bbox_color{ 49 | R: 255 50 | G: 0 51 | B: 0 52 | } 53 | clustering_config{ 54 | clustering_algorithm: DBSCAN 55 | dbscan_confidence_threshold: 0.9 56 | coverage_threshold: 0.005 57 | dbscan_eps: 0.3 58 | dbscan_min_samples: 0.05 59 | minimum_bounding_box_height: 20 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /cloud/training/tao/specs/inference/new_inference_specs.txt: -------------------------------------------------------------------------------- 1 | inferencer_config{ 2 | # defining target class names for the experiment. 3 | # Note: This must be mentioned in order of the networks classes. 4 | target_classes: "palletjack" 5 | 6 | # Inference dimensions. 7 | image_width: 960 8 | image_height: 544 9 | # Must match what the model was trained for. 10 | image_channels: 3 11 | batch_size: 32 12 | gpu_index: 0 13 | # model handler config 14 | tlt_config{ 15 | model: "/workspace/tao-experiments/cloud/training/tao/detectnet_v2/resnet18_palletjack/weights/model.tlt" 16 | } 17 | } 18 | bbox_handler_config{ 19 | kitti_dump: true 20 | disable_overlay: false 21 | overlay_linewidth: 2 22 | 23 | classwise_bbox_handler_config{ 24 | key:"palletjack" 25 | value: { 26 | confidence_model: "aggregate_cov" 27 | output_map: "palletjack" 28 | bbox_color{ 29 | R: 255 30 | G: 0 31 | B: 0 32 | } 33 | clustering_config{ 34 | coverage_threshold: 0.005 35 | clustering_algorithm: DBSCAN 36 | coverage_threshold: 0.005 37 | dbscan_eps: 0.3 38 | dbscan_min_samples: 0.05 39 | dbscan_confidence_threshold: 0.9 40 | minimum_bounding_box_height: 20 41 | } 42 | } 43 | } 44 | classwise_bbox_handler_config{ 45 | key:"default" 46 | value: { 47 | confidence_model: "aggregate_cov" 48 | bbox_color{ 49 | R: 255 50 | G: 0 51 | B: 0 52 | } 53 | clustering_config{ 54 | clustering_algorithm: DBSCAN 55 | dbscan_confidence_threshold: 0.9 56 | coverage_threshold: 0.005 57 | dbscan_eps: 0.3 58 | dbscan_min_samples: 0.05 59 | minimum_bounding_box_height: 20 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /cloud/training/tao/specs/tfrecords/.ipynb_checkpoints/distractors_additional-checkpoint.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 12 | -------------------------------------------------------------------------------- /cloud/training/tao/specs/tfrecords/.ipynb_checkpoints/distractors_warehouse-checkpoint.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 12 | -------------------------------------------------------------------------------- /cloud/training/tao/specs/tfrecords/.ipynb_checkpoints/no_distractors-checkpoint.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 12 | -------------------------------------------------------------------------------- /cloud/training/tao/specs/tfrecords/distractors_additional.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 12 | -------------------------------------------------------------------------------- /cloud/training/tao/specs/tfrecords/distractors_warehouse.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 12 | -------------------------------------------------------------------------------- /cloud/training/tao/specs/tfrecords/no_distractors.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 12 | -------------------------------------------------------------------------------- /cloud/training/tao/specs/training/.ipynb_checkpoints/resnet18_distractors-checkpoint.txt: -------------------------------------------------------------------------------- 1 | random_seed: 42 2 | dataset_config { 3 | data_sources { 4 | tfrecords_path: "/workspace/tao-experiments/cloud/training/tao/tfrecords/distractors_warehouse/*" 5 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 6 | } 7 | 8 | data_sources { 9 | tfrecords_path: "/workspace/tao-experiments/cloud/training/tao/tfrecords/distractors_additional/*" 10 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 11 | } 12 | 13 | data_sources { 14 | tfrecords_path: "/workspace/tao-experiments/cloud/training/tao/tfrecords/no_distractors/*" 15 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 16 | } 17 | 18 | image_extension: "png" 19 | 20 | target_class_mapping { 21 | key: "palletjack" 22 | value: "palletjack" 23 | } 24 | 25 | validation_fold: 0 26 | 27 | } 28 | 29 | augmentation_config { 30 | preprocessing { 31 | output_image_width: 960 32 | output_image_height: 544 33 | min_bbox_width: 20.0 34 | min_bbox_height: 20.0 35 | output_image_channel: 3 36 | } 37 | spatial_augmentation { 38 | hflip_probability: 0.5 39 | zoom_min: 0.5 40 | zoom_max: 1.5 41 | translate_max_x: 8.0 42 | translate_max_y: 8.0 43 | } 44 | color_augmentation { 45 | hue_rotation_max: 25.0 46 | saturation_shift_max: 0.20000000298 47 | contrast_scale_max: 0.10000000149 48 | contrast_center: 0.5 49 | } 50 | } 51 | 52 | postprocessing_config { 53 | target_class_config { 54 | key: "palletjack" 55 | value { 56 | clustering_config { 57 | clustering_algorithm: DBSCAN 58 | dbscan_confidence_threshold: 0.9 59 | coverage_threshold: 0.00499999988824 60 | dbscan_eps: 0.15000000596 61 | dbscan_min_samples: 0.0500000007451 62 | minimum_bounding_box_height: 20 63 | } 64 | } 65 | } 66 | } 67 | 68 | model_config { 69 | pretrained_model_file: "/workspace/tao-experiments/cloud/training/tao/pretrained_model/resnet18.hdf5" 70 | num_layers: 18 71 | use_batch_norm: true 72 | objective_set { 73 | bbox { 74 | scale: 35.0 75 | offset: 0.5 76 | } 77 | cov { 78 | } 79 | } 80 | arch: "resnet" 81 | } 82 | 83 | evaluation_config { 84 | validation_period_during_training: 10 85 | first_validation_epoch: 5 86 | minimum_detection_ground_truth_overlap { 87 | key: "palletjack" 88 | value: 0.5 89 | } 90 | evaluation_box_config { 91 | key: "palletjack" 92 | value { 93 | minimum_height: 25 94 | maximum_height: 9999 95 | minimum_width: 25 96 | maximum_width: 9999 97 | } 98 | } 99 | average_precision_mode: INTEGRATE 100 | } 101 | 102 | cost_function_config { 103 | target_classes { 104 | name: "palletjack" 105 | class_weight: 1.0 106 | coverage_foreground_weight: 0.0500000007451 107 | objectives { 108 | name: "cov" 109 | initial_weight: 1.0 110 | weight_target: 1.0 111 | } 112 | objectives { 113 | name: "bbox" 114 | initial_weight: 10.0 115 | weight_target: 1.0 116 | } 117 | } 118 | enable_autoweighting: true 119 | max_objective_weight: 0.999899983406 120 | min_objective_weight: 9.99999974738e-05 121 | } 122 | 123 | training_config { 124 | batch_size_per_gpu: 32 125 | num_epochs: 100 126 | learning_rate { 127 | soft_start_annealing_schedule { 128 | min_learning_rate: 5e-06 129 | max_learning_rate: 5e-04 130 | soft_start: 0.10000000149 131 | annealing: 0.699999988079 132 | } 133 | } 134 | regularizer { 135 | type: L1 136 | weight: 3.00000002618e-09 137 | } 138 | optimizer { 139 | adam { 140 | epsilon: 9.99999993923e-09 141 | beta1: 0.899999976158 142 | beta2: 0.999000012875 143 | } 144 | } 145 | cost_scaling { 146 | initial_exponent: 20.0 147 | increment: 0.005 148 | decrement: 1.0 149 | } 150 | visualizer{ 151 | enabled: true 152 | num_images: 10 153 | scalar_logging_frequency: 10 154 | infrequent_logging_frequency: 5 155 | target_class_config { 156 | key: "palletjack" 157 | value: { 158 | coverage_threshold: 0.005 159 | } 160 | } 161 | } 162 | checkpoint_interval: 10 163 | } 164 | 165 | bbox_rasterizer_config { 166 | target_class_config { 167 | key: "palletjack" 168 | value { 169 | cov_center_x: 0.5 170 | cov_center_y: 0.5 171 | cov_radius_x: 1.0 172 | cov_radius_y: 1.0 173 | bbox_min_radius: 1.0 174 | } 175 | } 176 | deadzone_radius: 0.400000154972 177 | } 178 | -------------------------------------------------------------------------------- /cloud/training/tao/specs/training/resnet18_distractors.txt: -------------------------------------------------------------------------------- 1 | random_seed: 42 2 | dataset_config { 3 | data_sources { 4 | tfrecords_path: "/workspace/tao-experiments/cloud/training/tao/tfrecords/distractors_warehouse/*" 5 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 6 | } 7 | 8 | data_sources { 9 | tfrecords_path: "/workspace/tao-experiments/cloud/training/tao/tfrecords/distractors_additional/*" 10 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 11 | } 12 | 13 | data_sources { 14 | tfrecords_path: "/workspace/tao-experiments/cloud/training/tao/tfrecords/no_distractors/*" 15 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 16 | } 17 | 18 | image_extension: "png" 19 | 20 | target_class_mapping { 21 | key: "palletjack" 22 | value: "palletjack" 23 | } 24 | 25 | validation_fold: 0 26 | 27 | } 28 | 29 | augmentation_config { 30 | preprocessing { 31 | output_image_width: 960 32 | output_image_height: 544 33 | min_bbox_width: 20.0 34 | min_bbox_height: 20.0 35 | output_image_channel: 3 36 | } 37 | spatial_augmentation { 38 | hflip_probability: 0.5 39 | zoom_min: 0.5 40 | zoom_max: 1.5 41 | translate_max_x: 8.0 42 | translate_max_y: 8.0 43 | } 44 | color_augmentation { 45 | hue_rotation_max: 25.0 46 | saturation_shift_max: 0.20000000298 47 | contrast_scale_max: 0.10000000149 48 | contrast_center: 0.5 49 | } 50 | } 51 | 52 | postprocessing_config { 53 | target_class_config { 54 | key: "palletjack" 55 | value { 56 | clustering_config { 57 | clustering_algorithm: DBSCAN 58 | dbscan_confidence_threshold: 0.9 59 | coverage_threshold: 0.00499999988824 60 | dbscan_eps: 0.15000000596 61 | dbscan_min_samples: 0.0500000007451 62 | minimum_bounding_box_height: 20 63 | } 64 | } 65 | } 66 | } 67 | 68 | model_config { 69 | pretrained_model_file: "/workspace/tao-experiments/cloud/training/tao/pretrained_model/resnet18.hdf5" 70 | num_layers: 18 71 | use_batch_norm: true 72 | objective_set { 73 | bbox { 74 | scale: 35.0 75 | offset: 0.5 76 | } 77 | cov { 78 | } 79 | } 80 | arch: "resnet" 81 | } 82 | 83 | evaluation_config { 84 | validation_period_during_training: 10 85 | first_validation_epoch: 5 86 | minimum_detection_ground_truth_overlap { 87 | key: "palletjack" 88 | value: 0.5 89 | } 90 | evaluation_box_config { 91 | key: "palletjack" 92 | value { 93 | minimum_height: 25 94 | maximum_height: 9999 95 | minimum_width: 25 96 | maximum_width: 9999 97 | } 98 | } 99 | average_precision_mode: INTEGRATE 100 | } 101 | 102 | cost_function_config { 103 | target_classes { 104 | name: "palletjack" 105 | class_weight: 1.0 106 | coverage_foreground_weight: 0.0500000007451 107 | objectives { 108 | name: "cov" 109 | initial_weight: 1.0 110 | weight_target: 1.0 111 | } 112 | objectives { 113 | name: "bbox" 114 | initial_weight: 10.0 115 | weight_target: 1.0 116 | } 117 | } 118 | enable_autoweighting: true 119 | max_objective_weight: 0.999899983406 120 | min_objective_weight: 9.99999974738e-05 121 | } 122 | 123 | training_config { 124 | batch_size_per_gpu: 32 125 | num_epochs: 100 126 | learning_rate { 127 | soft_start_annealing_schedule { 128 | min_learning_rate: 5e-06 129 | max_learning_rate: 5e-04 130 | soft_start: 0.10000000149 131 | annealing: 0.699999988079 132 | } 133 | } 134 | regularizer { 135 | type: L1 136 | weight: 3.00000002618e-09 137 | } 138 | optimizer { 139 | adam { 140 | epsilon: 9.99999993923e-09 141 | beta1: 0.899999976158 142 | beta2: 0.999000012875 143 | } 144 | } 145 | cost_scaling { 146 | initial_exponent: 20.0 147 | increment: 0.005 148 | decrement: 1.0 149 | } 150 | visualizer{ 151 | enabled: true 152 | num_images: 10 153 | scalar_logging_frequency: 10 154 | infrequent_logging_frequency: 5 155 | target_class_config { 156 | key: "palletjack" 157 | value: { 158 | coverage_threshold: 0.005 159 | } 160 | } 161 | } 162 | checkpoint_interval: 10 163 | } 164 | 165 | bbox_rasterizer_config { 166 | target_class_config { 167 | key: "palletjack" 168 | value { 169 | cov_center_x: 0.5 170 | cov_center_y: 0.5 171 | cov_radius_x: 1.0 172 | cov_radius_y: 1.0 173 | bbox_min_radius: 1.0 174 | } 175 | } 176 | deadzone_radius: 0.400000154972 177 | } 178 | -------------------------------------------------------------------------------- /images/loco_palletjacks/1564562568.298206.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1564562568.298206.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1564562628.517229.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1564562628.517229.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1564562671.2769265.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1564562671.2769265.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1564562843.0618184.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1564562843.0618184.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1564563939.2498121.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1564563939.2498121.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1564563941.2643266.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1564563941.2643266.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1564564477.8315344.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1564564477.8315344.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1564564608.7540288.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1564564608.7540288.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1564564867702,99.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1564564867702,99.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574674966.043515.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574674966.043515.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675023.097059.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675023.097059.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675145.7230172.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675145.7230172.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675156.020139.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675156.020139.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675156.7667925.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675156.7667925.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675164.5134397.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675164.5134397.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675587024,65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675587024,65.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675590005,88.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675590005,88.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675593.8838139.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675593.8838139.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675645.8659928.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675645.8659928.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675657.9895825.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675657.9895825.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574675729.036457.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574675729.036457.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574676301.361285.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574676301.361285.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574676447.562495.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574676447.562495.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1574679194.2192037.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1574679194.2192037.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1576592006.4469478.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1576592006.4469478.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1576592741574,07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1576592741574,07.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1576592752171,47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1576592752171,47.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1576593611.6224425.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1576593611.6224425.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1576594779.3298974.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1576594779.3298974.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1576596021.9482577.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1576596021.9482577.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1579163389986,09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1579163389986,09.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1579163400.4232957.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1579163400.4232957.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/1579163403.3200178.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/1579163403.3200178.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/2044458,0127.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/2044458,0127.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/426023,9672.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/426023,9672.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/509815376,8831.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/509815376,8831.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/510196244,1362.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/510196244,1362.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/510664610,1022.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/510664610,1022.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/516447400,977.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/516447400,977.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/516449535,2259.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/516449535,2259.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/593768,3659.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/593768,3659.jpg -------------------------------------------------------------------------------- /images/loco_palletjacks/598835,2028.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/loco_palletjacks/598835,2028.jpg -------------------------------------------------------------------------------- /images/real_world_results/1564562568.298206.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1564562568.298206.jpg -------------------------------------------------------------------------------- /images/real_world_results/1564562628.517229.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1564562628.517229.jpg -------------------------------------------------------------------------------- /images/real_world_results/1564562671.2769265.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1564562671.2769265.jpg -------------------------------------------------------------------------------- /images/real_world_results/1564562843.0618184.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1564562843.0618184.jpg -------------------------------------------------------------------------------- /images/real_world_results/1564563939.2498121.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1564563939.2498121.jpg -------------------------------------------------------------------------------- /images/real_world_results/1564563941.2643266.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1564563941.2643266.jpg -------------------------------------------------------------------------------- /images/real_world_results/1564564477.8315344.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1564564477.8315344.jpg -------------------------------------------------------------------------------- /images/real_world_results/1564564608.7540288.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1564564608.7540288.jpg -------------------------------------------------------------------------------- /images/real_world_results/1564564867702,99.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1564564867702,99.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574674966.043515.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574674966.043515.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675023.097059.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675023.097059.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675145.7230172.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675145.7230172.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675156.020139.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675156.020139.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675156.7667925.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675156.7667925.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675164.5134397.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675164.5134397.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675587024,65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675587024,65.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675590005,88.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675590005,88.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675593.8838139.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675593.8838139.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675645.8659928.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675645.8659928.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675657.9895825.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675657.9895825.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574675729.036457.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574675729.036457.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574676301.361285.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574676301.361285.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574676447.562495.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574676447.562495.jpg -------------------------------------------------------------------------------- /images/real_world_results/1574679194.2192037.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1574679194.2192037.jpg -------------------------------------------------------------------------------- /images/real_world_results/1576592006.4469478.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1576592006.4469478.jpg -------------------------------------------------------------------------------- /images/real_world_results/1576592741574,07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1576592741574,07.jpg -------------------------------------------------------------------------------- /images/real_world_results/1576592752171,47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1576592752171,47.jpg -------------------------------------------------------------------------------- /images/real_world_results/1576593611.6224425.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1576593611.6224425.jpg -------------------------------------------------------------------------------- /images/real_world_results/1576594779.3298974.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1576594779.3298974.jpg -------------------------------------------------------------------------------- /images/real_world_results/1576596021.9482577.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1576596021.9482577.jpg -------------------------------------------------------------------------------- /images/real_world_results/1579163389986,09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1579163389986,09.jpg -------------------------------------------------------------------------------- /images/real_world_results/1579163400.4232957.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1579163400.4232957.jpg -------------------------------------------------------------------------------- /images/real_world_results/1579163403.3200178.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/1579163403.3200178.jpg -------------------------------------------------------------------------------- /images/real_world_results/2044458,0127.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/2044458,0127.jpg -------------------------------------------------------------------------------- /images/real_world_results/426023,9672.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/426023,9672.jpg -------------------------------------------------------------------------------- /images/real_world_results/509815376,8831.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/509815376,8831.jpg -------------------------------------------------------------------------------- /images/real_world_results/510196244,1362.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/510196244,1362.jpg -------------------------------------------------------------------------------- /images/real_world_results/510664610,1022.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/510664610,1022.jpg -------------------------------------------------------------------------------- /images/real_world_results/516447400,977.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/516447400,977.jpg -------------------------------------------------------------------------------- /images/real_world_results/516449535,2259.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/516449535,2259.jpg -------------------------------------------------------------------------------- /images/real_world_results/593768,3659.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/593768,3659.jpg -------------------------------------------------------------------------------- /images/real_world_results/598835,2028.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/real_world_results/598835,2028.jpg -------------------------------------------------------------------------------- /images/sample_synthetic/138.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/138.png -------------------------------------------------------------------------------- /images/sample_synthetic/1545.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/1545.png -------------------------------------------------------------------------------- /images/sample_synthetic/203.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/203.png -------------------------------------------------------------------------------- /images/sample_synthetic/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/21.png -------------------------------------------------------------------------------- /images/sample_synthetic/215.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/215.png -------------------------------------------------------------------------------- /images/sample_synthetic/220.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/220.png -------------------------------------------------------------------------------- /images/sample_synthetic/378.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/378.png -------------------------------------------------------------------------------- /images/sample_synthetic/411.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/411.png -------------------------------------------------------------------------------- /images/sample_synthetic/444.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/444.png -------------------------------------------------------------------------------- /images/sample_synthetic/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/512.png -------------------------------------------------------------------------------- /images/sample_synthetic/56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/56.png -------------------------------------------------------------------------------- /images/sample_synthetic/653.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/653.png -------------------------------------------------------------------------------- /images/sample_synthetic/896.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/896.png -------------------------------------------------------------------------------- /images/sample_synthetic/897.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/897.png -------------------------------------------------------------------------------- /images/sample_synthetic/92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/sample_synthetic/92.png -------------------------------------------------------------------------------- /images/tensorboard/tensorboard_resized_palletjack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NVIDIA-AI-IOT/synthetic_data_generation_training_workflow/c4039ea4f8ac83af38f36433e7730c15d5c3b224/images/tensorboard/tensorboard_resized_palletjack.png -------------------------------------------------------------------------------- /local/README.md: -------------------------------------------------------------------------------- 1 | # Requirements 2 | - Install [Isaac Sim](https://docs.omniverse.nvidia.com/isaacsim/latest/install_workstation.html) 3 | - Training via TAO Toolkit Docker container (TAO setup instructions in `local_train` notebook) 4 | 5 | 6 | ## Synthetic Data Generation 7 | - Provide the path of your Isaac Sim installation folder in the `generate_data.sh` script 8 | - Make the script an executable after adding the Isaac Sim Path (`chmod +x generate_data.sh`) 9 | - Run the script (`./generate_data.sh`) 10 | - We will generate data for the `palletjack` class of objects with annotations in KITTI format 11 | - This generated data can be used to train your own model (framework and architecture of your choice) 12 | 13 | 14 | ## Training with TAO Toolkit 15 | - The data generated in the previus step can be directly fed to TAO for training 16 | - The `local_train` notebook provides a walkthrough of the steps: 17 | - Setting up TAO docker container 18 | - Downloading pre-trained model, we will use the `DetectNet_v2` model with a `resnet_18` backbone 19 | - Running TAO training with `spec` files provided 20 | - Visualizing model performance on real world data 21 | - Visualize model metric with Tensorboard 22 | 23 | 24 | 25 | ## Next steps 26 | 27 | ### Generating Synthetic Data for your use case 28 | - Make changes in the Domain Randomization under the Synthetic Data Generation [script](../palletjack_sdg/standalone_palletjack_sdg.py) 29 | - Add additional objects of interest in the scene (similar to how palletjacks are added, you can add forklifts, ladders etc.) to generate dataUse different models for training with TAO (for object detection, you can use YOLO, SSD, EfficientDet) 30 | - Replicator provides Semantic Segmentation, Instance Segmentation, Depth and various other ground truth annotations along with RGB. You can also write your own ground truth annotator (eg: Pose Estimation: Refer to [sample](https://docs.omniverse.nvidia.com/isaacsim/latest/tutorial_replicator_offline_pose_estimation.html) These can be used for training a model of your own framework and choice) 31 | - Exploring the option of using Synthetic + Real data for training a network. Can be particularly useful for generating more data around particular corner cases 32 | 33 | ### Deploying Trained Models 34 | - The trained model can be pruned and optimized for inference with TAO 35 | - This can then be deployed on a robot with NVIDIA Jetson -------------------------------------------------------------------------------- /local/generate_data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This is the path where Isaac Sim is installed which contains the python.sh script 4 | ISAAC_SIM_PATH="" 5 | 6 | ## Go to location of the SDG script 7 | cd ../palletjack_sdg 8 | SCRIPT_PATH="${PWD}/standalone_palletjack_sdg.py" 9 | OUTPUT_WAREHOUSE="${PWD}/palletjack_data/distractors_warehouse" 10 | OUTPUT_ADDITIONAL="${PWD}/palletjack_data/distractors_additional" 11 | OUTPUT_NO_DISTRACTORS="${PWD}/palletjack_data/no_distractors" 12 | 13 | 14 | ## Go to Isaac Sim location for running with ./python.sh 15 | cd $ISAAC_SIM_PATH 16 | 17 | echo "Starting Data Generation" 18 | 19 | ./python.sh $SCRIPT_PATH --height 544 --width 960 --num_frames 2000 --distractors warehouse --data_dir $OUTPUT_WAREHOUSE 20 | 21 | ./python.sh $SCRIPT_PATH --height 544 --width 960 --num_frames 2000 --distractors additional --data_dir $OUTPUT_ADDITIONAL 22 | 23 | ./python.sh $SCRIPT_PATH --height 544 --width 960 --num_frames 1000 --distractors None --data_dir $OUTPUT_NO_DISTRACTORS 24 | 25 | 26 | -------------------------------------------------------------------------------- /local/training/tao/specs/inference/.ipynb_checkpoints/new_inference_specs-checkpoint.txt: -------------------------------------------------------------------------------- 1 | inferencer_config{ 2 | # defining target class names for the experiment. 3 | # Note: This must be mentioned in order of the networks classes. 4 | target_classes: "palletjack" 5 | 6 | # Inference dimensions. 7 | image_width: 960 8 | image_height: 544 9 | # Must match what the model was trained for. 10 | image_channels: 3 11 | batch_size: 32 12 | gpu_index: 0 13 | # model handler config 14 | tlt_config{ 15 | model: "/workspace/tao-experiments/local/training/tao/detectnet_v2/resnet18_palletjack/weights/model.tlt" 16 | } 17 | } 18 | bbox_handler_config{ 19 | kitti_dump: true 20 | disable_overlay: false 21 | overlay_linewidth: 2 22 | 23 | classwise_bbox_handler_config{ 24 | key:"palletjack" 25 | value: { 26 | confidence_model: "aggregate_cov" 27 | output_map: "palletjack" 28 | bbox_color{ 29 | R: 255 30 | G: 0 31 | B: 0 32 | } 33 | clustering_config{ 34 | coverage_threshold: 0.005 35 | clustering_algorithm: DBSCAN 36 | coverage_threshold: 0.005 37 | dbscan_eps: 0.3 38 | dbscan_min_samples: 0.05 39 | dbscan_confidence_threshold: 0.9 40 | minimum_bounding_box_height: 20 41 | } 42 | } 43 | } 44 | classwise_bbox_handler_config{ 45 | key:"default" 46 | value: { 47 | confidence_model: "aggregate_cov" 48 | bbox_color{ 49 | R: 255 50 | G: 0 51 | B: 0 52 | } 53 | clustering_config{ 54 | clustering_algorithm: DBSCAN 55 | dbscan_confidence_threshold: 0.9 56 | coverage_threshold: 0.005 57 | dbscan_eps: 0.3 58 | dbscan_min_samples: 0.05 59 | minimum_bounding_box_height: 20 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /local/training/tao/specs/inference/new_inference_specs.txt: -------------------------------------------------------------------------------- 1 | inferencer_config{ 2 | # defining target class names for the experiment. 3 | # Note: This must be mentioned in order of the networks classes. 4 | target_classes: "palletjack" 5 | 6 | # Inference dimensions. 7 | image_width: 960 8 | image_height: 544 9 | # Must match what the model was trained for. 10 | image_channels: 3 11 | batch_size: 32 12 | gpu_index: 0 13 | # model handler config 14 | tlt_config{ 15 | model: "/workspace/tao-experiments/local/training/tao/detectnet_v2/resnet18_palletjack/weights/model.tlt" 16 | } 17 | } 18 | bbox_handler_config{ 19 | kitti_dump: true 20 | disable_overlay: false 21 | overlay_linewidth: 2 22 | 23 | classwise_bbox_handler_config{ 24 | key:"palletjack" 25 | value: { 26 | confidence_model: "aggregate_cov" 27 | output_map: "palletjack" 28 | bbox_color{ 29 | R: 255 30 | G: 0 31 | B: 0 32 | } 33 | clustering_config{ 34 | coverage_threshold: 0.005 35 | clustering_algorithm: DBSCAN 36 | coverage_threshold: 0.005 37 | dbscan_eps: 0.3 38 | dbscan_min_samples: 0.05 39 | dbscan_confidence_threshold: 0.9 40 | minimum_bounding_box_height: 20 41 | } 42 | } 43 | } 44 | classwise_bbox_handler_config{ 45 | key:"default" 46 | value: { 47 | confidence_model: "aggregate_cov" 48 | bbox_color{ 49 | R: 255 50 | G: 0 51 | B: 0 52 | } 53 | clustering_config{ 54 | clustering_algorithm: DBSCAN 55 | dbscan_confidence_threshold: 0.9 56 | coverage_threshold: 0.005 57 | dbscan_eps: 0.3 58 | dbscan_min_samples: 0.05 59 | minimum_bounding_box_height: 20 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /local/training/tao/specs/tfrecords/.ipynb_checkpoints/distractors_additional-checkpoint.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 12 | -------------------------------------------------------------------------------- /local/training/tao/specs/tfrecords/.ipynb_checkpoints/distractors_warehouse-checkpoint.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 12 | -------------------------------------------------------------------------------- /local/training/tao/specs/tfrecords/.ipynb_checkpoints/no_distractors-checkpoint.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 12 | -------------------------------------------------------------------------------- /local/training/tao/specs/tfrecords/distractors_additional.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 12 | -------------------------------------------------------------------------------- /local/training/tao/specs/tfrecords/distractors_warehouse.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 12 | -------------------------------------------------------------------------------- /local/training/tao/specs/tfrecords/no_distractors.txt: -------------------------------------------------------------------------------- 1 | kitti_config { 2 | root_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 3 | image_dir_name: "rgb" 4 | label_dir_name: "object_detection" 5 | image_extension: ".png" 6 | partition_mode: "random" 7 | num_partitions: 2 8 | val_split: 10 9 | num_shards: 10 10 | } 11 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 12 | -------------------------------------------------------------------------------- /local/training/tao/specs/training/.ipynb_checkpoints/resnet18_distractors-checkpoint.txt: -------------------------------------------------------------------------------- 1 | random_seed: 42 2 | dataset_config { 3 | data_sources { 4 | tfrecords_path: "/workspace/tao-experiments/cloud/training/tao/tfrecords/distractors_warehouse/*" 5 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 6 | } 7 | 8 | data_sources { 9 | tfrecords_path: "/workspace/tao-experiments/cloud/training/tao/tfrecords/distractors_additional/*" 10 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 11 | } 12 | 13 | data_sources { 14 | tfrecords_path: "/workspace/tao-experiments/cloud/training/tao/tfrecords/no_distractors/*" 15 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 16 | } 17 | 18 | image_extension: "png" 19 | 20 | target_class_mapping { 21 | key: "palletjack" 22 | value: "palletjack" 23 | } 24 | 25 | validation_fold: 0 26 | 27 | } 28 | 29 | augmentation_config { 30 | preprocessing { 31 | output_image_width: 960 32 | output_image_height: 544 33 | min_bbox_width: 20.0 34 | min_bbox_height: 20.0 35 | output_image_channel: 3 36 | } 37 | spatial_augmentation { 38 | hflip_probability: 0.5 39 | zoom_min: 0.5 40 | zoom_max: 1.5 41 | translate_max_x: 8.0 42 | translate_max_y: 8.0 43 | } 44 | color_augmentation { 45 | hue_rotation_max: 25.0 46 | saturation_shift_max: 0.20000000298 47 | contrast_scale_max: 0.10000000149 48 | contrast_center: 0.5 49 | } 50 | } 51 | 52 | postprocessing_config { 53 | target_class_config { 54 | key: "palletjack" 55 | value { 56 | clustering_config { 57 | clustering_algorithm: DBSCAN 58 | dbscan_confidence_threshold: 0.9 59 | coverage_threshold: 0.00499999988824 60 | dbscan_eps: 0.15000000596 61 | dbscan_min_samples: 0.0500000007451 62 | minimum_bounding_box_height: 20 63 | } 64 | } 65 | } 66 | } 67 | 68 | model_config { 69 | pretrained_model_file: "/workspace/tao-experiments/cloud/training/tao/pretrained_model/resnet18.hdf5" 70 | num_layers: 18 71 | use_batch_norm: true 72 | objective_set { 73 | bbox { 74 | scale: 35.0 75 | offset: 0.5 76 | } 77 | cov { 78 | } 79 | } 80 | arch: "resnet" 81 | } 82 | 83 | evaluation_config { 84 | validation_period_during_training: 10 85 | first_validation_epoch: 5 86 | minimum_detection_ground_truth_overlap { 87 | key: "palletjack" 88 | value: 0.5 89 | } 90 | evaluation_box_config { 91 | key: "palletjack" 92 | value { 93 | minimum_height: 25 94 | maximum_height: 9999 95 | minimum_width: 25 96 | maximum_width: 9999 97 | } 98 | } 99 | average_precision_mode: INTEGRATE 100 | } 101 | 102 | cost_function_config { 103 | target_classes { 104 | name: "palletjack" 105 | class_weight: 1.0 106 | coverage_foreground_weight: 0.0500000007451 107 | objectives { 108 | name: "cov" 109 | initial_weight: 1.0 110 | weight_target: 1.0 111 | } 112 | objectives { 113 | name: "bbox" 114 | initial_weight: 10.0 115 | weight_target: 1.0 116 | } 117 | } 118 | enable_autoweighting: true 119 | max_objective_weight: 0.999899983406 120 | min_objective_weight: 9.99999974738e-05 121 | } 122 | 123 | training_config { 124 | batch_size_per_gpu: 32 125 | num_epochs: 100 126 | learning_rate { 127 | soft_start_annealing_schedule { 128 | min_learning_rate: 5e-06 129 | max_learning_rate: 5e-04 130 | soft_start: 0.10000000149 131 | annealing: 0.699999988079 132 | } 133 | } 134 | regularizer { 135 | type: L1 136 | weight: 3.00000002618e-09 137 | } 138 | optimizer { 139 | adam { 140 | epsilon: 9.99999993923e-09 141 | beta1: 0.899999976158 142 | beta2: 0.999000012875 143 | } 144 | } 145 | cost_scaling { 146 | initial_exponent: 20.0 147 | increment: 0.005 148 | decrement: 1.0 149 | } 150 | visualizer{ 151 | enabled: true 152 | num_images: 10 153 | scalar_logging_frequency: 10 154 | infrequent_logging_frequency: 5 155 | target_class_config { 156 | key: "palletjack" 157 | value: { 158 | coverage_threshold: 0.005 159 | } 160 | } 161 | } 162 | checkpoint_interval: 10 163 | } 164 | 165 | bbox_rasterizer_config { 166 | target_class_config { 167 | key: "palletjack" 168 | value { 169 | cov_center_x: 0.5 170 | cov_center_y: 0.5 171 | cov_radius_x: 1.0 172 | cov_radius_y: 1.0 173 | bbox_min_radius: 1.0 174 | } 175 | } 176 | deadzone_radius: 0.400000154972 177 | } 178 | -------------------------------------------------------------------------------- /local/training/tao/specs/training/resnet18_distractors.txt: -------------------------------------------------------------------------------- 1 | random_seed: 42 2 | dataset_config { 3 | data_sources { 4 | tfrecords_path: "/workspace/tao-experiments/local/training/tao/tfrecords/distractors_warehouse/*" 5 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_warehouse/Camera" 6 | } 7 | 8 | data_sources { 9 | tfrecords_path: "/workspace/tao-experiments/local/training/tao/tfrecords/distractors_additional/*" 10 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/distractors_additional/Camera" 11 | } 12 | 13 | data_sources { 14 | tfrecords_path: "/workspace/tao-experiments/local/training/tao/tfrecords/no_distractors/*" 15 | image_directory_path: "/workspace/tao-experiments/palletjack_sdg/palletjack_data/no_distractors/Camera" 16 | } 17 | 18 | image_extension: "png" 19 | 20 | target_class_mapping { 21 | key: "palletjack" 22 | value: "palletjack" 23 | } 24 | 25 | validation_fold: 0 26 | 27 | } 28 | 29 | augmentation_config { 30 | preprocessing { 31 | output_image_width: 960 32 | output_image_height: 544 33 | min_bbox_width: 20.0 34 | min_bbox_height: 20.0 35 | output_image_channel: 3 36 | } 37 | spatial_augmentation { 38 | hflip_probability: 0.5 39 | zoom_min: 0.5 40 | zoom_max: 1.5 41 | translate_max_x: 8.0 42 | translate_max_y: 8.0 43 | } 44 | color_augmentation { 45 | hue_rotation_max: 25.0 46 | saturation_shift_max: 0.20000000298 47 | contrast_scale_max: 0.10000000149 48 | contrast_center: 0.5 49 | } 50 | } 51 | 52 | postprocessing_config { 53 | target_class_config { 54 | key: "palletjack" 55 | value { 56 | clustering_config { 57 | clustering_algorithm: DBSCAN 58 | dbscan_confidence_threshold: 0.9 59 | coverage_threshold: 0.00499999988824 60 | dbscan_eps: 0.15000000596 61 | dbscan_min_samples: 0.0500000007451 62 | minimum_bounding_box_height: 20 63 | } 64 | } 65 | } 66 | } 67 | 68 | model_config { 69 | pretrained_model_file: "/workspace/tao-experiments/local/training/tao/pretrained_model/resnet18.hdf5" 70 | num_layers: 18 71 | use_batch_norm: true 72 | objective_set { 73 | bbox { 74 | scale: 35.0 75 | offset: 0.5 76 | } 77 | cov { 78 | } 79 | } 80 | arch: "resnet" 81 | } 82 | 83 | evaluation_config { 84 | validation_period_during_training: 10 85 | first_validation_epoch: 5 86 | minimum_detection_ground_truth_overlap { 87 | key: "palletjack" 88 | value: 0.5 89 | } 90 | evaluation_box_config { 91 | key: "palletjack" 92 | value { 93 | minimum_height: 25 94 | maximum_height: 9999 95 | minimum_width: 25 96 | maximum_width: 9999 97 | } 98 | } 99 | average_precision_mode: INTEGRATE 100 | } 101 | 102 | cost_function_config { 103 | target_classes { 104 | name: "palletjack" 105 | class_weight: 1.0 106 | coverage_foreground_weight: 0.0500000007451 107 | objectives { 108 | name: "cov" 109 | initial_weight: 1.0 110 | weight_target: 1.0 111 | } 112 | objectives { 113 | name: "bbox" 114 | initial_weight: 10.0 115 | weight_target: 1.0 116 | } 117 | } 118 | enable_autoweighting: true 119 | max_objective_weight: 0.999899983406 120 | min_objective_weight: 9.99999974738e-05 121 | } 122 | 123 | training_config { 124 | batch_size_per_gpu: 32 125 | num_epochs: 100 126 | learning_rate { 127 | soft_start_annealing_schedule { 128 | min_learning_rate: 5e-06 129 | max_learning_rate: 5e-04 130 | soft_start: 0.10000000149 131 | annealing: 0.699999988079 132 | } 133 | } 134 | regularizer { 135 | type: L1 136 | weight: 3.00000002618e-09 137 | } 138 | optimizer { 139 | adam { 140 | epsilon: 9.99999993923e-09 141 | beta1: 0.899999976158 142 | beta2: 0.999000012875 143 | } 144 | } 145 | cost_scaling { 146 | initial_exponent: 20.0 147 | increment: 0.005 148 | decrement: 1.0 149 | } 150 | visualizer{ 151 | enabled: true 152 | num_images: 10 153 | scalar_logging_frequency: 10 154 | infrequent_logging_frequency: 5 155 | target_class_config { 156 | key: "palletjack" 157 | value: { 158 | coverage_threshold: 0.005 159 | } 160 | } 161 | } 162 | checkpoint_interval: 10 163 | } 164 | 165 | bbox_rasterizer_config { 166 | target_class_config { 167 | key: "palletjack" 168 | value { 169 | cov_center_x: 0.5 170 | cov_center_y: 0.5 171 | cov_radius_x: 1.0 172 | cov_radius_y: 1.0 173 | bbox_min_radius: 1.0 174 | } 175 | } 176 | deadzone_radius: 0.400000154972 177 | } 178 | -------------------------------------------------------------------------------- /palletjack_sdg/palletjack_datagen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This is the path where Isaac Sim is installed which contains the python.sh script 4 | ISAAC_SIM_PATH='/isaac-sim' 5 | 6 | echo "Starting Data Generation" 7 | 8 | cd $ISAAC_SIM_PATH 9 | 10 | echo $PWD 11 | 12 | ./python.sh /isaac-sim/palletjack_sdg/standalone_palletjack_sdg.py --headless True --height 544 --width 960 --num_frames 2000 --distractors warehouse --data_dir /isaac-sim/palletjack_sdg/palletjack_data/distractors_warehouse 13 | 14 | ./python.sh /isaac-sim/palletjack_sdg/standalone_palletjack_sdg.py --headless True --height 544 --width 960 --num_frames 2000 --distractors additional --data_dir /isaac-sim/palletjack_sdg/palletjack_data/distractors_additional 15 | 16 | ./python.sh /isaac-sim/palletjack_sdg/standalone_palletjack_sdg.py --headless True --height 544 --width 960 --num_frames 1000 --distractors None --data_dir /isaac-sim/palletjack_sdg/palletjack_data/no_distractors 17 | 18 | -------------------------------------------------------------------------------- /palletjack_sdg/standalone_palletjack_sdg.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. 2 | # 3 | # SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 4 | # SPDX-License-Identifier: MIT 5 | 6 | # Permission is hereby granted, free of charge, to any person obtaining a 7 | # copy of this software and associated documentation files (the "Software"), 8 | # to deal in the Software without restriction, including without limitation 9 | # the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 | # and/or sell copies of the Software, and to permit persons to whom the 11 | # Software is furnished to do so, subject to the following conditions: 12 | 13 | # The above copyright notice and this permission notice shall be included in 14 | # all copies or substantial portions of the Software. 15 | 16 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 | # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 | # DEALINGS IN THE SOFTWARE. 23 | 24 | from omni.isaac.kit import SimulationApp 25 | import os 26 | import argparse 27 | 28 | parser = argparse.ArgumentParser("Dataset generator") 29 | parser.add_argument("--headless", type=bool, default=False, help="Launch script headless, default is False") 30 | parser.add_argument("--height", type=int, default=544, help="Height of image") 31 | parser.add_argument("--width", type=int, default=960, help="Width of image") 32 | parser.add_argument("--num_frames", type=int, default=1000, help="Number of frames to record") 33 | parser.add_argument("--distractors", type=str, default="warehouse", 34 | help="Options are 'warehouse' (default), 'additional' or None") 35 | parser.add_argument("--data_dir", type=str, default=os.getcwd() + "/_palletjack_data", 36 | help="Location where data will be output") 37 | 38 | args, unknown_args = parser.parse_known_args() 39 | 40 | # This is the config used to launch simulation. 41 | CONFIG = {"renderer": "RayTracedLighting", "headless": args.headless, 42 | "width": args.width, "height": args.height, "num_frames": args.num_frames} 43 | 44 | simulation_app = SimulationApp(launch_config=CONFIG) 45 | 46 | 47 | ## This is the path which has the background scene in which objects will be added. 48 | ENV_URL = "/Isaac/Environments/Simple_Warehouse/warehouse.usd" 49 | 50 | import carb 51 | import omni 52 | import omni.usd 53 | from omni.isaac.core.utils.nucleus import get_assets_root_path 54 | from omni.isaac.core.utils.stage import get_current_stage, open_stage 55 | from pxr import Semantics 56 | import omni.replicator.core as rep 57 | 58 | from omni.isaac.core.utils.semantics import get_semantics 59 | 60 | # Increase subframes if shadows/ghosting appears of moving objects 61 | # See known issues: https://docs.omniverse.nvidia.com/prod_extensions/prod_extensions/ext_replicator.html#known-issues 62 | rep.settings.carb_settings("/omni/replicator/RTSubframes", 4) 63 | 64 | 65 | # This is the location of the palletjacks in the simready asset library 66 | PALLETJACKS = ["http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/DigitalTwin/Assets/Warehouse/Equipment/Pallet_Trucks/Scale_A/PalletTruckScale_A01_PR_NVD_01.usd", 67 | "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/DigitalTwin/Assets/Warehouse/Equipment/Pallet_Trucks/Heavy_Duty_A/HeavyDutyPalletTruck_A01_PR_NVD_01.usd", 68 | "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/DigitalTwin/Assets/Warehouse/Equipment/Pallet_Trucks/Low_Profile_A/LowProfilePalletTruck_A01_PR_NVD_01.usd"] 69 | 70 | 71 | # The warehouse distractors which will be added to the scene and randomized 72 | DISTRACTORS_WAREHOUSE = 2 * ["/Isaac/Environments/Simple_Warehouse/Props/S_TrafficCone.usd", 73 | "/Isaac/Environments/Simple_Warehouse/Props/S_WetFloorSign.usd", 74 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BarelPlastic_A_01.usd", 75 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BarelPlastic_A_02.usd", 76 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BarelPlastic_A_03.usd", 77 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BarelPlastic_B_01.usd", 78 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BarelPlastic_B_01.usd", 79 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BarelPlastic_B_03.usd", 80 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BarelPlastic_C_02.usd", 81 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BottlePlasticA_02.usd", 82 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BottlePlasticB_01.usd", 83 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BottlePlasticA_02.usd", 84 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BottlePlasticA_02.usd", 85 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BottlePlasticD_01.usd", 86 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BottlePlasticE_01.usd", 87 | "/Isaac/Environments/Simple_Warehouse/Props/SM_BucketPlastic_B.usd", 88 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CardBoxB_01_1262.usd", 89 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CardBoxB_01_1268.usd", 90 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CardBoxB_01_1482.usd", 91 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CardBoxB_01_1683.usd", 92 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CardBoxB_01_291.usd", 93 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CardBoxD_01_1454.usd", 94 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CardBoxD_01_1513.usd", 95 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CratePlastic_A_04.usd", 96 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CratePlastic_B_03.usd", 97 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CratePlastic_B_05.usd", 98 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CratePlastic_C_02.usd", 99 | "/Isaac/Environments/Simple_Warehouse/Props/SM_CratePlastic_E_02.usd", 100 | "/Isaac/Environments/Simple_Warehouse/Props/SM_PushcartA_02.usd", 101 | "/Isaac/Environments/Simple_Warehouse/Props/SM_RackPile_04.usd", 102 | "/Isaac/Environments/Simple_Warehouse/Props/SM_RackPile_03.usd"] 103 | 104 | 105 | ## Additional distractors which can be added to the scene 106 | DISTRACTORS_ADDITIONAL = ["/Isaac/Environments/Hospital/Props/Pharmacy_Low.usd", 107 | "/Isaac/Environments/Hospital/Props/SM_BedSideTable_01b.usd", 108 | "/Isaac/Environments/Hospital/Props/SM_BooksSet_26.usd", 109 | "/Isaac/Environments/Hospital/Props/SM_BottleB.usd", 110 | "/Isaac/Environments/Hospital/Props/SM_BottleA.usd", 111 | "/Isaac/Environments/Hospital/Props/SM_BottleC.usd", 112 | "/Isaac/Environments/Hospital/Props/SM_Cart_01a.usd", 113 | "/Isaac/Environments/Hospital/Props/SM_Chair_02a.usd", 114 | "/Isaac/Environments/Hospital/Props/SM_Chair_01a.usd", 115 | "/Isaac/Environments/Hospital/Props/SM_Computer_02b.usd", 116 | "/Isaac/Environments/Hospital/Props/SM_Desk_04a.usd", 117 | "/Isaac/Environments/Hospital/Props/SM_DisposalStand_02.usd", 118 | "/Isaac/Environments/Hospital/Props/SM_FirstAidKit_01a.usd", 119 | "/Isaac/Environments/Hospital/Props/SM_GasCart_01c.usd", 120 | "/Isaac/Environments/Hospital/Props/SM_Gurney_01b.usd", 121 | "/Isaac/Environments/Hospital/Props/SM_HospitalBed_01b.usd", 122 | "/Isaac/Environments/Hospital/Props/SM_MedicalBag_01a.usd", 123 | "/Isaac/Environments/Hospital/Props/SM_Mirror.usd", 124 | "/Isaac/Environments/Hospital/Props/SM_MopSet_01b.usd", 125 | "/Isaac/Environments/Hospital/Props/SM_SideTable_02a.usd", 126 | "/Isaac/Environments/Hospital/Props/SM_SupplyCabinet_01c.usd", 127 | "/Isaac/Environments/Hospital/Props/SM_SupplyCart_01e.usd", 128 | "/Isaac/Environments/Hospital/Props/SM_TrashCan.usd", 129 | "/Isaac/Environments/Hospital/Props/SM_Washbasin.usd", 130 | "/Isaac/Environments/Hospital/Props/SM_WheelChair_01a.usd", 131 | "/Isaac/Environments/Office/Props/SM_WaterCooler.usd", 132 | "/Isaac/Environments/Office/Props/SM_TV.usd", 133 | "/Isaac/Environments/Office/Props/SM_TableC.usd", 134 | "/Isaac/Environments/Office/Props/SM_Recliner.usd", 135 | "/Isaac/Environments/Office/Props/SM_Personenleitsystem_Red1m.usd", 136 | "/Isaac/Environments/Office/Props/SM_Lamp02_162.usd", 137 | "/Isaac/Environments/Office/Props/SM_Lamp02.usd", 138 | "/Isaac/Environments/Office/Props/SM_HandDryer.usd", 139 | "/Isaac/Environments/Office/Props/SM_Extinguisher.usd"] 140 | 141 | 142 | # The textures which will be randomized for the wall and floor 143 | TEXTURES = ["/Isaac/Materials/Textures/Patterns/nv_asphalt_yellow_weathered.jpg", 144 | "/Isaac/Materials/Textures/Patterns/nv_tile_hexagonal_green_white.jpg", 145 | "/Isaac/Materials/Textures/Patterns/nv_rubber_woven_charcoal.jpg", 146 | "/Isaac/Materials/Textures/Patterns/nv_granite_tile.jpg", 147 | "/Isaac/Materials/Textures/Patterns/nv_tile_square_green.jpg", 148 | "/Isaac/Materials/Textures/Patterns/nv_marble.jpg", 149 | "/Isaac/Materials/Textures/Patterns/nv_brick_reclaimed.jpg", 150 | "/Isaac/Materials/Textures/Patterns/nv_concrete_aged_with_lines.jpg", 151 | "/Isaac/Materials/Textures/Patterns/nv_wooden_wall.jpg", 152 | "/Isaac/Materials/Textures/Patterns/nv_stone_painted_grey.jpg", 153 | "/Isaac/Materials/Textures/Patterns/nv_wood_shingles_brown.jpg", 154 | "/Isaac/Materials/Textures/Patterns/nv_tile_hexagonal_various.jpg", 155 | "/Isaac/Materials/Textures/Patterns/nv_carpet_abstract_pattern.jpg", 156 | "/Isaac/Materials/Textures/Patterns/nv_wood_siding_weathered_green.jpg", 157 | "/Isaac/Materials/Textures/Patterns/nv_animalfur_pattern_greys.jpg", 158 | "/Isaac/Materials/Textures/Patterns/nv_artificialgrass_green.jpg", 159 | "/Isaac/Materials/Textures/Patterns/nv_bamboo_desktop.jpg", 160 | "/Isaac/Materials/Textures/Patterns/nv_brick_reclaimed.jpg", 161 | "/Isaac/Materials/Textures/Patterns/nv_brick_red_stacked.jpg", 162 | "/Isaac/Materials/Textures/Patterns/nv_fireplace_wall.jpg", 163 | "/Isaac/Materials/Textures/Patterns/nv_fabric_square_grid.jpg", 164 | "/Isaac/Materials/Textures/Patterns/nv_granite_tile.jpg", 165 | "/Isaac/Materials/Textures/Patterns/nv_marble.jpg", 166 | "/Isaac/Materials/Textures/Patterns/nv_gravel_grey_leaves.jpg", 167 | "/Isaac/Materials/Textures/Patterns/nv_plastic_blue.jpg", 168 | "/Isaac/Materials/Textures/Patterns/nv_stone_red_hatch.jpg", 169 | "/Isaac/Materials/Textures/Patterns/nv_stucco_red_painted.jpg", 170 | "/Isaac/Materials/Textures/Patterns/nv_rubber_woven_charcoal.jpg", 171 | "/Isaac/Materials/Textures/Patterns/nv_stucco_smooth_blue.jpg", 172 | "/Isaac/Materials/Textures/Patterns/nv_wood_shingles_brown.jpg", 173 | "/Isaac/Materials/Textures/Patterns/nv_wooden_wall.jpg"] 174 | 175 | 176 | def update_semantics(stage, keep_semantics=[]): 177 | """ Remove semantics from the stage except for keep_semantic classes""" 178 | for prim in stage.Traverse(): 179 | if prim.HasAPI(Semantics.SemanticsAPI): 180 | processed_instances = set() 181 | for property in prim.GetProperties(): 182 | is_semantic = Semantics.SemanticsAPI.IsSemanticsAPIPath(property.GetPath()) 183 | if is_semantic: 184 | instance_name = property.SplitName()[1] 185 | if instance_name in processed_instances: 186 | # Skip repeated instance, instances are iterated twice due to their two semantic properties (class, data) 187 | continue 188 | 189 | processed_instances.add(instance_name) 190 | sem = Semantics.SemanticsAPI.Get(prim, instance_name) 191 | type_attr = sem.GetSemanticTypeAttr() 192 | data_attr = sem.GetSemanticDataAttr() 193 | 194 | 195 | for semantic_class in keep_semantics: 196 | # Check for our data classes needed for the model 197 | if data_attr.Get() == semantic_class: 198 | continue 199 | else: 200 | # remove semantics of all other prims 201 | prim.RemoveProperty(type_attr.GetName()) 202 | prim.RemoveProperty(data_attr.GetName()) 203 | prim.RemoveAPI(Semantics.SemanticsAPI, instance_name) 204 | 205 | 206 | # needed for loading textures correctly 207 | def prefix_with_isaac_asset_server(relative_path): 208 | assets_root_path = get_assets_root_path() 209 | if assets_root_path is None: 210 | raise Exception("Nucleus server not found, could not access Isaac Sim assets folder") 211 | return assets_root_path + relative_path 212 | 213 | 214 | def full_distractors_list(distractor_type="warehouse"): 215 | """Distractor type allowed are warehouse, additional or None. They load corresponding objects and add 216 | them to the scene for DR""" 217 | full_dist_list = [] 218 | 219 | if distractor_type == "warehouse": 220 | for distractor in DISTRACTORS_WAREHOUSE: 221 | full_dist_list.append(prefix_with_isaac_asset_server(distractor)) 222 | elif distractor_type == "additional": 223 | for distractor in DISTRACTORS_ADDITIONAL: 224 | full_dist_list.append(prefix_with_isaac_asset_server(distractor)) 225 | else: 226 | print("No Distractors being added to the current scene for SDG") 227 | 228 | return full_dist_list 229 | 230 | 231 | def full_textures_list(): 232 | full_tex_list = [] 233 | for texture in TEXTURES: 234 | full_tex_list.append(prefix_with_isaac_asset_server(texture)) 235 | 236 | return full_tex_list 237 | 238 | 239 | def add_palletjacks(): 240 | rep_obj_list = [rep.create.from_usd(palletjack_path, semantics=[("class", "palletjack")], count=2) for palletjack_path in PALLETJACKS] 241 | rep_palletjack_group = rep.create.group(rep_obj_list) 242 | return rep_palletjack_group 243 | 244 | 245 | def add_distractors(distractor_type="warehouse"): 246 | full_distractors = full_distractors_list(distractor_type) 247 | distractors = [rep.create.from_usd(distractor_path, count=1) for distractor_path in full_distractors] 248 | distractor_group = rep.create.group(distractors) 249 | return distractor_group 250 | 251 | 252 | # This will handle replicator 253 | def run_orchestrator(): 254 | 255 | rep.orchestrator.run() 256 | 257 | # Wait until started 258 | while not rep.orchestrator.get_is_started(): 259 | simulation_app.update() 260 | 261 | # Wait until stopped 262 | while rep.orchestrator.get_is_started(): 263 | simulation_app.update() 264 | 265 | rep.BackendDispatch.wait_until_done() 266 | rep.orchestrator.stop() 267 | 268 | 269 | def main(): 270 | # Open the environment in a new stage 271 | print(f"Loading Stage {ENV_URL}") 272 | open_stage(prefix_with_isaac_asset_server(ENV_URL)) 273 | stage = get_current_stage() 274 | 275 | # Run some app updates to make sure things are properly loaded 276 | for i in range(100): 277 | if i % 10 == 0: 278 | print(f"App uppdate {i}..") 279 | simulation_app.update() 280 | 281 | 282 | textures = full_textures_list() 283 | rep_palletjack_group = add_palletjacks() 284 | rep_distractor_group = add_distractors(distractor_type=args.distractors) 285 | 286 | # We only need labels for the palletjack objects 287 | update_semantics(stage=stage, keep_semantics=["palletjack"]) 288 | 289 | # Create camera with Replicator API for gathering data 290 | cam = rep.create.camera(clipping_range=(0.1, 1000000)) 291 | 292 | # trigger replicator pipeline 293 | with rep.trigger.on_frame(num_frames=CONFIG["num_frames"]): 294 | 295 | # Move the camera around in the scene, focus on the center of warehouse 296 | with cam: 297 | rep.modify.pose(position=rep.distribution.uniform((-9.2, -11.8, 0.4), (7.2, 15.8, 4)), 298 | look_at=(0, 0, 0)) 299 | 300 | # Get the Palletjack body mesh and modify its color 301 | with rep.get.prims(path_pattern="SteerAxles"): 302 | rep.randomizer.color(colors=rep.distribution.uniform((0, 0, 0), (1, 1, 1))) 303 | 304 | # Randomize the pose of all the added palletjacks 305 | with rep_palletjack_group: 306 | rep.modify.pose(position=rep.distribution.uniform((-6, -6, 0), (6, 12, 0)), 307 | rotation=rep.distribution.uniform((0, 0, 0), (0, 0, 360)), 308 | scale=rep.distribution.uniform((0.01, 0.01, 0.01), (0.01, 0.01, 0.01))) 309 | 310 | # Modify the pose of all the distractors in the scene 311 | with rep_distractor_group: 312 | rep.modify.pose(position=rep.distribution.uniform((-6, -6, 0), (6, 12, 0)), 313 | rotation=rep.distribution.uniform((0, 0, 0), (0, 0, 360)), 314 | scale=rep.distribution.uniform(1, 1.5)) 315 | 316 | # Randomize the lighting of the scene 317 | with rep.get.prims(path_pattern="RectLight"): 318 | rep.modify.attribute("color", rep.distribution.uniform((0, 0, 0), (1, 1, 1))) 319 | rep.modify.attribute("intensity", rep.distribution.normal(100000.0, 600000.0)) 320 | rep.modify.visibility(rep.distribution.choice([True, False, False, False, False, False, False])) 321 | 322 | # select floor material 323 | random_mat_floor = rep.create.material_omnipbr(diffuse_texture=rep.distribution.choice(textures), 324 | roughness=rep.distribution.uniform(0, 1), 325 | metallic=rep.distribution.choice([0, 1]), 326 | emissive_texture=rep.distribution.choice(textures), 327 | emissive_intensity=rep.distribution.uniform(0, 1000),) 328 | 329 | 330 | with rep.get.prims(path_pattern="SM_Floor"): 331 | rep.randomizer.materials(random_mat_floor) 332 | 333 | # select random wall material 334 | random_mat_wall = rep.create.material_omnipbr(diffuse_texture=rep.distribution.choice(textures), 335 | roughness=rep.distribution.uniform(0, 1), 336 | metallic=rep.distribution.choice([0, 1]), 337 | emissive_texture=rep.distribution.choice(textures), 338 | emissive_intensity=rep.distribution.uniform(0, 1000),) 339 | 340 | 341 | with rep.get.prims(path_pattern="SM_Wall"): 342 | rep.randomizer.materials(random_mat_wall) 343 | 344 | 345 | # Set up the writer 346 | writer = rep.WriterRegistry.get("KittiWriter") 347 | 348 | # output directory of writer 349 | output_directory = args.data_dir 350 | print("Outputting data to ", output_directory) 351 | 352 | # use writer for bounding boxes, rgb and segmentation 353 | writer.initialize(output_dir=output_directory, 354 | omit_semantic_type=True,) 355 | 356 | 357 | # attach camera render products to wrieter so that data is outputted 358 | RESOLUTION = (CONFIG["width"], CONFIG["height"]) 359 | render_product = rep.create.render_product(cam, RESOLUTION) 360 | writer.attach(render_product) 361 | 362 | # run rep pipeline 363 | run_orchestrator() 364 | simulation_app.update() 365 | 366 | 367 | 368 | if __name__ == "__main__": 369 | try: 370 | main() 371 | except Exception as e: 372 | carb.log_error(f"Exception: {e}") 373 | import traceback 374 | 375 | traceback.print_exc() 376 | finally: 377 | simulation_app.close() 378 | --------------------------------------------------------------------------------