Index
2026-09-14 — Analysis

Cycles photorealistic 렌더링 + SSIM/LPIPS 시각 정합 진단

R2S | 저장 시뮬레이션 상태의 real-vs-sim 시각 비교 파이프라인

TL;DR

0.628
wrist SSIM (최고)
0.297
ext2 SSIM (최저)
0.679
table coverage
15
matched pairs

1 배경 / 목적

Controller/physics 카드에서 joint-target replay가 물리적으로 그럴듯한 stack을 만들어도, 실제 real capture와 시각적으로 얼마나 유사한지는 완전히 별개의 질문이다. Real-to-sim gap을 정량화하려면 (1) MuJoCo 시뮬레이션 상태를 photorealistic하게 렌더링하고 (2) 그 결과를 실제 카메라 프레임과 지각적 지표로 비교하는 파이프라인이 필요했다. 기존 MuJoCo 자체 offscreen 렌더러는 텍스처/조명 품질이 낮아 Blender Cycles path-tracing으로 전환했다.

기존 한계: 초기 시도(job 125423)는 base worker 이미지에 libX11.so.6이 없어 bpy import 단계에서 실패했다. 또한 로봇/블록의 재질·텍스처는 관측된 텍스처가 없는 부분이 대부분이라 appearance 자체가 placeholder 수준이었다.

2 작업 내용

r2s/cycles_render.py는 완료된 saved-state manifest만 입력받아 XML SHA를 검증하고, saved qpos를 MuJoCo에 적용한 뒤 mj_forward만 호출(mj_step 없음)해 mesh vertex/face와 geom pose를 Blender로 옮긴다. 카메라 컨벤션은 OpenCV(+X right/+Y down/+Z forward)에서 Blender(+X right/+Y up/-Z forward)로 R_blender = R_cv @ diag(1,-1,-1) 변환을 적용했다. Appearance는 r2s.scene_textures(wrist frame-0 RGB+depth를 HSV ROI와 ±15mm depth 일치 조건으로 투영)로 만든 뒤, table_texture_fusion이 train rows 0/9/30만 fuse하고 rows 50/80/95/102는 holdout으로 남겨 테이블 UV 아틀라스 coverage를 0.60919→0.67947674로 끌어올렸다(job 125516, cleanup 125528에서 byte-identical 재확인).

Worker 환경 구축 과정에서 job 125423(libX11.so.6 누락) → personal runtime-only X/GL 번들(apt-get download + dpkg-deb -x, sudo 없이) 설치로 해결 → job 125435(NameError 수정) → job 125441(B200 CUDA smoke 확립) → job 125498(5개 키프레임, rows 9/50/80/95/102, 24초)까지 순차적으로 렌더 파이프라인을 안정화했다. 최종 canonical validation 렌더(job 125540)는 saved validation rows 8/30/50/70/86 × 3카메라 = 15개 matched 720p/128-sample pairs를 만들었고, actual-pair parent/appearance-geometry join/ancestor guard를 모두 검증했다. SSIM은 표준 Wang 방식(11×11 gaussian, sigma 1.5, K1=.01, K2=.03), LPIPS는 공식 richzhang/PerceptualSimilarity AlexNet eval 모드를 사용했다.

3 결과 (수치 필수)

카메라Canonical SSIM (job 125551)Canonical LPIPS (job 125552)비고
wrist 162917920.627846490.61492889최고 매칭, row-86 패널이 가장 근접
external 222460760.341512390.79525634appearance/geometry mismatch 존재
external 266382680.296974580.76546297texture hole·검은 배경 영향 큼

참고: 이전 full-frame 진단(job 125431, 애노테이션 배너 포함)은 SSIM wrist/ext1/ext2 = 0.438/0.069/0.048로 canonical 15-pair 점수가 이보다는 높지만, 이는 crop/마스크 방식 차이 때문이며 비교 기준이 다르다. Table texture fusion union coverage는 0.60919 → 0.67947674로 개선됐다.

실패/한계: robot 자체는 고정된 segmentation ROI가 없어 UNVERIFIABLE_NO_FIXED_ROBOT_SEGMENTATION_OR_JUSTIFIED_REGION으로 채점 불가하고, 물체 color ROI도 배경에 오염된 padded union box라 진짜 object-precision 게이트가 아니다. Texture hole과 검은 배경이 여전히 남아 있다.
스코어링 사고: 첫 scorer 시도(job 125455)는 padded row-key 008 vs 8 바인딩 불일치로 거부됐고, 수정 후 125551/125552로 재실행해 완료했다.

4 Takeaway

의미

wrist 카메라(SSIM 0.628)가 external 카메라들(0.30~0.34)보다 뚜렷하게 나은 것은, wrist appearance가 frame-0 실측 텍스처를 더 많이 활용하기 때문으로 보인다 — 반대로 external 카메라는 관측 안 된 배경/벽면 영역이 커서 검은 배경/placeholder 재질의 영향을 더 크게 받는다. SSIM/LPIPS 수치 자체는 아직 "정합됐다"고 부를 근거가 아니라, robot·object에 대한 진짜 ROI가 없는 상태의 diagnostic-only 지표다.

5 Next Steps

미해결 한계

Robot segmentation ROI 부재로 로봇 자체의 시각 정합은 전혀 측정할 수 없다. External 카메라가 담는 넓은 미관측 배경(벽/바닥/방)을 채울 방법이 없어 검은 배경 문제가 구조적으로 남아 있다.

다음 실험

Whole-scene snapshot 카드(별도)의 point cloud/mesh 결과를 Cycles appearance에 통합해 external 카메라의 배경 hole을 줄일 수 있는지 시도한다. Robot mesh에 대한 고정 segmentation mask를 MuJoCo geom ID 기반으로 생성해 robot-only SSIM/LPIPS를 별도로 채점하는 방법을 설계한다.