Index
2026-09-14 — Engineering

ZED SVO SDK 클러스터 통합 및 stereo export 파이프라인

R2S | pyzed 5.3.1 워커 배포 + full-res depth export

TL;DR

4
probe 실패
21
export 프레임
26s
최종 export 소요
62.996mm
실측 baseline

1 배경 / 목적

데이터 감사 카드에서 확정된 "0–102 bounded core"의 metric scale을 확보하려면 실제로 ZED SVO 파일을 SDK로 디코드해야 한다. 이전까지는 SDK import조차 시도하지 않은 INPUTS_VERIFIED_SDK_NOT_RUN 상태였다. 워커 pod은 driver-only 이미지라 ZED 네이티브 라이브러리와 캘리브레이션 파일 접근 자체가 인프라 문제였다.

기존 한계: pyzed는 official stereolabs/zed 도커 이미지 안에서만 검증된 CPython 3.10 wheel이고, 이미지의 SDK 디렉토리는 root:zed 0770이라 워커 UID(10010:3000)로는 읽을 수 없다. 워커에는 컨테이너 런타임도 없어(§13 클러스터 정책) 이미지를 그대로 쓸 수도 없다.

2 작업 내용

login에서 official 이미지를 CPU로 검사해 libsl_zed.so/libsl_ai.so를 SHA256 고정으로 추출한 뒤, private LD_LIBRARY_PATH prepend 방식으로 워커에 전달했다. 세 카메라의 factory calibration을 byte-for-byte 검증 후 private SN<serial>.conf로 준비(CURRENT_MANUFACTURER_NOT_2023_CAPTURE_TRUTH 라벨 유지). 배치는 scripts/probe_selected_svo.sbatch(1 GPU, 8 CPU, 64GiB, 15분)로 4회 반복 제출했다.

.venv-zed — Python 3.10.20 + official pyzed-5.3 wheel (전용 venv) libsl_zed.so — SHA256 3a8a51669cf259cc19f19be4ff6df2601f06e44b461cfbdb04db4637a47ec606 libsl_ai.so — SHA256 45a3447d2abb73846d9bb215b4e4e98a5260e3d94b701b2893a5010087745b3c image — stereolabs/zed@sha256:15575d927ffeab102fe2bf74af42c16093d2235e4d9e19946c667e39d67e6e67

이어서 scripts/export_selected_stereo.sbatch(1 GPU, --qos=own, 15분)로 선택된 7개 인덱스(0,9,30,50,80,92,102) × 3카메라의 lossless left/right PNG + ZED depth NPZ export를 구현했다. 초기 구성은 depth range를 명시하지 않았고, 재제출에서 ZED ULTRA depth mode에 100–3000mm 범위를 명시하며 export.json에 요청값과 SDK-echo 값을 모두 기록하도록 강화했다.

3 결과 (수치 필수)

Job상태소요원인 / 결과
123402FAILED1slibsl_zed.so 로드 실패 — 워커 이미지 SDK 디렉토리 권한 문제
123421FAILED4snative lib 로드 성공, Camera.open에서 wrist(16291792) CALIBRATION FILE NOT AVAILABLE
123441FAILED6sCamera.open 성공(SDK 5.3.1 확인), EOF까지 도달했으나 관측 카운트≠선언 카운트
123473구조적 거부12s3카메라 모두 104 선언 / 0–102(103개) 관측, svo_trace_validation_rejected 이벤트로 timestamp/이미지 witness 보존
123495COMPLETED25sbounded export: 21쌍(7 idx × 3 cam) PNG + depth NPZ, depth range 미지정
123828FAILED10sdepth_minimum_distance SDK echo mismatch — 100mm 요청, SDK echo 불일치로 ValueError(FAILED_PARTIAL)
124249COMPLETED26sdepth 100–3000mm ULTRA로 수정 후 재제출 성공. baseline 62.996mm, fx=fy=731.07, cx=649.53/cy=342.28(wrist)
핵심 발견: 4개의 순차 실패는 서로 다른 계층 문제(이미지 권한 → 설정 파일 → SDK 트레이스 정합성)였고, 각각의 stderr/stdout 증거가 보존되어 원인 특정이 가능했다.
발견된 버그: 123828의 depth range 미스매치는 "요청값과 SDK 실제 적용값 비교"라는 엄격한 검증이 없었다면 조용히 잘못된 depth로 export됐을 사안이다. export.json에 requested/sdk_echo를 모두 기록하게 한 덕분에 즉시 잡혔다.

4 Takeaway

의미

SDK_CAPTURED_REJECTED(104 선언, 103 관측)는 "고쳐서 통과시킨" 결과가 아니라 bounded 0–102 core로 스코프를 좁혀 우회한 것이다 — 데이터 감사 카드의 observed_core 기준과 정확히 일치한다. 즉 이번 엔지니어링 작업은 카드1의 결론(raw 마지막 1~2프레임 배제)을 실측 SDK 레벨에서 재확인한 셈이다. depth range 버그를 잡아낸 SDK-echo 검증 패턴은 앞으로 다른 SDK 파라미터(rectification, self-calibration)에도 그대로 적용할 수 있다.

5 Next Steps

미해결 한계

FoundationStereo 공식 checkpoint(Google Drive 폴더 1VhPebc_mMxWKccrv7pdQLTvXYVcLYpsf)는 rate-limit으로 다운로드가 완료되지 않았다. 현재 baseline/intrinsics는 "현재 제조사 runtime calibration"일 뿐 2023년 캡처 당시 값이라는 증거는 없다.

다음 작업

checkpoint 확보 후 scripts/reconstruct_foundation_stereo.sbatch(현재 미제출 skeleton, 1 GPU own)를 실행해 job 124249의 depth와 비교한다. 124249의 정식 export 결과를 geometry 비교 카드(ZED vs SGBM vs PointWorld)에 반영할지 결정이 필요하다.