Ein Hindernis auf dem Gleis bei Schnee, in der Dämmerung oder im Dunst können Sie im Feld nicht filmen: Solche Ereignisse sind selten, gefährlich und nicht planbar. In einer vollständig gerenderten CGI-Szene sind Wetter, Licht und Sichtweite dagegen Render-Parameter. Für unseren Film „Wir haben nicht auf den Winter gewartet“ haben wir eine Blender-Bahnszene entlang eines Kamerapfads unter vier Bedingungen gerendert; die orangefarbenen Boxen sind keine Detektionen, sondern Ground Truth, die der Renderer beim Zeichnen des Frames schreibt. Das ermöglicht einen gepaarten Test: Geometrie und Labels bleiben gleich, nur die Bedingung ändert sich; die Metrikdifferenz eines Detektors zwischen zwei Bedingungen ist damit der Effekt der gerenderten Bedingung.
Kurz gesagt
- Ein Hindernis auf dem Gleis, erst recht bei Schnee oder Dämmerung, lässt sich im Feld nicht aufnehmen; in einer CGI-Szene ist die Bedingung ein Parameter, und Sie wählen die Verteilung selbst.
- Labels entstehen beim Rendern aus der Geometrie, aber die Regeln für Verdeckung, Bildrand, Mindestgröße und im Dunst unsichtbare Objekte legen Sie fest.
- Streuen Sie Bedingungen im Training zufällig, ändern Sie sie im Test einzeln: Ein gepaarter Test trennt den Effekt der Bedingung von allem anderen.
- Ein Wert auf synthetischen Testdaten belegt keine Leistung im Feld; entschieden wird auf einem zurückgehaltenen Satz realer Bilder.
Warum fehlen genau die Daten, die man nicht filmen kann?
Ein Hindernis auf dem Gleis ist das, was ein Bahn-Wahrnehmungssystem am dringendsten braucht und am seltensten hat; daher der Mangel an Positivbeispielen und das starke Klassenungleichgewicht. Stein, Tier und Kiste in unserem Film Trainingsdaten, die man nicht filmen kann wurden deshalb gerendert.
Die Bedingung wirkt als zweiter Multiplikator. Die wenigen Hindernisaufnahmen in einem Archiv zeigen das Wetter, das an diesem Tag herrschte; „Hindernis auf dem Gleis, bei Schnee, in der Dämmerung“ ist die Schnittmenge zweier seltener Ereignisse und kommt in Felddaten praktisch nicht vor. Mit synthetischen Daten wählen Sie Klassen- und Bedingungsverteilung selbst. Diese Wahl ist zugleich eine Behauptung, deren Übereinstimmung mit dem Feld Sie gesondert belegen müssen.
Unsere Compositing-Pipeline, die Hindernisse in reale Führerstandsaufnahmen einsetzt, beschreiben wir in einem eigenen technischen Beitrag (auf Türkisch).
Wie entstehen Labels beim Rendern?
Der Renderer kennt Position, Maßstab und Klasse jedes Objekts in 3D. Die Szene im Film umfasst 12 Objektklassen; die Boxen werden beim Rendern automatisch exportiert (3840×2160, 30 fps). Eine Box kann aus zwei Quellen stammen, die Unterschiedliches messen. Die Projektion bildet die Vertices des Objekts auf die Bildebene ab; die Box umfasst das ganze Objekt, auch den Teil hinter einem Mast (amodal). Eine Instanzmaske aus dem Object-Index-Pass in Cycles oder aus Cryptomatte liefert eine Box nur um den sichtbaren Teil (modal). Folgen Sie der Konvention der Annotationsrichtlinie Ihres realen Testdatensatzes, sonst erscheint der Unterschied in der IoU als Modellfehler.
In beiden Fällen gehören vier Regeln schriftlich festgelegt: unterhalb welches sichtbaren Anteils ein Objekt aus den Labels fällt; ob eine Box am Bildrand beschnitten oder verworfen wird; die Mindestgröße in Pixeln; und was mit einem Hindernis geschieht, das geometrisch vorhanden, im dichten Dunst aber nicht zu erkennen ist. Wer es als positiv zählt, verlangt vom Detektor, Unsichtbares zu finden.
Das folgende Snippet ist nicht unsere Produktionspipeline und ignoriert Verdeckung; es wurde in Blender 5.2 an einer Testszene ausgeführt und durch Einzeichnen der Boxen in das Rendering geprüft.
import bpy
from bpy_extras.object_utils import world_to_camera_view
MIN_PX, MAX_TRUNC, TRAIN_SIDE = 12, 0.5, 640 # Beispielwerte
def yolo_lines(scene, cam, objects, depsgraph):
r = scene.render
W = r.resolution_x * r.resolution_percentage / 100
H = r.resolution_y * r.resolution_percentage / 100
k = TRAIN_SIDE / max(W, H) # Render-Pixel -> Trainings-Pixel
out = []
for obj in objects:
cls = obj.get("class_id")
if cls is None:
continue
ev = obj.evaluated_get(depsgraph) # Animation, Modifier angewendet
pts = [world_to_camera_view(scene, cam, ev.matrix_world @ v.co)
for v in ev.to_mesh().vertices]
ev.to_mesh_clear()
if not pts or min(p.z for p in pts) <= 0:
continue
x0, x1 = min(p.x for p in pts), max(p.x for p in pts)
y0, y1 = min(p.y for p in pts), max(p.y for p in pts)
cx0, cx1, cy0, cy1 = max(x0, 0), min(x1, 1), max(y0, 0), min(y1, 1)
if cx1 <= cx0 or cy1 <= cy0:
continue
trunc = 1 - (cx1 - cx0) * (cy1 - cy0) / max((x1 - x0) * (y1 - y0), 1e-12)
if trunc > MAX_TRUNC or min((cx1 - cx0) * W, (cy1 - cy0) * H) * k < MIN_PX:
continue
# Blender: (0, 0) unten links; YOLO: y wächst nach unten
out.append(f"{cls} {(cx0 + cx1) / 2:.6f} {1 - (cy0 + cy1) / 2:.6f} "
f"{cx1 - cx0:.6f} {cy1 - cy0:.6f}")
return out
scene = bpy.context.scene
for f in range(scene.frame_start, scene.frame_end + 1):
scene.frame_set(f)
# Geometry-Nodes-Instanzen: über depsgraph.object_instances iterieren
lines = yolo_lines(scene, scene.camera, bpy.data.collections["Obstacles"].all_objects,
bpy.context.evaluated_depsgraph_get())
with open(f"labels/{f:06d}.txt", "w") as fh:
fh.write("\n".join(lines))
Rechenbeispiel: Annahmen: Blenders Standardkamera (50 mm Brennweite, 36 mm Sensorbreite), 3840 Pixel Bildbreite, ideale Lochkamera, ein 40 cm hohes Objekt. Die Brennweite in Pixeln beträgt 50/36 × 3840 ≈ 5333 Pixel; in 100 m ist das Objekt 5333 × 0,40 / 100 ≈ 21 Pixel hoch. Wird das Bild für das Training auf eine lange Seite von 640 Pixeln verkleinert (Ultralytics-Standardwert für imgsz), beträgt der Maßstab 1/6 und das Objekt schrumpft auf etwa 3,6 Pixel. Das ist Geometrie, keine Messung: Legen Sie die Mindestgröße bei der Trainingsauflösung fest.
Wie wird eine Bedingung zum Parameter?
Licht, Sonnenstand, Bewölkung, Dunst, Schneedecke, Niederschlag und Belichtung sind Szeneneinstellungen: sun_elevation am Sky-Texture-Knoten, die Density eines Principled Volume am World-Ausgang, exposure im Farbmanagement. Licht, Bewölkung und Belichtung ändern die Box nicht; Schnee kann ein niedriges Objekt teilweise bedecken und Niederschlag seine Front verdecken, beides kann die sichtbare Box verändern.
Im Training werden diese Parameter gestreut, im Test einzeln durchlaufen. Die Idee für das Training ist Domain Randomization: Tobin et al. (2017) randomisieren das Rendering, damit die reale Welt für das Modell wie eine weitere Variation aussieht, und berichten, dass ein nur in der Simulation mit unrealistischen Zufallstexturen trainierter Objektlokalisierer in der realen Welt eine Genauigkeit von 1,5 cm erreichte. Am anderen Ende steht Fotorealismus: Hodaň et al. (2019) berichten für physikalisch basiertes Rendering vollständiger Szenen eine absolute Verbesserung der mAP@.75IoU um 24 % (Rutgers APC) und 11 % (LineMod-Occluded) gegenüber Objekten, die auf zufällige Fotos gerendert wurden. Prakash et al. (2019) liegen dazwischen: Sie platzieren Objekte nach Verteilungen aus dem Szenenkontext. Für eine Bahnszene, die durch Schienen, Schotter und Oberleitung ohnehin stark strukturiert ist, ist das die naheliegende Wahl.
Dunst lässt sich auch physikalisch beschreiben. Sakaridis et al. (2018) modellieren Nebel mit dem Extinktionskoeffizienten β: Transmission t = exp(−β·ℓ) (ℓ: Entfernung zur Kamera), Sichtweite (MOR) = 2,996/β; β = 0,01 m⁻¹ entspricht etwa 300 m Sicht. Nehmen Sie nicht einfach an, welcher Sichtweite eine Volumendichte in Blender entspricht: Stellen Sie schwarze und weiße Ziele in bekannten Abständen auf und bestimmen Sie β aus dem Kontrastverlust in der linearen Ausgabe (EXR). Rechenbeispiel: Mit β = 0,01 m⁻¹ beträgt die Transmission in 150 m exp(−1,5) ≈ 0,22 und in 300 m exp(−3) ≈ 0,05; ein noch weiter entferntes Hindernis als positiv zu labeln, verlangt womöglich etwas, das die Physik nicht zulässt.
Gepaarter Test: Wenn sich nur die Bedingung ändert
Vergleichen Sie eine „Dunst“-Teilmenge aus dem Feld mit einer „klaren“, haben sich auch Strecke, Entfernungsverteilung, Objekte und Kamera geändert; die Ursachen lassen sich nicht trennen. In Wir haben nicht auf den Winter gewartet werden dieselbe Szene, derselbe Kamerapfad und dieselben Labels viermal gerendert; nur die Bedingung ändert sich.
Am nächsten kommen dem Korruptions-Benchmarks. ImageNet-C wendet 15 Korruptionsarten in je fünf Schweregraden auf dieselben Validierungsbilder an (Hendrycks und Dietterich, 2019); Michaelis et al. (2019) übertrugen das auf die Objekterkennung und berichten, dass Standarddetektoren auf 30–60 % ihrer ursprünglichen Leistung fallen. Diese Korruptionen wirken in der Bildebene (Nebel entsteht in ImageNet-C mit dem Diamond-Square-Algorithmus); im Rendering nimmt Dunst mit der Entfernung zu, und Schnee liegt auf der Geometrie.
Der Messplan steht unten, ohne Zahlen in den Zellen. Zwei der vier Bedingungen im Film sind Winter, daher ändert sich in manchen Paaren mehr als eine Größe; deshalb ergänzt die Tabelle eine Referenzbedingung, die im Film nicht vorkommt.
| Bedingung | Änderung gegenüber Referenz | mAP | Recall kleiner Objekte | Falschalarme |
|---|---|---|---|---|
| Tag, klar (Referenz) | Keine | Basiswert | Basiskurve nach Pixelhöhe | Basiswert auf leeren Gleisbildern |
| Winter, klar | Schneedecke | Differenz: Effekt des Schnees | Hebt sich ein helles Objekt vom Schnee ab? | Schneehaufen, Blendung |
| Winter, bedeckt | Schnee, diffuses Licht | Differenz zu Winter, klar: Effekt des Lichts | Was passiert ohne Schattenhinweis? | Änderung bei geringem Kontrast |
| Dämmerung | Lichtniveau, Rauschen | Differenz: wenig Licht | Ab welcher Pixelhöhe bricht er ein? | Rauschen, Lichtquellen |
| Tag, Dunst | Mit der Entfernung sinkender Kontrast | Differenz: Dunst | Nach Entfernungsklassen; jenseits der MOR ignoriert | Silhouetten im Dunst |
Für Wechselwirkungen eignet sich ein vollfaktorieller Versuchsplan: Schnee (ja/nein) × Licht (Tag/Dämmerung) × Dunst (ja/nein) ergibt acht Renderings desselben Kamerapfads. Regeln, die den Test ehrlich halten:
- Das Label nicht mit der Bedingung ändern; was von der Bedingung abhängt, daneben speichern. Entfernung, sichtbarer Anteil und Transmission gehören in eine Begleitdatei, Objekte jenseits der MOR werden als „ignorieren“ markiert. KITTI verfährt ebenso: Detektionen in „Don't care“-Bereichen oder unterhalb der Mindestgröße zählen nicht als Falschpositive.
- Objektdurchgänge zählen, nicht Frames. Ein 24-Sekunden-Pfad mit 30 fps ergibt 720 Frames, aber keine 720 unabhängigen Beobachtungen. Vergleichen Sie pro Objekt über die Bedingungen hinweg die Entfernung, ab der es stabil erkannt wird.
- Nicht mit dem Generator einer Testbedingung trainieren. Michaelis et al. verlangen, dass Testkorruptionen nicht ins Training gelangen; wer mit demselben Dunstmodell trainiert und testet, misst die Anpassung an den eigenen Renderer.
Was beweist Erfolg auf synthetischen Testdaten nicht?
Ein hoher Wert auf synthetischen Testdaten zeigt, dass das Modell zu Ihrem Renderer passt, denn Trainings- und Testdaten aus demselben Renderer teilen Textur und Rauschen. Entschieden wird auf einem zurückgehaltenen Satz realer Bilder: nach Strecke, Tag und Kamera getrennt, nicht für das Hyperparameter-Tuning verwendet, mit leeren Gleisbildern für die Falschalarmrate. Die wenigen realen Positivbeispiele berichten Sie mit Konfidenzintervallen.
Erhöhen Sie den synthetischen Anteil schrittweise und messen Sie jedes Modell auf demselben realen Testsatz, dazu eine Variante mit synthetischem Vortraining und realem Fine-Tuning. Beide schlagen in der Literatur reines Training mit realen Daten: Fine-Tuning auf realen Daten bei Tremblay et al. (2018), die Kombination synthetischer und realer Daten bei Prakash et al. Fällt die Kurve mit wachsendem synthetischem Anteil, lernt das Modell sehr wahrscheinlich den Renderer. Haben Sie auch nur wenige reale Dämmerungs- oder Dunstbilder, prüfen Sie, ob der synthetische Test die Bedingungen genauso ordnet wie die realen Teilmengen; wenn nicht, hat sich Ihr Bedingungsmodell vom Feld entfernt. Auch die Mindestgröße hängt von der Eingangsauflösung des Zielgeräts ab; diese Kette beschreibt unsere Seite zur Edge-AI-Pipeline.
Volles CGI, Compositing oder generative Modelle: Was wann?
| Weg | Realismus | Label-Genauigkeit | Steuerbarkeit | Kosten | Bester Einsatz |
|---|---|---|---|---|---|
| Volles CGI (Blender) | Begrenzt durch Szenen- und Materialqualität | Aus der Geometrie; Sichtbarkeitsregeln legen Sie fest | Am höchsten: Bedingung, Kamera, Objekt | Szenenaufbau teuer, danach Renderzeit | Gepaarte Bedingungstests, nicht inszenierbare Szenarien |
| Compositing in reale Aufnahmen | Echter Hintergrund; Licht und Schatten sind ein Risiko | Aus der Platzierung; Sichtbarkeitsfilter nötig | Objekt steuerbar, Wetter wie aufgenommen | Mittel | Seltene Objekte in realen Szenen vervielfachen |
| Assets aus generativen Modellen | Vielfältiges Aussehen, keine physikalische Garantie | Aus Masken abgeleitet, zu prüfen | Auf Prompt-Ebene | Gering pro Asset | Erscheinungsbild von Objekten variieren |
Unser Film Automatisch annotierte Hindernisse auf realen Bahnaufnahmen ist ein Beispiel für Compositing: weltfest platzierte Objekte, skaliert an der Spurweite, sodass ein 40-cm-Objekt in jeder Entfernung 40 cm bleibt; dieser Durchlauf ergab 960 Frames, 8 Klassen und 3.145 Annotationen im YOLO-Format. Hier stammt die Bedingung aus der Aufnahme; Dunst in eine sonnige Aufnahme einzufügen, ist eine tiefenbasierte Bildoperation wie bei Foggy Cityscapes. Die gesamte Pipeline beschreibt die Fallstudie railway-inspection.
Wo es schiefgeht
- Shortcuts. Geirhos et al. (2020) definieren Shortcuts als Entscheidungsregeln, die auf Standard-Benchmarks gut funktionieren, sich aber nicht auf schwierigere Testbedingungen übertragen lassen. Bei CGI kann der Shortcut das Rendering selbst sein: Spuren des Denoisers, zu saubere Kanten, Hindernisse mit mehr Texturdetail als der Boden.
- Dasselbe Objektmodell in jeder Szene. Gibt es pro Klasse nur ein 3D-Modell, lernt der Detektor dieses Modell auswendig, statt die Klasse zu lernen. Halten Sie Test-Assets zurück, die im Training nie vorkommen.
- Labels ohne Bezug zur Sichtbarkeit. Ein vollständig verdecktes oder im Dunst verlorenes Objekt als positiv zu zählen, lehrt Halluzinieren und bestraft den Detektor zu Unrecht.
- Datenleck in den Testsatz. Liegen Frames desselben Kamerapfads in Training und Test, misst der Test Auswendiglernen. Trennen Sie nach Szene, Pfad und Asset.
- Bedingungsmix passt nicht zum Feld. Ein Viertel pro Bedingung ist nicht die Verteilung im Feld, und eine einzige gemittelte mAP verdeckt die Mischung. Berichten Sie pro Bedingung.
Was dieser Beitrag nicht sagen kann
- Wie sich ein mit diesen Daten trainierter Detektor bei wechselnden Bedingungen oder im Feld verhält, haben wir noch nicht gemessen; die Filmbeschreibung nennt das als nächsten Schritt. Die Tabelle ist ein Plan.
- Die Szene ist eine interne F&E-Szene von Spikedge, kein Kundenprojekt und kein installiertes System.
- Wie nah gerenderter Schnee und Dunst der Wirklichkeit kommen, haben wir nicht zahlenmäßig verglichen.
- Die zitierten Ergebnisse stammen aus anderen Aufgaben, etwa Robotergreifen und Fahrzeugerkennung auf KITTI; sie lassen sich nicht unverändert auf Hindernisse im Gleis übertragen.
Häufig gestellte Fragen
Ersetzen synthetische Daten reale Daten?
Nein. Synthetische Daten füllen die seltenen und gefährlichen Fälle, die das Feld nicht liefert; ob das Modell funktioniert, entscheidet ein zurückgehaltener Satz realer Bilder.
Warum werden die Labels nicht von Hand gezeichnet?
Der Renderer kennt Position, Maßstab und Klasse jedes Objekts in 3D; die Box wird beim Zeichnen des Frames aus der Geometrie berechnet, und dasselbe Objekt erhält unter jeder Bedingung dasselbe Label. Die Regeln für Verdeckung, Bildrand und unsichtbare Objekte legen trotzdem Sie fest.
Was bringt es, dieselbe Szene unter vier Bedingungen zu rendern?
Einen gepaarten Test: Geometrie, Kamerapfad und Labels sind fest, daher ist die Metrikdifferenz zwischen zwei Bedingungen der Effekt der gerenderten Bedingung. Felddaten von verschiedenen Tagen und Orten können das nicht trennen.
Volles CGI oder Compositing in reale Aufnahmen?
Volles CGI eignet sich für kontrollierte Bedingungstests und nicht inszenierbare Szenarien, Compositing für mehr seltene Objekte auf realem Hintergrund. Oft werden beide kombiniert, und beide werden an realen Daten geprüft.
Quellen
- Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World: Tobin et al., IROS 2017.
- Training Deep Networks with Synthetic Data: Bridging the Reality Gap by Domain Randomization: Tremblay et al., 2018.
- Structured Domain Randomization: Prakash et al., ICRA 2019.
- Photorealistic Image Synthesis for Object Instance Detection: Hodaň et al., ICIP 2019.
- Benchmarking Neural Network Robustness to Common Corruptions and Perturbations: Hendrycks und Dietterich, ICLR 2019.
- Benchmarking Robustness in Object Detection: Autonomous Driving when Winter is Coming: Michaelis et al., 2019.
- Semantic Foggy Scene Understanding with Synthetic Data: Sakaridis et al., IJCV 2018.
- Shortcut Learning in Deep Neural Networks: Geirhos et al., 2020.
- KITTI Object Detection Evaluation: „Don't care“-Regel.
- Blender API: bpy_extras.object_utils:
world_to_camera_view. - Blender API: Camera: Standardbrennweite und Sensorbreite.
- Blender-Handbuch: Render Passes: Object Index, Cryptomatte.
- Ultralytics: Object Detection Datasets: YOLO-Labelformat.
- Ultralytics: Model Training: Standardwert von
imgsz.
Abgerufen am 26. September 2026.



