Operation room, sketch Eivind Holt
Swabs with metallic strip, photo Eivind Holt
Optical illusion, photo acmedoge
Matte vs. reflective surfaces, photo Eivind Holt
Matte objects capture, photo Eivind Holt
Matte objects performance, photo Eivind Holt
NVIDIA Omniverse Code
NVIDIA Omniverse Launcher
NVIDIA Omniverse Replicator
Create stage, photo Eivind Holt
FPS Limit
Exporting model in Blender, photo Eivind Holt
Exporting model in Blender, photo Eivind Holt
Importing 3D model in Omniverse, photo Eivind Holt
Bounding box, photo Eivind Holt
Chrome material, photo Eivind Holt
Cloth material, photo Eivind Holt
Synthetic image generation
Semantics Schema Editor, photo Eivind Holt
Semantics Schema Editor suggestion, photo Eivind Holt
num_frames
defines how many renders we want. rt_subframes
lets the render pipeline proceed a number of frames before capturing the result and passing it on to be written to disk. Setting this high will let advanced ray tracing effects such as reflections have time to propagate between surfaces, though at the cost of higher render time. Each randomization sub-routine will be called, with optional parameters.
To write each image and semantic information to disk we use a provided API. We could customize the writer but as of Replicator 1.9.8 on Windows this resulted in errors. We will use “BasicWriter” and rather make a separate script to produce a label format compatible with EI.
rgb
tells the API that we want the images to be written to disk as png-files, bounding_box_2d_tight
that we want files with labels (from previously defined semantics) and bounding boxes as rectangles. The script ends with running a single iteration of the process in Omniverse Code, so we can visualize the results.
The bounding boxes can be visualized by clicking the sensor widget, checking “BoundingBox2DTight” and finally “Show Window”.
Bounding Boxes, photo Eivind Holt
Bounding Boxes, photo Eivind Holt
scatter_items
we get a reference to the area that will contain our items. Each item is then iterated so that we can add a random rotation (0-360 degrees on the surface plane) and use scatter_2d
to randomize placement. For the latter, surface_prims
takes an array of items to use as possible surfaces, check_for_collisions
tries to avoid overlap. The order of operations is important to avoid overlapping items.
For the camera we simply randomize the position in all 3 axis and make sure it points to the center of the stage.
With the lights we randomize the brightness between a set range of values.
Note that in the provided example rendering images and labels is separated between the actual objects we want to be able to detect and background items for contrast. The process would run once for the surgery items, then the following line would be changed from
launch.json
like this:
bounding_boxes.labels
that contains all labels and bounding boxes per image.
bounding_boxes.labels
file.
This way we can effortlessly produce thousands of labeled images and witness how performance on detecting reflective objects increases. Keep in mind to try to balance the number of labels for each class.
Data acquisition, photo Eivind Holt
Data acquisition
Model performance, photo Eivind Holt
CAD components, render Eivind Holt
CAD housing, render Eivind Holt
Device housing, photo Eivind Holt
Device housing, photo Eivind Holt
Device housing, photo Eivind Holt
Open DIPS
Chrome objects detection, photo Eivind Holt
Text-to-3D
NVIDIA Omniverse Code debug python
VS Code Link
Open in VSCode
.vscode\launch.json
the two settings corresponds to what you see in the “VS Code Link” window, e.g. “host”: “localhost”, and “port”: 3000.VSCode launch settings
VSCode Run and Debug Attach
NVIDIA Omniverse Code Debugger Attached
exts\eivholt\extension.py
, e.g. inside the function “run_replicator”.VSCode Breakpoint 1
Omniverse Code Extension
VSCode Breakpoint 2
Edge detection, render Eivind Holt