Rayda duran bir engeli karda, alacakaranlıkta ya da pusta sahada görüntüleyemezsiniz: böyle bir olay nadirdir, tehlikelidir ve takvime bağlanamaz. Tam CGI bir sahnede ise hava, ışık ve görüş mesafesi birer render parametresidir. "Kışı Beklemedik" filmimizde tek bir Blender demiryolu sahnesini aynı kamera yoluyla dört koşulda render ettik; turuncu kutular dedektör tahmini değil, render motorunun kareyi çizerken yazdığı yer gerçeğidir (ground truth). Kurgunun asıl değeri eşleştirilmiş testtir: geometri ve etiketler sabitken yalnızca koşul değiştiği için, bir dedektörün iki koşul arasındaki metrik farkı doğrudan render edilen koşulun etkisidir.
Kısaca
- Rayda engel, hele karda ya da alacakaranlıkta, sahada toplanamaz; tam CGI sahnede koşul bir parametredir ve dağılımı miras almak yerine siz seçersiniz.
- Etiket render anında geometriden hesaplanır, ama kapanma, kadraj dışı, en küçük boyut ve görünmeyen nesne kurallarını siz yazarsınız.
- Eğitimde koşulu rastgele örnekleyin, testte tek tek değiştirin; eşleştirilmiş test koşulun etkisini geri kalan her şeyden ayırır.
- Sentetik testteki skor sahadaki başarıyı kanıtlamaz; karar, gerçek görüntülerden ayrılmış bir test kümesinde verilir.
Sahada çekemeyeceğiniz veri neden hep eksik kalır?
Raydaki engel, demiryolu algı sisteminin en çok ihtiyaç duyduğu ve en az sahip olduğu veridir; pozitif örnek kıtlığı ve ağır sınıf dengesizliği buradan gelir. Çekemeyeceğiniz Eğitim Verisi filmindeki kaya, hayvan ve kutu bu yüzden render ile üretildi.
Koşul ikinci bir çarpandır: arşivdeki birkaç engel kaydı, o gün hava nasılsa o koşulda çekilmiştir; "karda, alacakaranlıkta rayda engel" iki nadir durumun kesişimidir ve sahada pratikte hiç görünmez. Sentetik veride sınıf ve koşul dağılımını siz seçersiniz. Bu seçim bir iddiadır: seçtiğiniz dağılımın sahayla örtüştüğünü ayrıca göstermeniz gerekir.
Gerçek kabin görüntüsüne engel yerleştiren kompozit hattımızı ayrı bir kanıt yazısında anlattık.
Etiket render sırasında nasıl yazılır?
Render motoru her nesnenin 3B konumunu, ölçeğini ve sınıfını bilir; filmdeki sahnede 12 nesne sınıfı var ve kutular render anında otomatik dışa aktarılıyor (3840×2160, 30 fps). Kutunun aynı şeyi ölçmeyen iki kaynağı var. İzdüşüm nesnenin köşelerini görüntü düzlemine yansıtır; kutu, bir direğin kapattığı kısım dahil nesnenin tamamını kapsar (amodal). Örnek maskesi ise Cycles'taki Object Index geçişinden ya da Cryptomatte'den gelir; kutu yalnızca görünen kısmı kapsar (modal). Gerçek test kümenizin yönergesi hangisini istiyorsa sentetik kutu da onu izlemeli; yoksa fark IoU'da model hatası gibi görünür.
Hangisini seçerseniz seçin dört kural yazılı olmalı: görünen oran hangi eşiğin altına düşünce nesne etiketten çıkar; kadraj dışına taşan kutu kırpılır mı, atılır mı; en küçük boyut kaç piksel; yoğun pusta geometrik olarak orada olan ama seçilemeyen engel ne olacak. Sonuncusunu pozitif sayarsanız dedektörden görünmeyeni bulmasını istersiniz.
Aşağıdaki parça üretim hattımız değildir ve kapanmayı hesaba katmaz; Blender 5.2'de bir test sahnesinde çalıştırılıp kutular render üzerine çizilerek denetlendi.
import bpy
from bpy_extras.object_utils import world_to_camera_view
MIN_PX, MAX_TRUNC, TRAIN_SIDE = 12, 0.5, 640 # örnek değerler
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 pikseli -> eğitim pikseli
out = []
for obj in objects:
cls = obj.get("class_id")
if cls is None:
continue
ev = obj.evaluated_get(depsgraph) # animasyon, değiştiriciler uygulanmış
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) sol alt köşe; YOLO: y aşağı doğru
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 örnekleri için: depsgraph.object_instances
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))
Örnek hesap: Varsayımlar: Blender'ın varsayılan kamerası (50 mm odak, 36 mm sensör), 3840 piksel genişlik, ideal iğne deliği kamera, 40 cm yüksekliğinde nesne. Piksel cinsinden odak 50/36 × 3840 ≈ 5333 piksel; 100 m'deki nesne 5333 × 0,40 / 100 ≈ 21 piksel. Görüntü eğitim için uzun kenarı 640 piksele küçültülürse (Ultralytics'te imgsz varsayılanı) ölçek 1/6 olur ve nesne yaklaşık 3,6 piksele iner. Bu bir ölçüm değil, geometridir: en küçük piksel eşiğini eğitim girişinde koyun.
Koşul bir parametreye nasıl dönüşür?
Işık, güneş açısı, bulut, pus, kar örtüsü, yağış ve pozlama sahnede birer ayardır: Sky Texture düğümündeki sun_elevation, World çıktısına bağlı Principled Volume'un Density değeri, renk yönetimindeki exposure. Işık, bulut ve pozlama kutuyu değiştirmez; kar alçak bir nesneyi kısmen gömerek, yağış önünü kapatarak görünen kutuyu değiştirebilir.
Bu parametrelerin iki kullanımı var: eğitimde rastgele örnekleyin, testte tek tek tarayın. Eğitimdeki fikir alan rastgeleleştirmesidir (domain randomization): Tobin vd. (2017) render'ı rastgeleleştirerek gerçek dünyanın modele bir varyasyon daha gibi görünmesini hedefler; gerçekçi olmayan rastgele dokularla yalnızca simülasyonda eğitilen bir nesne konumlandırıcının gerçek dünyada 1,5 cm doğruluğa ulaştığını raporlar. Karşı kutupta fotogerçekçilik var: Hodaň vd. (2019) tam sahnelerde fiziksel tabanlı render ile, rastgele fotoğraflar üzerine render edilmiş nesnelere göre mAP@.75IoU'da yüzde 24 (Rutgers APC) ve yüzde 11 (LineMod-Occluded) mutlak iyileşme bildiriyor. Prakash vd. (2019) arada durur: nesneleri sahne bağlamından gelen dağılımlarla yerleştirir. Ray, balast ve katenerle zaten yapılandırılmış bir demiryolu sahnesi için doğal tercih budur.
Sakaridis vd. (2018) sisi fiziksel bir birimle, zayıflama katsayısı β ile modeller: geçirgenlik t = exp(−β·ℓ) (ℓ: kameraya uzaklık), görüş mesafesi (MOR) = 2,996/β; β = 0,01 m⁻¹ yaklaşık 300 m görüş demektir. Blender'daki hacim yoğunluğunun hangi görüş mesafesine karşılık geldiğini varsaymayın: sahneye bilinen mesafelerde siyah ve beyaz hedefler koyup kontrast düşüşünü doğrusal (EXR) çıktıda ölçerek β'yı çıkarın. Örnek hesap: β = 0,01 m⁻¹ ile 150 m'deki nesnenin geçirgenliği exp(−1,5) ≈ 0,22, 300 m'dekininki exp(−3) ≈ 0,05'tir; daha uzaktaki bir engeli pozitif etiketlemek, dedektörden fiziğin izin vermediğini istemek olabilir.
Eşleştirilmiş test: yalnızca koşul değiştiğinde
Sahadan bir "pus" alt kümesini "açık hava" alt kümesiyle karşılaştırırsanız güzergâh, mesafe dağılımı, nesneler ve kamera da değişmiştir; farkın kaynağı ayrılamaz. Kışı Beklemedik kurgusunda aynı sahne, aynı kamera yolu ve aynı etiketler dört kez render edilir; değişen tek şey koşuldur.
En yakın örnek bozulma kıyaslarıdır: ImageNet-C aynı doğrulama görüntülerine 15 bozulma türünü beşer şiddet seviyesinde uygular (Hendrycks ve Dietterich, 2019); Michaelis vd. (2019) bunu nesne tespitine taşıyıp dedektörlerin özgün performanslarının yüzde 30–60'ına kadar düştüğünü raporlar. Bu bozulmalar görüntü düzleminde işler (ImageNet-C'de sis diamond-square algoritmasıyla üretilir); render'da ise pus mesafeyle kalınlaşır, kar geometrinin üstüne yağar.
Ölçüm planı aşağıda, hücrelerde sayı yok. Filmdeki dört koşulun ikisi kış olduğundan bazı çiftlerde birden fazla şey birlikte değişir; bu yüzden tabloya filmde olmayan bir referans ekledik.
| Koşul | Referansa göre değişen | mAP | Küçük nesne recall'ı | Yanlış alarm |
|---|---|---|---|---|
| Gündüz, açık (referans) | Hiçbiri | Taban | Piksel yüksekliğine göre taban eğri | Boş ray karelerinde taban |
| Kış, açık | Kar örtüsü | Fark: karın etkisi | Açık renkli nesne karda ayrışıyor mu? | Kar yığını ve parlama |
| Kış, kapalı | Kar, düz ışık | Kış, açık ile fark: ışığın etkisi | Gölge ipucu kaybolunca? | Düşük kontrastta değişim |
| Alacakaranlık | Işık seviyesi, gürültü | Fark: düşük ışık | Hangi piksel yüksekliğinde kopuyor? | Gürültü, ışık kaynakları |
| Gündüz, pus | Mesafeyle düşen kontrast | Fark: pus | Mesafe dilimine göre; MOR ötesi yok sayılır | Pustaki silüetler |
Etkileşimleri görmek için tam faktöriyel tasarım kurun: kar (var/yok) × ışık (gündüz/alacakaranlık) × pus (var/yok), aynı kamera yolunun sekiz render'ıdır. Testi dürüst tutan kurallar:
- Etiketi koşula göre değiştirmeyin; koşula bağlı olanı yanına yazın. Mesafe, görünen oran ve geçirgenlik yan dosyada durur, MOR ötesindeki nesne "yok say" olur. KITTI'de de "don't care" bölgelerindeki ve en küçük boyutun altındaki tespitler yanlış pozitif sayılmaz.
- Kareyi değil, nesne geçişini sayın. 30 fps'te 24 saniyelik bir yol 720 kare eder ama 720 bağımsız gözlem değildir. Her nesnenin tutarlı biçimde tespit edilmeye başladığı mesafeyi koşullar arasında karşılaştırın.
- Test koşulunun üretecini eğitimde kullanmayın. Michaelis vd. test bozulmalarının eğitim dışında kalmasını ister; aynı pus modeliyle eğitip test eden, render motoruna uyumu ölçer.
Sentetik testte başarı neyi kanıtlamaz?
Sentetik testteki yüksek skor, modelin render motorunuzla uyumunu gösterir; aynı motordan gelen eğitim ve test verisi dokuyu ve gürültüyü paylaşır. Kararı gerçek görüntülerden ayrılmış bir test kümesi verir: güzergâha, güne ve kameraya göre bölünmüş, hiperparametre ayarına girmemiş, yanlış alarm için boş ray kareleri içeren bir küme. Az sayıdaki gerçek pozitifi güven aralığıyla raporlayın.
Sentetik payını adım adım artırıp her modeli aynı gerçek testte ölçün, sentetikle ön eğitim artı gerçek veriyle ince ayar varyantını da ekleyin; Tremblay vd. (2018) gerçek veriyle ince ayarın, Prakash vd. sentetik ve gerçek verinin birlikte kullanımının yalnızca gerçek veriyle eğitimi geçtiğini raporluyor. Eğri sentetik payı arttıkça düşüyorsa model büyük olasılıkla render motorunu öğreniyordur. Az da olsa gerçek alacakaranlık ya da pus kareniz varsa, sentetik testin koşulları sıralayışını gerçek dilimlerle karşılaştırın; sıralama tutmuyorsa koşul modeliniz sahadan kopmuştur. En küçük piksel eşiği de modelin koşacağı cihazın giriş çözünürlüğüne bağlıdır; o zinciri edge AI hattı sayfamızda anlatıyoruz.
Tam CGI, kompozit, üretken model: hangisi ne zaman?
| Yol | Gerçekçilik | Etiket doğruluğu | Kontrol edilebilirlik | Maliyet | En uygun kullanım |
|---|---|---|---|---|---|
| Tam CGI (Blender) | Sahne ve malzeme kalitesiyle sınırlı | Geometriden; görünürlük kuralı sizin | En yüksek: koşul, kamera, nesne | Sahne kurmak pahalı, sonrası render süresi | Eşleştirilmiş koşul testi, sahnelenemeyen senaryo |
| Gerçek görüntüye kompozit | Arka plan gerçek; ışık ve gölge uyumu risk | Yerleşimden; görünürlük filtresi gerekir | Nesne sizin, hava kayıttaki | Orta | Gerçek sahnede nadir nesneyi çoğaltmak |
| Üretken model varlıkları | Görünüş çeşitli, fizik garantisiz | Maskeden türetilir, denetlenmeli | İstem düzeyinde | Varlık başına düşük | Nesne görünüşünü çeşitlendirmek |
Kompozite örnek Gerçek Ray Görüntüsünde Otomatik Etiketli Engeller filmi: ray açıklığına göre ölçeklenen, dünyaya kilitli nesneler; 40 cm'lik nesne her mesafede 40 cm. O koşu YOLO biçiminde 960 kare, 8 sınıf ve 3.145 etiket üretti. Kompozitte koşul kayıttan gelir; güneşli kayda pus eklemek, Foggy Cityscapes'teki gibi derinliğe dayalı bir görüntü işlemidir. Hattın bütünü demiryolu vaka analizinde anlatılıyor.
Nerede yanlış gider
- Kestirme ipuçları. Geirhos vd. (2020) kestirmeyi standart kıyaslarda çalışan ama zor test koşullarına taşınmayan karar kuralı olarak tanımlar. CGI'da kestirme render'ın kendisi olabilir: gürültü gidericinin izi, fazla temiz kenarlar, zeminden ayrıntılı dokulu engeller.
- Her sahnede aynı nesne modeli. Sınıf başına tek 3B model varsa dedektör sınıfı öğrenmek yerine o modeli ezberler; test için eğitimde görülmemiş varlıklar ayırın.
- Etiketin görünürlükten kopması. Tamamen kapanmış ya da pusta seçilemeyen nesneyi pozitif saymak hayal görmeyi öğretir ve dedektörü haksız cezalandırır.
- Test kümesinin sızması. Aynı kamera yolundan kareler hem eğitimde hem testte varsa test ezberi ölçer; sahneye, yola ve varlığa göre ayırın.
- Koşul dağılımının sahayla uyumsuzluğu. Her koşula dörtte bir pay sahadaki dağılım değildir; tek ortalama mAP bu karışımı gizler. Koşul başına raporlayın.
Bu yazının söyleyemedikleri
- Bu veriyle eğitilmiş bir dedektörün koşul değişince ya da sahada nasıl davrandığını henüz ölçmedik; filmin açıklaması da bunu sonraki adım olarak yazıyor; tablo bir plandır.
- Sahne iç Ar-Ge sahnesidir; müşteri işi ya da sahaya kurulmuş bir sistem değildir.
- Render edilmiş kar ve pusun gerçeğine ne kadar benzediğini sayısal olarak karşılaştırmadık.
- Alıntılanan sonuçlar robot kavrama, KITTI'de araç tespiti gibi başka görevlerden gelir; demiryolu engeline olduğu gibi taşınamaz.
Sık sorulan sorular
Sentetik veri gerçek verinin yerini alır mı?
Hayır. Sentetik veri, sahanın vermeyeceği nadir ve tehlikeli durumları doldurur; modelin işe yarayıp yaramadığı gerçek görüntülerden ayrılmış bir test kümesinde anlaşılır.
Etiketler neden elle çizilmiyor?
Render motoru her nesnenin 3B konumunu, ölçeğini ve sınıfını bildiği için kutu kare çizilirken geometriden hesaplanır ve aynı nesne her koşulda aynı etiketi alır. Kapanma, kadraj dışı ve görünmeyen nesne kurallarını ise siz yazarsınız.
Aynı sahneyi dört koşulda render etmek ne kazandırır?
Eşleştirilmiş bir test: geometri, kamera yolu ve etiketler sabit olduğu için iki koşul arasındaki metrik farkı render edilen koşulun etkisidir. Farklı gün ve yerlerden toplanmış saha verisiyle bu ayrım yapılamaz.
Tam CGI mi, gerçek görüntüye kompozit mi?
Kontrollü koşul testi ve sahnelenemeyen senaryolar için tam CGI, gerçek arka planda nadir nesneyi çoğaltmak için kompozit daha uygundur. İkisi çoğu zaman birlikte kullanılır ve ikisi de gerçek test kümesinde sınanır.
Kaynaklar
- Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World: Tobin vd., IROS 2017.
- Training Deep Networks with Synthetic Data: Bridging the Reality Gap by Domain Randomization: Tremblay vd., 2018.
- Structured Domain Randomization: Prakash vd., ICRA 2019.
- Photorealistic Image Synthesis for Object Instance Detection: Hodaň vd., ICIP 2019.
- Benchmarking Neural Network Robustness to Common Corruptions and Perturbations: Hendrycks ve Dietterich, ICLR 2019.
- Benchmarking Robustness in Object Detection: Autonomous Driving when Winter is Coming: Michaelis vd., 2019.
- Semantic Foggy Scene Understanding with Synthetic Data: Sakaridis vd., IJCV 2018.
- Shortcut Learning in Deep Neural Networks: Geirhos vd., 2020.
- KITTI Object Detection Evaluation: "don't care" kuralı.
- Blender API: bpy_extras.object_utils:
world_to_camera_view. - Blender API: Camera: varsayılan odak ve sensör.
- Blender Kılavuzu: Render Passes: Object Index, Cryptomatte.
- Ultralytics: Object Detection Datasets: YOLO etiket biçimi.
- Ultralytics: Model Training:
imgszvarsayılanı.
Erişim tarihi: 26 Eylül 2026.



