《RAFT-Stereo: Multilevel Recurrent Field Transforms for Stereo Matching》는 반복적 시차 추정 분야의 기념비적인 연구로, RAFT 광류 추정 프레임워크를 스테레오 매칭에 맞게 개선한 모델이다. 주요 기여는 다음 세 가지로 정리할 수 있다.
전체 아키텍처 개요
┌─────────────────────────────────────────────────────────┐
│ 단계 1: 특징 추출 │
│ ├─ 특징 인코더: 좌우 영상의 표현 학습 (상관 볼륨 구성용) │
│ └─ 문맥 인코더: 좌측 영상의 문맥 특징 (GRU 갱신용) │
│ (선택적: 특징 인코더와 백본 공유 가능) │
├─────────────────────────────────────────────────────────┤
│ 단계 2: 상관 피라미드 │
│ └─ 3D 상관 볼륨 C ∈ ℝ^(H×W×W) 구성 │
│ 1D 풀링으로 4단계 피라미드 생성 (커널: 1, 2, 4, 8) │
├─────────────────────────────────────────────────────────┤
│ 단계 3: 다중 해상도 반복 갱신 │
│ └─ 3단계 ConvGRU (1/8, 1/16, 1/32 해상도) │
│ ├─ 고해상도 GRU: 상관 조회 수행, 시차 직접 갱신 │
│ ├─ 저해상도 GRU: 전역 문맥 제공, 해상도 간 정보 전달 │
│ └─ Slow-Fast: 저해상도는 빈번히, 고해상도는 드물게 │
└─────────────────────────────────────────────────────────┘
ConvGRU와 다중 해상도 ConvGRU 비교 분석
RAFT의 단일 해상도 ConvGRU
입력 구성
논문 3.3절에 명시된 입력 특징:
입력 특징 = [상관 특징, 흐름 특징, 문맥 특징]
각 구성요소:
- 상관 특징: 다중 척도 상관 볼에서 조회 연산으로 샘플링 후 2개 합성곱층 처리
- 흐름 특징: 현재 흐름 추정값 fᵏ를 2개 합성곱층으로 변환
- 문맥 특징: 문맥 인코더 출력 (직접 주입)
특징 차원
x_t = Concat([상관특징, 흐름특징, 문맥특징])
∈ R^(H/8 × W/8 × C_총합)
GRU 셀 동작
논문 식 (3)-(6) 기반 게이트 순환 구조:
z_t = σ(Conv3x3([h_{t-1}, x_t], W_z)) # 리셋 게이트
r_t = σ(Conv3x3([h_{t-1}, x_t], W_r)) # 업데이트 게이트
h̃_t = tanh(Conv3x3([r_t ⊙ h_{t-1}, x_t], W_h)) # 후보 은닉 상태
h_t = (1 - z_t) ⊙ h_{t-1} + z_t ⊙ h̃_t # 은닉 상태 갱신
출력 및 갱신
Δf = Conv1x1(h_t) ∈ R^(H/8 × W/8 × 2)
f^{k+1} = f^k + Δf
동작 흐름
k번째 반복:
┌─────────────────────────────────────────┐
│ 1. 상관 조회 │
│ - f^k로 다중 척도 상관 볼륨 샘플링 │
│ - correlation_feat 획득 │
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ 2. 특징 처리 │
│ - correlation_feat → Conv(2층) │
│ - f^k → Conv(2층) │
│ - context_feat (직접) │
│ x_t = Concat(...) │
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ 3. ConvGRU 갱신 │
│ z_t = σ(Conv3x3([h_{t-1}, x_t])) │
│ r_t = σ(Conv3x3([h_{t-1}, x_t])) │
│ h_t = (1-z_t)⊙h_{t-1} + z_t⊙h̃_t │
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ 4. 흐름 예측 │
│ Δf^k = Conv1x1(h_t) │
│ f^{k+1} = f^k + Δf^k │
└─────────────────────────────────────────┘
RAFT-Stereo의 다중 해상도 ConvGRU
핵심 개선
RAFT-Stereo 논문 3.3절에서 단일 해상도의 한계 지적:
"이 방식의 문제는 GRU 갱신 횟수에 따른 수용 영역(receptive field) 가가 매우 느리다는 점이다. 텍스처가 거의 없는 넓은 영역이 있는 장면에서 문제가 될 수 있다."
3-해상도 병렬 구조
동시에 유지되는 은닉 상태:
- h⁽¹⁾ @ 1/8 해상도 (고해상도, 상관 조회 수행)
- h⁽²⁾ @ 1/16 해상도 (중간 해상도)
- h⁽³⁾ @ 1/32 해상도 (저해상도)
입력-출력 구조
k번째 반복의 각 GRU 입력:
GRU⁽¹⁾: x⁽¹⁾ = [CorrLookup(dᵏ), dᵏ, context⁽¹⁾, 업샘플(h⁽²⁾)]
GRU⁽²⁾: x⁽²⁾ = [다운샘플(h⁽¹⁾), 업샘플(h⁽³⁾)]
GRU⁽³⁾: x⁽³⁾ = [다운샘플(h⁽²⁾)]
여기서 dᵏ는 k단계 시차 추정값, 상관 조회는 최고 해상도(1/8)에서만 수행된다.
출력
최고 해상도 GRU만 시차 갱신 생성:
Δdᵏ = Conv1x1(h_t⁽¹⁾) ∈ R^(H/8 × W/8 × 1)
다중 해상도 동작 흐름
k번째 반복:
┌──────────────────────────────────────────────────────┐
│ 단계 1: 상관 조회 (1/8 해상도에서만) │
│ corr_feat = LookupCorrelation(dᵏ @ 1/8) │
└────────────┬─────────────────────────────────────────┘
│
┌────────────▼─────────────────────────────────────────┐
│ 단계 2: 다중 해상도 입력 구성 │
│ │
│ ┌─ GRU@1/32 ──────────────────────────────────┐ │
│ │ x⁽³⁾ = [다운샘플(h⁽²⁾)] │ │
│ │ h⁽³⁾_새로운 = GRU(h⁽³⁾, x⁽³⁾) │ │
│ └──────────────────────────────────────────────┘ │
│ │
│ ┌─ GRU@1/16 ──────────────────────────────────┐ │
│ │ x⁽²⁾ = [다운샘플(h⁽¹⁾), 업샘플(h⁽³⁾_새로운)] │ │
│ │ h⁽²⁾_새로운 = GRU(h⁽²⁾, x⁽²⁾) │ │
│ └──────────────────────────────────────────────┘ │
│ │
│ ┌─ GRU@1/8 ───────────────────────────────────┐ │
│ │ x⁽¹⁾ = [corr_feat, dᵏ, ctx, │ │
│ │ 업샘플(h⁽²⁾_새로운)] │ │
│ │ h⁽¹⁾_새로운 = GRU(h⁽¹⁾, x⁽¹⁾) │ │
│ └────────────────────────────────────────────── │
└────────────┬─────────────────────────────────────────┘
│
┌────────────▼─────────────────────────────────────────┐
│ 단계 3: 시차 갱신 (최고 해상도 GRU에서) │
│ Δdᵏ = Conv1x1(h⁽¹⁾_새로운) │
│ d^{k+1} = dᵏ + Δdᵏ │
└──────────────────────────────────────────────────────
단일 vs 다중 해상도 비교
| 특성 | RAFT (단일) | RAFT-Stereo (다중) |
|---|---|---|
| 은닉 상태 수 | 1개 @ 1/8 | 3개 @ 1/8, 1/16, 1/32 |
| 수용 영역 확장 | 느림 (합성곱만) | 빠름 (해상도 간 전파) |
| 상관 조회 | 1/8에서 모두 | 1/8에서만 (최고 해상도) |
| 전역 정보 전달 | 제한적 | 업/다운샘플링으로 강화 |
| 저텍스처 영역 | 실패 가능 | 현저한 개선 |
| 계산량 | 기준 | +58% (표6: 0.132s vs 0.091s) |
| 정확도 향상 | - | 유의미한 향상 |
Slow-Fast 반복: 적응적 계산 분배
병목 분석
논문 3.4절 관찰:
"1/8 해상도 은닉 상태의 GRU 갱신은 1/16 해상도 갱신에 비해 약 4배의 FLOPs가 필요하다."
해상도 R의 특징맵에서 GRU 갱신 FLOPs는 R²에 비례. H×W 영상에서:
FLOPs_{1/8} : FLOPs_{1/16} : FLOPs_{1/32} = 64 : 16 : 4
Slow-Fast 갱신 전략
비동기 갱신 빈도
- 빠른 층 (1/32, 1/16): 더 빈번한 갱신
- 느린 층 (1/8): 더 드문 갱신
구체적 비율
논문 3.4절 및 표6:
표준 갱신: 매 반복마다 h⁽¹⁾, h⁽²⁾, h⁽³⁾ 각 1회 갱신
Slow-Fast 갱신:
h⁽³⁾ (1/32): 30회 갱신
h⁽²⁾ (1/16): 20회 갱신
h⁽¹⁾ (1/8): 10회 갱신
비율: 30 : 20 : 10 = 3 : 2 : 1
성능 비교 (표6 데이터)
| 설정 | 실행 시간 | 정확도(1px 오류) | 변화 |
|---|---|---|---|
| 표준 (32-32-32) | 0.132s | 9.40 | 기준 |
| Slow-Fast (30-20-10) | 0.063s | 9.98 | 52% 가속, +0.58% 오류 |
효과성 원리
저해상도 (1/32, 1/16):
- 전역 움직임과 장거리 의성 학습
- 큰 수용 영역, 낮은 해상도
- 빈번한 갱신 불필요 (저주파 정보)
고해상도 (1/8):
- 국소 세부사항과 경계 학습
- 미세 조정 필요 (고주파 정보)
- 단일 갱신 비용이 높음
실시간 추론 구성
KITTI 해상도 (1248×384) 최적화
논문 4.7절 실시간 버전:
실시간 RAFT-Stereo 설정:
1. 2단계 GRU (1/8 및 1/16, 3단계 대신)
2. 단일 공유 백본 (분리 인코더 대신)
3. Slow-Fast 갱신 전략
- 1/16 층: 고빈도 갱신
- 1/8 층: 저빈도 갱신
성능 지표
- 프레임률: 26 FPS (KITTI 해상도)
- D1 오류: 5.91% (DSMNet의 6.5%와 유사)
- 기본 모델 대비 약 2배 가속
하드웨어 수준 최적화
"추가로, PyTorch 기본 구현이 타임 병목임을 확인하여 CUDA로 자체 이중선형 샘플러를 구현했다."
계산 복잡도 모델
표준 방식 (N번 반복):
총 FLOPs = N × (64 + 16 + 4) × C = 84NC
Slow-Fast 방식:
총 FLOPs = 10×64C + 20×16C + 30×4C = 940C
이론적 가속비 (N=32):
가속비 = 84×32 / 940 ≈ 2.86배
실제 측정 가속비 (표6): 0.132/0.063 = 2.1배 (기타 오버헤드 반영)
핵심 혁신 요약
| 측면 | RAFT | RAFT-Stereo |
|---|---|---|
| 아키텍처 | 단일 1/8 GRU | 다중 3-해상도 GRU |
| 수용 영역 확장 | 순수 합성곱 | 해상도 간 정보 흐름 |
| 추론 전략 | 균일 반복 | 적응적 Slow-Fast |
| 실시간 성능 | 10 FPS @ 1088×436 | 26 FPS @ 1248×384 |
| 일반화 능력 | 강함 | 더 강함 (다중 척도 정보) |
이러한 혁신들이 결합되어 RAFT-Stereo는 높은 정확도를 유지하며 실시간 추론을 실현했다.