Synthetic blenDR

A recurring bottleneck in industrial AI development is data: not enough of it, and too expensive to annotate by hand. This project builds a synthetic data pipeline in Blender that bypasses both problems by generating annotated training images at scale by randomising the rendering conditions that determine whether a model generalises.
Applied to a quadcopter assembly with 8 component classes, a YOLOv7 model trained using transfer learning on exclusively 500 synthetic images reached 71.21% mAP on real-world detection with zero manual labels.
The domain gap
Synthetic images are cheap to produce but differ from real photographs in ways that consistently degrade model performance. The solution approach is to widen the synthetic parameter space until the real-world distribution falls inside it.
Domain randomisation
Six randomisation factors were drawn from a review of 30 published studies and ranked by importance using the Analytic Hierarchy Process.
Textures (34%) — surface textures sampled from a library each frame
Object position (22%) — camera distributed across a Fibonacci sphere for uniform angular coverage
Light properties (20%) — intensity and colour temperature randomised per render
Light position (12%) — light source relocated each frame
Backgrounds (8%) — environment images swapped between renders
Distractors (3%) — random geometry partially occluding components
Experimental design
Factor levels were arranged into a Taguchi L16 orthogonal array — 16 dataset configurations that cover all factor interactions with the minimum possible number of runs. Each configuration was trained seven times to establish statistical robustness, yielding 112 training runs in total.
Pipeline
STL assembly files and a config.json specifying paths and randomisation ranges drive a headless Blender session using the zpy library. Each frame produces a paired RGB render and instance segmentation mask; bounding boxes are derived automatically, yielding a COCO-format dataset with zero manual labelling.
Results
All 16 dataset configurations exceeded 65% mAP on the real-world test set. The best configuration reached 71.21% mAP at IoU ≥ 0.5, validated against 50 real images across 8 component classes.
A second test set with artificial occlusions confirmed that including distractors in training improves detection under partial cover. Training mAP across all 112 runs stayed above 90%, with a Pearson correlation between training and test mAP confirming that synthetic performance reliably predicts real-world generalisation.
