You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 964af1d
Browse filesBrowse the repository at this point in the historyBrowse files
Add drawings, view protocols, provenance/Croissant and randomization (1.11.0)
Engineering drawings
- Front/Top/Right SVGs and a three-view sheet (third or first angle),
1:1 in the product's source millimetres
- Feature edges (creases, silhouettes, boundaries) tested against a
depth render along their length; hidden stretches drawn dashed
- Overall dimensions per view; drafting-correct view orientation
View protocols
- MVCNN-12, SyncDreamer-16, Zero123++ v1.2, MVDream-4, Zero-1-to-3
(seeded), TRELLIS-150 and a 15-degree catalogue rig, with their
fields of view and fixed camera distances
Provenance
- manifest.json provenance block: versions, render settings, times
and a snapshot of every setting; source_sha256 per row
- Optional croissant.json (MLCommons Croissant 1.0), validated with
mlcroissant; written by --merge for sharded runs
- CITATION.cff
Randomization
- Seeded per product and view: camera jitter, light rig turn and
strength, random HDRIs, materials, and distractors placed behind
the product in Full renders only
- Every pass of a view and its cameras.json/BOP pose share the
jittered camera; everything is restored afterwards
Tests
- test_drawings.py and test_protocols_random.py
@@ -294,6 +295,28 @@ Need an angle that isn't in the presets? Add a **Custom View** with an X/Y/Z dir
294
295
vector and an ortho/perspective toggle, and it gets built alongside the rest. The checkbox at
295
296
the start of its row switches it off without deleting it.
296
297
298
+
#### Published protocols
299
+
300
+
**Protocol** replaces the View Set with the camera rig of a published dataset or method, so
301
+
a render set can match what a benchmark or model expects:
302
+
303
+
| Protocol | Views | Field of view | Distance | Source |
304
+
| --- | --- | --- | --- | --- |
305
+
|**MVCNN, 12 views**| 12 around the product, 30 degrees apart, 30 degrees up | MultiView's | Shared framing | Su et al., ICCV 2015 |
306
+
|**SyncDreamer, 16 views**| 16 around, 22.5 degrees apart, 30 degrees up | MultiView's | Shared framing | Liu et al., ICLR 2024 |
307
+
|**Zero123++ v1.2, 6 views**| Azimuths 30, 90, ..., 330; elevations alternating 20 and -10 | 30 degrees | Shared framing | Shi et al., v1.2 README |
308
+
|**MVDream, 4 views**| Front, right, back, left at 15 degrees up | 37.5 degrees | Shared framing | Shi et al., ICLR 2024 (middle of its random ranges) |
309
+
|**Zero-1-to-3, 12 random views**| Uniform on the sphere, seeded | 49.1 degrees | 1.5-2.2 object sizes, seeded | Liu et al., ICCV 2023 |
310
+
|**TRELLIS, 150 views**| Hammersley sequence on the sphere, seeded offset | 40 degrees | 2 object sizes | Xiang et al., CVPR 2025 |
311
+
|**Catalogue, 15 degree plunge**| Front at 0 and 15 degrees; front-right, right, back, left, front-left at 15 | MultiView's | Shared framing | After the GS1 Product Image Specification's preferred plunge (names are MultiView's, not GS1 codes) |
312
+
313
+
Azimuth 0 is the Front view, so protocols follow **Front Axis** like the built-in views.
314
+
Distances given in object sizes assume the product is normalized into a unit cube, as these
315
+
works do, and are multiplied by **Target Size**: with **Fit Each** and a Target Size of
316
+
`1.0` they are the published numbers. Random protocols take a **Seed**, so the same rig can be
317
+
built again exactly. MVDream samples its elevation and field of view at random; the preset
318
+
fixes them at the middle of its ranges, and the paper should say so if it matters.
319
+
297
320
#### Orient Products
298
321
299
322
**Front Axis** fixes the whole batch at once, which only helps when every product was
@@ -603,6 +626,28 @@ Rendering part of a batch updates the rows for those products and keeps the rest
603
626
manifest always describes everything in the output directory. Rows for files that have
604
627
since been deleted are dropped.
605
628
629
+
Every row also carries `source_sha256`, the SHA-256 hash of the file it was rendered from.
630
+
`manifest.json` opens with a `provenance` block holding enough to make the output again:
631
+
- MultiView's version, repository and citation
632
+
- the Blender version and the `.blend` file
633
+
- render engine, samples, resolution, file format and view transform
634
+
- start and finish times
635
+
- a snapshot of every setting in the panels, including protocol and randomization seeds
636
+
637
+
**Croissant** (in the Manifest section) also writes `croissant.json`: an
description of the output as a dataset, which the NeurIPS datasets track asks for.
640
+
- The manifest CSV is its record set, one field per column, with its checksum.
641
+
- Each file type in the output (PNG, EXR, SVG, ...) is a file set.
642
+
- Name, description, licence, URL and citation come from the fields under the checkbox.
643
+
Without a citation, the dataset cites MultiView itself.
644
+
- The Responsible AI fields are filled with what the tool knows for certain: synthetic
645
+
renders of the listed files, no personal data. Intended use and limitations are left for
646
+
you to add.
647
+
648
+
Croissant always writes the CSV manifest, whatever **Write** is set to. After a sharded
649
+
command-line run, `--merge` writes `croissant.json` for the merged whole.
650
+
606
651
---
607
652
608
653
#### Annotations for research
@@ -653,6 +698,53 @@ source units converted to mm, and depth is written in the same mm, with a `depth
653
698
image so large parts still fit in 16 bits. Only perspective views go into BOP, because the
654
699
format has no orthographic camera.
655
700
701
+
#### Engineering drawings
702
+
703
+
Tick **Drawings** for vector three-view drawings of each product: Front, Top and Right as
704
+
separate SVGs (`AA_01_Widget_Front_drawing.svg`, ...), and all three on one sheet
705
+
(`AA_01_Widget_Drawing.svg`).
706
+
707
+
-**True scale.** One SVG unit is one millimetre of the original part: a 120 mm housing
708
+
is drawn 120 mm wide at 1:1, whatever Target Size it was rendered at. MultiView takes back
709
+
out every scale it applied.
710
+
-**Hidden lines dashed.** Lines are the mesh's feature edges, found geometrically: creases
711
+
sharper than **Crease Angle**, silhouettes and open boundaries. Each is then tested
712
+
against a depth image of the same view, along its whole length, so a line that passes
713
+
behind something turns dashed exactly where it disappears. **Accuracy** is that depth
714
+
image's size; raise it for very fine detail.
715
+
-**Drafting layout.** The views use cameras of their own, oriented the way a drawing
716
+
needs. The plan is seen with the front at the bottom, so its width lines up with the front
717
+
elevation's, and the side view stands upright. **Third Angle** puts the plan above and the
718
+
right view on the right; **First Angle** puts the plan below and the right view on the
719
+
left.
720
+
-**Dimensions** print each view's overall width and height in millimetres.
721
+
722
+
Because lines come from the mesh, a curved face's tessellation can add short creases where
723
+
the facets are coarse. A higher Crease Angle, or a finer Tessellation Deflection at import,
724
+
removes them. The drawings have no centre lines or detailed dimensioning; they are
725
+
a faithful outline, not a finished drawing.
726
+
727
+
#### Randomization
728
+
729
+
**Randomize** varies each image for training data while keeping every annotation exact:
730
+
731
+
| Setting | What varies |
732
+
| --- | --- |
733
+
|**Camera Jitter**, **Distance Jitter**| Each view's camera swings up to this far off its canonical direction, and moves nearer or farther |
734
+
|**Lights**| The rig turns about the vertical by up to **Light Turn**, and each light changes strength by up to **Light Strength**|
735
+
|**HDRI**| Each image is lit and backed by a random HDRI from **HDRI Folder** (empty: the studio HDRIs that ship with Blender), turned and scaled at random |
736
+
|**Materials**| The product gets a random material preset and colour per image, in Full renders |
737
+
|**Distractors**| Random shapes in random colours, placed behind the product as each camera sees it, in Full renders |
738
+
739
+
Every draw comes from the **Seed**, the product's label and the view, so the same settings
740
+
always give the same images. A product or view added later does not shift anyone else's
741
+
numbers. A view's image, mask, depth, normals and part IDs are all rendered from the same
742
+
jittered camera, and that is the camera `cameras.json`, `transforms.json` and BOP record.
743
+
Distractors are only ever placed on the far side of the product from the camera, so they
744
+
never cover it, and they appear only in Full renders. Masks, part IDs, COCO instances and BOP
745
+
visibility therefore stay exactly the product. Turntables are not randomized. Everything is
746
+
put back afterwards: lights, world, cameras, and the distractors are deleted.
747
+
656
748
## Command line
657
749
658
750
Everything the panels do can run without Blender's window, from a job file:
0 commit comments