scene_flow_lk — 3D motion op

• 데이터 종류: voxel × voxel → flow_dense

• 호출: import fullseye as fs; fs.ledger.scene_flow_lk(vol0, vol1, device='cpu', win=3, levels=3, iters=3, reg=0.001)(구현을 직접 호출하려면 import match3d; match3d.scene_flow_lk(vol0, vol1, device='cpu', win=3, levels=3, iters=3, reg=0.001), 원장에서 가져오려면 ops3d.get("scene_flow_lk"))

• GPU: 이 연산자는 GPU 경로가 있습니다(device="cuda")

사용법

Lucas-Kanade scene flow(2D 광류의 3D 판). voxel 별 운동장 d=(dz,dy,dx).

템플릿 대조와 달리 조밀한 운동/변형 을 추정한다. 밝기 일정 ∇I·d + I_t = 0 을 창 내 최소제곱으로 per-voxel 로 푼다(3x3 구조 텐서 A=Σ∇I∇Iᵀ, b=-Σ∇I·I_t 를 창 합 conv3d 로). pyramid + warp 의 coarse-to-fine 으로 큰 변위에 대응(각 level 에서 I1 을 현재 flow 로 되돌려 잔차를 반복 보정=Gauss-Newton). vol1(x) ≈ vol0(x - d). 반환값 flow (3,D,H,W). 병진·확대(발산)·회전(소용돌이) 장을 포착한다.

실측: 균일 병진 [1.5,-2,1] 을 중앙 영역 평균으로 오차 0.044 voxel, 확대 장에서 바깥 방향 발산을 올바르게 검출. grad_scale=32 는 sobel3d(deriv[-1,0,1]×smooth[1,2,1]²)의 실측 스케일. GPU 대응(모두 conv3d).

인수: vol0, vol1 은 같은 형상의 3-D(다르면 ValueError. NaN/Inf 나 float32 자릿수 넘침도 ValueError). win 은 창의 반폭(창의 한 변의 길이 2·win+1), levels 는 피라미드 단 수(각 단 avg_pool3d 로 2 배 축소. 변위가 클수록 단 수를 늘린다), iters 는 각 단의 warp 반복, reg 는구조 텐서 대각에 대한 정칙화(평탄부의 0 나눗셈 회피. 클수록 평탄부의 flow 가 0 에 가까워진다). 1 반복의 갱신은 각 축 ±2 voxel 로 clamp 된다. 반환값 (3, D, H, W) float32 numpy, flow[0]=dz, flow[1]=dy, flow[2]=dx (voxel 단위). vol1(x) ≈ vol0(x − d), 즉 vol0 의 구조가 +d 움직여 vol1 이 된다. 가장자리는 border 보간으로 채워지므로 가장자리 1〜2 voxel 의 값은 신뢰하지 않는다. 강체 운동의 R,t 가 필요하면점군으로 만들어 icp_point2point_3d / fit_rigid 로.

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

• motion_scene — py -3.11 examples_3d/motion_scene.py

타입이 이어지는 다음 연산자(flow_dense 를 입력으로 받는 것)

fuse_to_voxel

같은 카테고리(motion)

—


*Provenance: match3d.py — 3D 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.