제10부 시뮬레이션·디지털트윈·피지컬 AI
10.6 합성데이터 II — 도메인 랜덤화·자동 라벨
10.6.1 이 장에서 배우는 것 / 선수 지식
10.5에서 Replicator의 생성 파이프라인 구조(씬→randomizer→trigger→render→annotator→writer)를 봤다. 이 장은 그 안에서 미뤄둔 두 핵심 — 데이터의 다양성을 만드는 도메인 랜덤화 전략과, 데이터의 라벨을 만드는 자동 라벨(annotator) — 을 실습으로 깊이 판다. 10.5이 "데이터 공장의 조립 라인"이라면, 이 장은 "무엇을·얼마나 흔들어 다양성을 만들고, 어떤 GT를 어떻게 정확히 추출하는가"다. Sim2Real 전이의 전략은 10.7, 디지털트윈은 10.8.
핵심 통찰: 합성데이터의 가치는 "양"이 아니라 "다양성 × 라벨 품질"이고, 그 둘이 도메인 랜덤화와 annotator다. 같은 장면 100만 장은 1장과 다름없다 — 도메인 랜덤화가 조명·재질·시점·배경을 흔들어 모델이 표면(외형)이 아닌 본질(과제 내용) 을 배우게 한다(Sim2Real 좁힘). 동시에 annotator가 픽셀마다 정답(분할·박스·깊이·법선·3D·amodal)을 자동·완벽하게 추출하되 — 가림·tight 박스·정렬 같은 함정을 다뤄야 라벨이 실질적 쓸모 있다. "보기 좋은 데이터"가 아니라 "다양하고 정확히 라벨된 데이터"가 인지 모델(9.7~9.9)을 실세계로 데려간다. 단 DR도 라벨도 Sim2Real을 좁히되 보장하지 않는다(10.7) — 검증이 필수.
배우는 것:
- DR 원리·시각판 — 불변(invariance) 학습, 무엇을(조명·재질·시점·배경) 흔드나, 9.14(물리 DR)와 차이.
- 얼마나·어떻게 — 분포(uniform·normal·choice·scatter), 구조적 vs 비구조적 DR, realism↔diversity 균형.
- 자동 라벨(annotator) — GT 종류(분할·2D/3D 박스·깊이·법선·amodal·LiDAR)와 인지 과제별 쓰임.
- 라벨 정확성 — 가림(occlusion)·tight 박스·정렬·가시성, 라벨 검증(시각·통계).
- 균형·연결 — diversity×realism×label quality, 센서 노이즈, 합성+실 혼합, 학습 검증.
선수 지식: 10.5(Replicator 파이프라인·결정성·스케일)·9.11(RTX 센서·완벽 GT)·9.12·9.14(도메인 랜덤화 개요·물리 DR)·10.2(RTX 렌더·MDL)·10.3·10.4(USD·semantics). 인지 과제(검출·분할·깊이)·모델 학습은 가정(BK-02). Sim2Real 전이(이전·sysID·미세조정)는 10.7, 디지털트윈은 10.8. 이 장은 10.5의 직접 연속(파이프라인 → 다양성·라벨).
정직: Replicator의 randomizer·annotator·writer API·지원 GT 종류는 릴리스 의존이 크다. 이 장은 "도메인 랜덤화 전략(무엇·얼마나·구조)과 자동 라벨의 종류·정확성·검증의 원리·실습"을 가르치고, 구체 API·annotator명·포맷은 "그 릴리스 문서로 확인". 코드는 개념 골격. 도메인 랜덤화·합성 라벨은 Sim2Real을 좁히되 보장하지 않는다(10.7) — 범위·realism은 과제 의존이라 실데이터로 검증해야 하고, "DR만 키우면 다 된다"는 환상임을 정직하게 둔다. 랜덤화 범위·효과 수치는 개략·출발점.
10.6.2 도메인 랜덤화 — 왜·원리 (시각판)
도메인 랜덤화(domain randomization) 는 합성데이터로 학습한 모델이 실세계로 넘어가게 하는 핵심 기법이다. 9.12·9.14에서 맛봤고, 여기선 비전 인지 데이터 관점으로 깊이.
원리는 무관한 것을 흔들어 본질을 배우게 하는 것이다.
| 측면 | 고정된 시뮬(랜덤화 없음) | 무작위 시뮬(도메인 랜덤화) |
|---|---|---|
| 외형 | 항상 같은 조명·재질·배경 | 조명·재질·배경·시점이 매번 다름 |
| 모델 학습 | "이 외형"에 과적합 | 변하는 표면을 무시하고 "객체란 무엇인가"(본질)를 배움 |
| 실세계 | 다른 외형서 취약(갭) | "또 하나의 변형"처럼 보여 일반화 |
흔드는 것(무관 — 외형): 조명·재질·색·배경·시점·노이즈. 안 흔드는 것(본질 — 과제): 객체의 형태 클래스, 라벨의 의미.
- 불변(invariance) 학습: 모델은 보상/손실을 줄이도록 배운다 — 학습 데이터에서 변하는 것은 무시하고 불변인 것(과제 신호) 에 의존하게 된다. 외형(조명·재질)을 크게 흔들면 모델은 그것을 무시하고 객체의 형태·본질을 배운다 → 실세계(또 다른 외형 분포)도 견딘다.
- 왜 고정 시뮬이 위험한가: 시뮬을 한 모습으로 고정해 학습하면 모델이 그 특정 외형(이 조명·이 텍스처)에 과적합 → 실세계의 다른 외형에서 무너진다(Sim2Real 갭 10.7). 랜덤화가 이 과적합을 깬다.
- 9.14(물리 DR)와 차이: 9.14는 제어/RL을 위한 물리·동역학 랜덤화(마찰·질량·게인·지연) — 동역학 갭을 좁힌다. 이 장(10.6)은 비전 인지를 위한 시각 랜덤화(조명·재질·시점·배경) — 외형(appearance) 갭을 좁힌다. 같은 원리(무관을 흔들어 본질 학습), 다른 대상(물리 vs 시각). 비전+제어 둘 다면 둘 다 랜덤화.
- DR vs 도메인 적응(domain adaptation): DR은 "시뮬을 다양하게 해 실세계를 포함"하는 접근. 대안인 도메인 적응(GAN으로 시뮬→실 변환, 특징 정렬)도 있으나, DR이 단순·강건해 널리 쓰인다(둘을 결합도). 심화 10.7.
핵심: 시각 도메인 랜덤화는 조명·재질·시점·배경(무관한 외형)을 흔들어 모델이 형태·본질(과제) 을 배우게 한다 — 고정 시뮬의 외형 과적합을 깨 Sim2Real(비전)을 좁힌다. 9.14(물리 DR — 동역학)와 같은 원리, 다른 대상(시각 — 외형). 비전 인지 데이터의 핵심 전략. DR도 갭을 좁히되 보장 못 함(10.7).
10.6.3 무엇을 흔드나 — 시각 랜덤화의 레퍼토리
비전 인지 데이터에서 흔드는 시각 요소의 레퍼토리(USD 프림·속성·렌더를 변형, 10.3·10.5).
시각 랜덤화 레퍼토리:
조명(lighting) — 방향·세기·색온도·라이트 수·HDRI 환경맵(실내/실외/시간대)
재질(material) — 색·거칠기·금속성·랜덤 텍스처(MDL 10.2)·반사
객체(object) — 위치·자세(회전)·개수·스케일·on-surface scatter(표면에 흩뿌림)
카메라(camera) — 자세·시점·FOV·초점·노출·롤
배경·방해물 — 배경 교체·distractor(방해 물체)·clutter·가림 유발
센서 효과(sensor) — 노이즈·블러(모션·초점)·왜곡·색수차·해상도(현실적 불완전성)
안 흔드는 것: 대상 객체의 형태 클래스(본질)·라벨 의미·물리 법칙(타당성)
- 조명(가장 중요한 축 중 하나): 방향·세기·색·라이트 수, HDRI 환경맵(실제 환경 조명을 360° 이미지로 — 실내·실외·시간대를 일괄 교체). 조명이 비전 외형을 크게 정하니(그림자·반사 10.2), 조명 다양성이 핵심. RTX 전역조명(10.2)이 사실적으로.
- 재질(material, MDL 10.2): 색·거칠기·금속성·랜덤 텍스처(임의 이미지를 표면에). 재질을 흔들면 모델이 텍스처가 아닌 형태에 의존. MDL로 물리 기반·이식 가능(10.2).
- 객체 배치: 위치·자세(회전)·개수·스케일. on-surface scatter(테이블 위에 물체를 무작위로 흩뿌림 — 자연스러운 배치)·물리 드롭(PhysX로 떨어뜨려 자연스러운 더미). 다양한 구성·가림.
- 카메라·시점: 시점·각도·거리·FOV·노출·롤. 모델이 특정 시점에 과적합 안 하게. 로봇·자율주행은 실제 카메라 범위 내에서.
- 배경·방해물(distractor): 배경 교체·무관한 방해 물체(clutter)·가림 유발 → 모델이 대상을 배경·방해물과 구분하고 부분 가림에 강건.
- 센서 효과(realism): 노이즈·모션 블러·왜곡·롤링셔터·노출 변화 — 실센서의 불완전성(9.11). "지나치게 이상적인" 데이터(10.5)를 실센서에 가깝게 → 갭↓.
견해: 시각 랜덤화는 조명(HDRI·방향·색)·재질(MDL·텍스처·색)·객체(위치·자세·scatter)·카메라(시점·FOV·노출)·배경/방해물·센서 효과(노이즈·블러) 를 흔든다 — 외형의 모든 무관 축을. 조명·재질·배경이 외형을 크게 정하니 핵심이고, 센서 효과가 "지나친 이상화"(10.5)을 실센서에 가깝게. 대상 형태 클래스·물리 타당성은 유지. RTX(10.2)·MDL이 사실적 변형을.
10.6.4 얼마나·어떻게 — 분포·구조적 vs 비구조적
"무엇을"보다 어려운 것은 "얼마나·어떻게" 다 — 분포 선택과 구조적/비구조적 DR의 갈림.
분포(distribution) — 어떻게 흔드나:
uniform(a,b) — 균등(범위 내 고르게): 위치·각도·세기
normal(μ,σ) — 정규(중심 근처 많이): 현실적 변동
choice([...]) — 이산 선택: 텍스처·HDRI·자산 세트
scatter_2d/3d — 표면·공간에 흩뿌림: 자연스러운 배치
비구조적(unstructured/uniform) DR vs 구조적(structured) DR:
비구조적: 모든 것을 크게·무작위(물체가 공중에 떠도, 색이 형광이어도)
+ 단순·강건, 갭을 "덮어버림" − 비현실적·학습 어려움·낭비
구조적: 씬 구조는 현실적으로 유지하되 그 안에서 랜덤화
(차는 도로 위에·물체는 테이블 위에·조명은 그럴듯하게)
+ 현실적·효율적·하류 분포에 가까움 − 설계 노력↑
- 분포 선택: uniform(고르게 — 위치·각도), normal(중심 근처 — 현실적 변동), choice(이산 — 텍스처·HDRI·자산 세트 중 선택), scatter(표면·공간 흩뿌림). 무엇을 흔드느냐에 맞는 분포를.
- 비구조적 DR(고전): 모든 것을 크게·무작위(물체가 공중에 떠도, 색이 형광이어도 OK — Tobin et al. 고전 도메인 랜덤화). 시뮬이 너무 다양해져 실세계가 그 분포 안에 포함되길 기대. 단순·강건하나 비현실적·학습 난이도↑·낭비(쓸데없이 어려운 데이터).
- 구조적 DR(structured domain randomization): 씬 구조는 현실적으로 유지하되 그 안에서 랜덤화 — 차는 도로 위에·물체는 테이블 위에·조명은 그럴듯하게. 비구조적보다 현실적·효율적(하류 실분포에 가까운 데이터)이나 설계 노력이 든다(구조 정의). NVIDIA의 "Structured Domain Randomization" 등.
- 얼마나(범위) — 9.14와 같은 딜레마: 너무 좁으면 과적합(갭 안 닫힘), 너무 넓으면 학습 어려움·비현실. 적정은 실세계 변동을 덮되 학습 가능. 점진·ADR(9.14 — 좁게 시작해 확대)도 적용 가능.
- realism ↔ diversity 균형: 다양성(많이 흔듦)과 현실성(그럴듯함) 사이. 구조적 DR이 둘을 어느 정도 화해 — 구조는 현실적, 그 안은 다양. 과제·갭에 따라 균형.
견해: DR의 기술은 분포(uniform·normal·choice·scatter) 선택과 비구조적 vs 구조적의 갈림이다. 비구조적(모든 것을 크게·비현실 허용)은 단순·강건하나 낭비·학습난이도, 구조적(씬 구조 유지·그 안 랜덤화) 은 현실적·효율적이나 설계 노력. realism↔diversity 균형이 핵심 — 구조적 DR이 둘을 화해. 범위는 9.14처럼 과적합↔학습불가 사이, 점진·ADR로. 과제·갭에 맞춰 — 정답은 검증(10.7).
10.6.5 자동 라벨(annotator) — GT의 종류
데이터의 다른 절반은 라벨이다. annotator가 시뮬의 완벽한 GT를 종류별로 추출한다(9.11·10.5). 인지 과제별로 필요한 GT가 다르다.
| GT 종류 | 내용 | 인지 과제 |
|---|---|---|
| RGB | 입력 이미지 | — |
| semantic seg | 픽셀별 클래스("도로"·"차"·"사람") | 의미 분할 |
| instance seg | 픽셀별 객체 ID(차1·차2 구분) | 인스턴스 분할·검출 |
| 2D bbox(tight/loose) | 객체 2D 박스 | 객체 검출 |
| 3D bbox(oriented) | 3D 방향 박스(위치·크기·자세) | 3D 검출(자율주행 8.14) |
| depth | 픽셀별 거리(카메라/평면) | 깊이 추정·nvblox(9.9) |
| surface normals | 픽셀별 표면 법선 | 형상·기하 |
| motion/optical flow | 픽셀 이동 | 모션·추적 |
| amodal | 가려진 부분 포함 전체 형태 | 가림 추론(실세계 불가능) |
| pointcloud/LiDAR | 3D 점·LiDAR 반환(9.11) | 3D 인지·매핑 |
- 분할(semantic·instance): semantic은 픽셀별 클래스("이 픽셀은 차"), instance는 픽셀별 객체 ID("이 픽셀은 차1, 저것은 차2"). 클래스는 USD semantics(10.3·10.5 — 자산에 부여한 의미 라벨)에서. 의미 분할·인스턴스 분할·검출 모델의 타깃.
- 바운딩 박스(2D·3D): 2D bbox(이미지 박스 — 검출), 3D oriented bbox(3D 공간의 방향 박스 — 위치·크기·자세, 자율주행 3D 검출 8.14). 3D 박스는 실세계서 정밀 라벨 어려운데(10.5 "불가능 GT") 시뮬은 정확.
- 깊이(depth): 픽셀별 거리(카메라까지 또는 이미지 평면까지) — 깊이 추정·스테레오·nvblox(9.9) 학습. 실세계 정밀 깊이 GT 어려움 → 합성의 강점.
- 법선·모션·amodal·LiDAR: 표면 법선(기하), 모션 벡터(추적), amodal(가려진 부분 포함 전체 — 실세계 불가능, 가림 추론 학습), LiDAR 포인트(9.11 — 3D 인지). 시뮬만이 줄 수 있는 GT들.
- 과제가 GT를 정한다: 검출=2D/3D bbox+instance, 분할=semantic/instance, 깊이=depth, 3D 인지=3D bbox+pointcloud. 필요한 annotator만 켜(불필요한 것은 비용).
견해: annotator는 인지 과제별 완벽한 GT를 추출한다 — 분할(semantic 클래스·instance ID)·바운딩 박스(2D·3D oriented)·깊이·법선·모션·amodal·LiDAR. 클래스는 USD semantics(10.3) 에서. 3D 박스·깊이·amodal·법선은 실세계서 정밀 라벨 불가능한데(10.5) 시뮬은 정확 — 합성의 결정적 강점. 과제가 어떤 GT를 켤지 정한다(검출=bbox, 분할=seg, 깊이=depth).
10.6.6 라벨 정확성 — 가림·tight 박스·검증
합성 라벨이 "완벽"하다지만, 자동 라벨에도 함정이 있다 — 가림·tight 박스·정렬을 안 다루면 라벨이 오히려 모델을 해친다.
라벨 정확성의 함정:
가림(occlusion):
· 객체가 다른 것에 가려짐 → 박스·마스크를 어떻게? (보이는 부분만? 전체?)
· 가시성(visibility) 임계: 5%만 보이는 객체도 라벨? → 노이즈
· semantic/instance seg는 가시 픽셀만, bbox는 정책 선택
tight vs loose 2D bbox:
· tight(보이는 픽셀에 딱) vs loose(객체 전체 투영) → 가림 시 큰 차이
· 학습 타깃과 일치해야(검출 모델이 기대하는 박스 정의)
정렬·좌표:
· 라벨이 이미지와 픽셀 정렬되나(annotator·writer 좌표·해상도)
· 3D 박스가 카메라·월드 좌표 맞나
검증(필수): 라벨을 이미지 위에 그려 눈으로·통계로 확인
- 가림(occlusion) — 가장 까다로움: 객체가 가려지면 박스·마스크를 어떻게? 가시성 임계(예: 10% 미만 보이면 라벨 제외)를 정해야 — 안 그러면 거의 안 보이는 객체도 라벨해 노이즈. instance/semantic seg는 보이는 픽셀만, 2D bbox는 tight(보이는 부분) vs loose/amodal(전체) 정책 선택. 실세계 라벨 관행·학습 모델과 맞춰야.
- tight vs loose 박스: tight(보이는 픽셀에 정확히 맞는 박스)와 loose/amodal(객체 전체 투영, 가린 부분 포함)는 가림 시 크게 다르다. 검출 모델이 어느 정의를 기대하나에 맞춰야(불일치면 학습 혼란). Replicator는 tight/loose annotator 구분 제공.
- 정렬·좌표: 라벨이 이미지와 픽셀 정렬되나(annotator·writer 좌표·해상도·뒤집힘), 3D 박스가 카메라·월드 좌표 맞나 — 어긋나면 라벨이 틀림. writer 설정·좌표계 확인.
- 검증이 필수: "완벽한 라벨"을 믿지 말고 반드시 시각 검증 — 라벨(박스·마스크·깊이)을 이미지 위에 그려 눈으로(샘플), 통계(클래스 분포·박스 크기·가시성)로. 정렬·가림·tight 정책이 의도대로인지. 자동 라벨이라도 정책·설정 오류는 흔하다.
- 가림 정보 활용: 시뮬은 가시성·가림 정도를 안다 → 학습에 가시성 메타데이터를 주거나 임계로 필터. 실세계 라벨이 못 주는 풍부함.
견해: 합성 라벨이 "완벽"이라도 가림·tight 박스·정렬 정책을 안 다루면 노이즈가 된다 — 가시성 임계(거의 안 보이는 객체 제외)·tight vs loose(검출 모델 기대와 일치)·픽셀/좌표 정렬을 정해야. "자동 라벨 = 검증 불필요"가 가장 큰 함정 — 라벨을 이미지 위에 그려 시각·통계 검증이 필수. 시뮬은 가시성·가림을 알아 실세계 라벨보다 풍부하되, 그 정책을 올바로 써야.
10.6.7 워크스루 — DR + annotator 파이프라인·라벨 검증
DR(다양성)과 annotator(라벨)를 엮고 라벨을 검증하는 흐름(10.5 파이프라인 위에).
# DR + annotator 파이프라인(개념 — API는 릴리스 의존, 반드시 확인)
import omni.replicator.core as rep
camera = rep.create.camera()
rp = rep.create.render_product(camera, (1024, 1024))
# 대상 + 방해물 + 의미 라벨(USD semantics 10.3)
parts = rep.create.from_usd("./assets/parts/*.usd", semantics=[("class","part")])
table = rep.create.from_usd("./assets/table.usd")
with rep.trigger.on_frame(num_frames=20000):
# ── 도메인 랜덤화(10.6.3·10.6.4) ──
# 조명: HDRI 환경 교체 + 세기(현실적 분포)
rep.randomizer.lights(intensity=rep.distribution.normal(1000, 300))
rep.create.light(light_type="Dome",
texture=rep.distribution.choice(["./hdri/indoor1.hdr","./hdri/indoor2.hdr"]))
# 재질: 색·거칠기(MDL 10.2)
with parts:
rep.randomizer.materials(roughness=rep.distribution.uniform(0.1, 0.9))
# 객체: 테이블 위에 흩뿌림(구조적 DR — 떠다니지 않게, 10.6.4)
rep.modify.pose(position=rep.distribution.uniform((-0.5,-0.5,0.8),(0.5,0.5,0.8)),
rotation=rep.distribution.uniform((0,0,0),(360,360,360)))
# 카메라: 시점(현실적 범위)
rep.modify.pose(camera, position=rep.distribution.uniform((-1,-1,1),(1,1,2)),
look_at=parts)
# ── annotator(GT 10.6.5) + writer ──
writer = rep.WriterRegistry.get("BasicWriter")
writer.initialize(output_dir="/data/parts",
rgb=True,
bounding_box_2d_tight=True, # tight 박스(가림 다룸 10.6.6)
semantic_segmentation=True,
instance_segmentation=True,
distance_to_camera=True, # 깊이
bounding_box_2d_loose=False) # loose는 안 씀(과제가 tight 기대)
writer.attach([rp])
rep.orchestrator.run()
# 라벨 검증 — 반드시(10.6.6)
# 1) 시각 검증: 샘플 이미지에 박스·마스크를 그려 정렬·가림 확인
import json, cv2, numpy as np
img = cv2.imread("/data/parts/rgb_0000.png")
boxes = json.load(open("/data/parts/bbox_2d_tight_0000.json"))
for b in boxes:
cv2.rectangle(img, (b['x_min'],b['y_min']), (b['x_max'],b['y_max']), (0,255,0), 2)
cv2.imwrite("check_0000.png", img) # 눈으로: 박스가 객체에 맞나·가림 처리 OK?
# 2) 통계 검증: 클래스 분포·박스 크기·가시성·빈 프레임 비율
체크포인트:
· 라벨이 이미지와 정렬·가림 정책 OK(시각 검증) — 10.6.6
· 다양성 충분(조명·재질·시점·배경 — 샘플 검토) — 10.6.3·10.6.4
· 구조적(테이블 위, 안 떠다님) — 비구조적이면 비현실
· tight/loose가 학습 모델 기대와 일치
· 클래스 분포·가시성 통계가 의도대로(불균형·노이즈 없나)
→ 학습(TAO/PyTorch 10.5) → 실데이터 일부로 검증·미세조정(10.7)
- DR과 annotator를 한 파이프라인에: trigger 루프 안에서 randomize(다양성) + annotator(라벨) 가 함께 — 매 프레임 변형된 씬의 GT를 캡처. 구조적 DR(테이블 위 scatter)로 현실적 다양성.
- 라벨 검증이 핵심 단계: 생성 후 반드시 샘플에 박스·마스크를 그려 눈으로 + 통계로. "자동이니 맞겠지"가 함정(10.6.6) — 가림·정렬·tight 정책·빈 프레임을 확인.
- 다양성 점검: 생성 샘플을 검토해 조명·재질·시점이 충분히 다른지(같은 장면 반복이면 DR 부족). 양보다 다양성(10.5).
- 학습·혼합(10.7): 검증된 데이터로 학습(TAO/PyTorch 10.5) → 실데이터 일부로 검증·미세조정(합성+실, 10.7). 합성만 믿지 말고 실세계 성능 확인.
견해: 실습은 DR(조명·재질·객체 scatter·카메라 — 구조적·현실적 분포) + annotator(tight 박스·분할·깊이) + writer 를 한 파이프라인에 엮고, 반드시 라벨을 시각·통계 검증하는 것. "자동 라벨 = 맞겠지"가 가장 큰 함정 — 박스·마스크를 이미지에 그려 가림·정렬·tight 정책을 확인. 다양성도 샘플로 점검(양보다 다양성). 검증된 데이터로 학습 후 실데이터로 미세조정·검증(10.7).
10.6.8 중간 점검 (체크포인트)
- [ ] 도메인 랜덤화가 무관한 외형을 흔들어 본질을 배우게(불변 학습) Sim2Real을 좁히고, 9.14(물리 DR)와 대상이 다름을 안다.
- [ ] 무엇을 흔드나(조명·HDRI·재질·MDL·객체·카메라·배경·센서 효과)의 레퍼토리를 안다.
- [ ] 분포(uniform·normal·choice·scatter)와 구조적 vs 비구조적 DR, realism↔diversity 균형을 안다.
- [ ] annotator GT 종류(분할·2D/3D 박스·깊이·법선·amodal·LiDAR)와 과제별 쓰임, 불가능 GT(3D·amodal·깊이)를 안다.
- [ ] 라벨 정확성 함정(가림·tight/loose·정렬·가시성)과 반드시 검증(시각·통계)함을 안다.
- [ ] DR+annotator를 엮어 다양하고 정확히 라벨된 데이터를 만들고 합성+실 혼합·검증(10.7)함을 안다.
증상→의심: 모델이 실세계서 취약 → DR 부족(다양성)·비현실 DR·센서 노이즈 없음 → 랜덤화·realism·노이즈(10.7). 라벨이 객체와 안 맞음 → annotator 정렬·좌표·해상도·뒤집힘 → 시각 검증·writer 설정. 가려진 객체 라벨이 이상 → 가시성 임계·tight/loose 정책 → 정책 정의(10.6.6). 데이터가 비슷비슷 → DR 범위 좁음·자산 적음 → 범위·HDRI·자산↑. 물체가 공중에 떠 비현실 → 비구조적 DR → 구조적(scatter on surface, 10.6.4). 클래스 불균형 → 자산·랜덤화 편향 → 균형 제어. 학습은 되는데 검증 못함 → 실데이터 없음 → 일부 실데이터로 검증(10.7).
10.6.9 트레이드오프·대안
| 결정 | 트레이드오프 |
|---|---|
| 비구조적 DR vs 구조적 DR | 단순·강건·갭 덮음 vs 현실적·효율·설계 노력 |
| 강한 DR vs 약한 DR | 일반화·갭↓ vs 학습 용이·고성능(과적합) |
| 다양성 vs 현실성 | 넓은 분포 vs 그럴듯함(구조적이 화해) |
| tight bbox vs loose/amodal | 보이는 부분 vs 전체(과제·모델 기대) |
| 많은 annotator vs 필요한 것만 | 풍부한 GT vs 생성 비용·스토리지 |
| DR vs 도메인 적응(GAN) | 단순·강건 vs 실데이터 활용·복잡 |
견해: 합성데이터의 실전 성패는 "DR 다양성 × 라벨 정확성" 이다 — 다양성 없으면 과적합(갭), 라벨 부정확하면 학습 오염. 구조적 DR이 realism↔diversity를 화해해 보통 효율적(차는 도로 위·물체는 테이블 위, 그 안 랜덤화)이나 설계 노력. 라벨은 가림·tight 정책을 학습 모델과 맞추고 반드시 검증. 합성+실 혼합(10.7)이 최선 — DR로 좁히고 실데이터로 검증·보정. DR만 키운다고 갭이 닫히지 않고(과보수·비현실), 라벨이 자동이라고 맞는 것이 아니다(검증 필수). 효과는 과제 의존 — 실세계로 검증(10.7).
비엔비디아 정직: 도메인 랜덤화·합성 라벨은 학계·업계 공통이다 — 비구조적 DR(Tobin et al. 2017), 구조적 DR(NVIDIA 등), 도메인 적응(GAN·CycleGAN sim2real), 그리고 합성데이터 도구(Unity Perception·BlenderProc·Kubric 10.5)가 같은 기법을 쓴다. Replicator의 강점은 RTX 충실도(현실적 DR)·MDL(재질)·정밀 멀티 annotator(분할·3D·amodal·법선 동시)·USD·스케일이다 — 기법 자체는 NVIDIA 고유가 아니다. DR vs 도메인 적응은 상보적(결합도). 효과(갭 축소·라벨 유용성)는 과제·랜덤화·혼합·검증 의존이라 보장 없음 — 자기 과제·실데이터로 검증(시뮬 성공≠실세계, 10.7).
10.6.10 흔한 함정
- DR 없이/약하게. 외형 과적합 → 실세계 취약 → 조명·재질·시점·배경 충분히 흔들기(10.6.3).
- 다양성 없이 대량. 같은 장면 반복은 무의미 → 양보다 다양성(10.5·10.6).
- 비구조적 DR 남용. 물체가 떠다니고 비현실 → 구조적 DR(씬 구조 유지, 10.6.4).
- 자동 라벨 검증 생략(최대 함정). 가림·정렬·tight 오류를 모름 → 시각·통계 검증(10.6.6).
- 가림·tight 정책 미정의. 가려진 객체 라벨이 노이즈 → 가시성 임계·tight/loose 정책(10.6.6).
- 센서 노이즈 없음. "지나치게 이상적" → 실센서서 취약 → 노이즈·블러·왜곡(9.11·10.6).
- 클래스 불균형 방치. 자산·랜덤화 편향 → 균형 제어(10.5).
- 불필요한 annotator 다 켬. 생성 비용·스토리지 낭비 → 과제에 필요한 GT만(10.6.5).
- 라벨 포맷·tight 정의가 학습 모델과 불일치. 학습 혼란 → 모델 기대와 정합.
- 시뮬 성공을 실세계로 단정. DR·라벨도 보장 없음 → 실데이터 검증·미세조정(10.7).
10.6.11 연습문제
연습 1 (원리·시각판). 도메인 랜덤화의 원리(불변 학습)를 설명하고, 비전 인지 데이터에서 무엇을 흔드는지, 9.14(물리 DR)와 무엇이 같고 다른지 답하라.
정답
원리(불변 학습): 모델은 손실을 줄이도록 배운다 — 학습 데이터에서 변하는 것은 무시하고 불변인 것(과제 신호) 에 의존하게 된다. 시뮬을 한 모습으로 고정하면 모델이 그 특정 외형(이 조명·텍스처)에 과적합 → 실세계(다른 외형)서 무너짐(Sim2Real 갭). 외형을 크게 무작위로 흔들면 모델은 변하는 표면(조명·재질·배경)을 무시하고 불변인 본질(객체의 형태·과제) 을 배운다 → 실세계도 "또 하나의 변형"처럼 보여 일반화. 즉 "특정 도메인에 맞추기"가 아니라 "도메인 변화에 불변인 특징 배우기". 비전 인지에서 흔드는 것: 조명(방향·세기·색·HDRI 환경맵), 재질(색·거칠기·금속성·랜덤 텍스처 MDL 10.2), 객체(위치·자세·개수·scatter), 카메라(시점·FOV·노출), 배경·방해물(distractor·가림), 센서 효과(노이즈·블러·왜곡). 안 흔드는 것: 대상 객체의 형태 클래스(컵은 컵 모양)·라벨 의미·물리 타당성. 9.14(물리 DR)와 같은 점: 원리가 동일 — 무관한 것을 흔들어 불변(본질)을 배우게 해 Sim2Real을 좁힌다. 범위 딜레마(좁으면 과적합/넓으면 학습불가)·ADR(점진 확대)도 공통. 다른 점: 대상이 다르다. 9.14는 제어/RL을 위한 물리·동역학 랜덤화(마찰·질량·드라이브 게인·액추에이터 지연) — 동역학 갭(시뮬 물리≠실물리)을 좁힌다. 10.6은 비전 인지를 위한 시각 랜덤화(조명·재질·시점·배경) — 외형 갭(시뮬 영상≠실영상)을 좁힌다. 즉 제어 정책은 다양한 물리에, 인지 모델은 다양한 외형에 강건하게. 둘 다 필요한 경우(비전 기반 RL·로봇): 물리(9.14)와 시각(10.6) 둘 다 랜덤화 — 정책이 다양한 물리에서, 인지가 다양한 외형에서 견디게. 핵심: 같은 불변 학습 원리, 물리(동역학) vs 시각(외형)이라는 다른 대상. 둘 다 갭을 좁히되 보장 못 함(10.7).
연습 2 (구조적 vs 비구조적). 비구조적 DR과 구조적 DR의 차이를 설명하고 각각의 장단점·언제 쓰는지, realism↔diversity 균형을 어떻게 맞추는지 답하라.
정답
비구조적(unstructured/uniform) DR: 모든 것을 크게·완전 무작위로 흔든다 — 물체가 공중에 떠도, 색이 형광이어도, 배경이 비현실이어도 OK(고전 도메인 랜덤화, Tobin et al.). 시뮬을 극도로 다양하게 만들어 실세계가 그 분포 안에 포함되길 기대(실세계도 "또 하나의 무작위 변형"). 장점: 단순(구조 설계 불필요)·강건(갭을 "덮어버림")·빠른 시작. 단점: 비현실적(실분포와 멀어 낭비)·학습 난이도↑(쓸데없이 어려운 데이터)·일부는 절대 안 나올 구성까지 학습. 구조적(structured) DR: 씬 구조는 현실적으로 유지하되 그 안에서 랜덤화 — 차는 도로 위에·물체는 테이블 위에(공중 부양 X)·조명은 그럴듯한 범위에·배치는 물리적으로 타당하게. NVIDIA의 "Structured Domain Randomization" 등. 장점: 현실적(하류 실분포에 가까운 데이터)·효율적(낭비 적음·학습 용이)·갭이 더 잘 닫힘(현실적 다양성). 단점: 설계 노력(씬 구조·제약 정의 — scatter on surface, 도로 위 차량 등). 언제: 빠른 프로토타입·구조 모르거나 극단 강건이 목표면 비구조적; 실분포·효율·현실적 데이터가 필요하면(대부분 프로덕션) 구조적. realism↔diversity 균형: 다양성(많이 흔듦, 일반화)과 현실성(그럴듯함, 효율) 사이의 긴장. 구조적 DR이 둘을 화해 — 구조(배치·물리)는 현실적, 그 안의 변동(조명·재질·색·시점)은 다양하게. 즉 "현실적 틀 안에서 다양화". 균형을 맞추는 법: ① 구조(배치·물리·조명 범위)는 실세계 타당하게 ② 그 안에서 무관 요소(색·텍스처·조명 세부·시점)는 크게 다양화 ③ 범위는 과적합↔학습불가 사이(9.14처럼 점진·ADR) ④ 실데이터로 검증(10.7)해 갭이 닫히는지·과보수 아닌지 확인. 너무 비현실(비구조적 과함)도, 너무 좁음(다양성 부족)도 나쁨. 핵심: 구조적 DR로 현실적 틀 안에서 다양화가 보통 효율적, 균형은 과제·갭으로·검증으로. 정직: 정답은 과제 의존, 실세계 검증 필수.
연습 3 (annotator 종류). annotator GT 종류를 들고 각각 어떤 인지 과제(검출·분할·깊이·3D)에 쓰이는지 매핑하고, "실세계서 불가능한 GT"가 무엇이며 왜 합성의 강점인지 답하라.
정답
GT 종류·과제 매핑: ① RGB — 입력 이미지(모든 과제). ② semantic segmentation(픽셀별 클래스 "도로"·"차"·"사람") → 의미 분할. ③ instance segmentation(픽셀별 객체 ID, 차1·차2 구분) → 인스턴스 분할·검출. ④ 2D bbox(tight/loose) → 객체 검출(2D). ⑤ 3D oriented bbox(위치·크기·자세) → 3D 검출(자율주행 8.14·로봇 파지). ⑥ depth(픽셀별 거리) → 깊이 추정·스테레오·nvblox 학습(9.9). ⑦ surface normals(픽셀별 법선) → 형상·기하 추정. ⑧ motion/optical flow(픽셀 이동) → 모션·추적. ⑨ amodal(가려진 부분 포함 전체 형태) → 가림 추론·완전 형태 예측. ⑩ pointcloud/LiDAR(3D 점·반환 9.11) → 3D 인지·매핑. 클래스 라벨은 USD semantics(10.3·10.5 — 자산에 부여한 의미)에서 자동. 과제가 GT를 정함: 검출=2D/3D bbox+instance, 분할=semantic/instance, 깊이=depth, 3D 인지=3D bbox+pointcloud+depth, 기하=normals. 필요한 것만 켜(비용·스토리지). 실세계 불가능한 GT(합성의 강점): ① 정확한 깊이 — 실세계서 픽셀별 정밀 깊이는 LiDAR도 노이즈·희소·정합 어려움; 시뮬은 픽셀마다 정확. ② 3D oriented bbox — 실세계 3D 박스 라벨은 LiDAR+수동으로 비용이 크고 부정확; 시뮬은 객체 자세를 정확히 앎. ③ amodal(가려진 전체 형태) — 가려진 부분을 사람이 라벨 불가(추측만); 시뮬은 전체 메시를 아니 정확. ④ 표면 법선 — 실세계 측정 곤란; 시뮬은 기하에서 정확. ⑤ 완벽한 분할 경계 — 사람 라벨은 경계 부정확; 시뮬은 픽셀 정확. 왜 강점인가: 이 GT들은 실세계서 물리적으로 측정 곤란하거나 비용이 크거나 부정확한데, 시뮬은 씬의 진실(geometry·자세·가림)을 완전히 알아 정확·자동·무료로 제공. 깊이·3D·amodal이 필요한 과제(자율주행 3D 검출, 로봇 파지, 깊이 추정)는 합성데이터가 거의 유일한 대량 GT 소스. 핵심: annotator가 과제별 GT를 추출하되, 특히 깊이·3D·amodal·법선 같은 "실세계 불가능 GT"가 합성의 결정적 가치(10.5). 단 라벨 정확성(가림·정렬 10.6.6)은 검증 필요.
연습 4 (라벨 정확성). 자동 라벨이 "완벽"하다는데 왜 검증이 필요한지, 가림·tight/loose 박스·정렬의 함정을 설명하고 라벨을 어떻게 검증하는지 답하라.
정답
왜 검증 필요(완벽한데도): 시뮬은 씬의 진실을 알아 GT가 "원리상 완벽"하나, annotator 정책·설정·좌표 선택에 따라 라벨이 의도와 다르거나 모델 학습에 부적합할 수 있다 — "자동이니 맞겠지"가 가장 큰 함정. 정책·설정 오류는 흔하고, 라벨이 틀리면 모델이 오염된다. 가림(occlusion) 함정: 객체가 다른 것에 가려지면 박스·마스크를 어떻게? ① 가시성 임계 — 5%만 보이는 객체도 라벨하면 노이즈(거의 안 보이는 것을 검출하라 강요). 임계(예: 10% 미만 제외)를 정해야. ② instance/semantic seg는 보이는 픽셀만 라벨하나, 2D bbox는 정책 선택 — tight(보이는 부분만)냐 loose/amodal(전체)냐. 가림 시 둘이 크게 다름. tight vs loose 박스 함정: tight(보이는 픽셀에 정확히 맞는 박스) vs loose/amodal(객체 전체 투영, 가린 부분 포함)는 가림 시 큰 차이. 검출 모델이 어느 정의를 기대하나에 맞춰야 — 모델은 tight 기대인데 loose 라벨이면 학습 혼란(박스가 객체보다 큼). Replicator는 tight/loose annotator 구분 제공, 학습 관행과 정합. 정렬·좌표 함정: 라벨이 이미지와 픽셀 정렬되나(해상도·뒤집힘·좌표 원점), 3D 박스가 카메라·월드 좌표 맞나 — annotator·writer 설정 오류로 어긋날 수. 검증 방법: ① 시각 검증(필수) — 샘플 이미지에 박스·마스크·깊이를 그려 눈으로: 박스가 객체에 맞나, 가림 처리 OK(가려진 객체 박스가 이상하지 않나), 마스크 경계, 정렬. 코드로 박스·마스크 오버레이(10.6.7). ② 통계 검증 — 클래스 분포(불균형?)·박스 크기 분포·가시성 분포·빈 프레임 비율·라벨 수/프레임. 이상치·노이즈 탐지. ③ 가림 메타 활용 — 시뮬은 가시성·가림 정도를 아니, 가시성 메타데이터로 필터·검증. 핵심: "자동 라벨 = 검증 불필요"가 최대 함정 — 반드시 시각·통계 검증으로 가림 정책·tight/loose·정렬이 의도·모델 기대와 맞는지 확인. 시뮬은 가시성·가림을 알아 실세계 라벨보다 풍부하되 그 정책을 올바로 써야 실질적으로 완벽. 검증 없는 대량 생성은 노이즈를 대량 생산할 수.
연습 5 (파이프라인·혼합). DR + annotator 파이프라인을 부품 검출 데이터로 설계하고, 라벨 검증과 다양성 점검을 어디에 넣으며, 합성+실 혼합·센서 노이즈를 어떻게 다루는지 답하라.
정답
파이프라인 설계(부품 검출): ① 씬·자산 — 부품 자산(USD)에 의미 라벨(semantics=[("class","part")], 10.3), 테이블·배경, 방해물(clutter). ② 구조적 DR(10.6.4) — trigger 루프(예 2만 장) 안에서: 조명(HDRI 환경 choice + 세기 normal — 현실적), 재질(색·거칠기 uniform, MDL 10.2), 객체(테이블 위에 scatter/물리 드롭 — 안 떠다니게 구조적, 위치·회전 uniform), 카메라(현실적 시점 범위 uniform), 방해물(가림 유발), 센서 노이즈(블러·노이즈). ③ annotator(10.6.5) — 검출이니 2D bbox tight(가림 다룸)·instance segmentation(필요시), 가시성 임계 설정. 불필요한 GT(법선 등)는 끔(비용). ④ writer — KITTI/COCO(검출 학습 포맷) → 디스크. 라벨 검증 위치(생성 후 필수, 10.6.6): 생성 직후 샘플(예 100장)에 박스를 그려 시각 검증 — 박스가 부품에 맞나, 가려진 부품 박스 OK, 정렬. + 통계(클래스 분포·박스 크기·가시성·빈 프레임). 이상하면 annotator 정책·writer 설정 수정 후 재생성. 다양성 점검 위치(생성 후): 샘플을 검토해 조명·재질·시점·배경이 충분히 다른지 — 비슷비슷하면 DR 범위·HDRI·자산↑(양보다 다양성 10.5). 센서 노이즈 처리: 부품 영상이 "지나치게 이상적"이면 실카메라(노이즈·블러·왜곡·노출 변화)서 취약 → DR에 센서 효과(가우시안 노이즈·모션/초점 블러·왜곡·노출 jitter) 추가해 실센서에 가깝게(9.11). 합성+실 혼합(10.7): ① 합성으로 대량·다양·완벽 라벨 사전학습 → ② 실데이터 일부(소량이라도)로 검증·미세조정 — 합성은 규모·롱테일·완벽 라벨, 실은 실제 분포·최종 검증. 비율은 과제 의존(외형 다양성 큰 부품은 실 비중↑). ③ 실세계 성능으로 검증 — 합성만의 성능을 믿지 말고 실 테스트셋으로(시뮬 성공≠실세계). ④ 플라이휠(10.5·8.14) — 실패 부품·조건을 DR·자산에 반영해 타깃 재생성. 전체 흐름: 구조적 DR(다양성·현실성) + tight annotator(검증된 라벨) + 센서 노이즈(realism) → 검증(시각·통계·다양성) → 학습(TAO 10.5) → 실데이터 미세조정·검증(10.7) → 플라이휠. 핵심: 다양성(DR)·라벨 정확성(annotator+검증)·realism(센서 노이즈)·실혼합·검증이 함께. 정직: 효과는 실세계로 검증, DR·라벨 보장 없음.
10.6.12 요약 · 다음 장
- DR 원리(시각판): 무관한 외형(조명·재질·시점·배경)을 흔들어 본질(형태·과제)을 배우게 → Sim2Real(외형) 좁힘. 9.14(물리 DR — 동역학)와 같은 원리·다른 대상. 비전+제어면 둘 다.
- 무엇·얼마나: 조명(HDRI)·재질(MDL)·객체(scatter)·카메라·배경·센서 효과(노이즈)를 분포(uniform·normal·choice·scatter)로. 구조적 DR(씬 구조 유지·그 안 랜덤화)이 realism↔diversity를 화해(비구조적은 단순·비현실).
- 자동 라벨(annotator): 분할(semantic·instance)·2D/3D 박스·깊이·법선·amodal·LiDAR. 깊이·3D·amodal·법선은 실세계 불가능 GT — 합성의 결정적 강점. 클래스는 USD semantics(10.3).
- 라벨 정확성: 가림·tight/loose·정렬·가시성 정책을 학습 모델과 맞추고 반드시 검증(시각·통계). "자동 라벨=검증 불필요"가 최대 함정.
- 균형·연결: 다양성 × 라벨 정확성 × realism. 센서 노이즈로 "지나치게 이상적" 회피. 합성+실 혼합·실세계 검증(10.7)·플라이휠(10.5·8.14). 정직: DR·라벨 보장 없음, 기법은 학계 공통, 실검증 필수.
다음 장: 10.7 Sim2Real과 도메인 갭. 합성데이터(10.5·10.6)·시뮬 학습(9.13·9.14)에서 반복한 "Sim2Real 갭" 을 정면으로 다룬다 — 갭이 어디서 오나(외형·동역학·내용), 좁히는 전략 전체(도메인 랜덤화·system identification·도메인 적응·실로봇 미세조정·teacher-student), 그리고 "얼마나 좁혀졌나"를 측정하는 법. 시뮬과 실세계를 잇는 다리를 한곳에.