1. DeepLabV3 — 확장 합성곱
§01표준 합성곱은 수용 영역을 증가시키기 위해 공간 해상도를 다운샘플링합니다. 이는 컨텍스트 캡처에 필수이지만 밀도 있는 예측 작업에는 재앙입니다(픽셀 단위 레이블이 필요함). DeepLab의 핵심 통찰: 확장(또는 유전) 합성곱은 커널 가중치 사이에 0을 삽입하여 해상도 감소 없이, 매개변수 추가 없이 수용 영역을 확장합니다.
확장 비율 r의 경우, 3×3 커널은 (2r+1)×(2r+1) 영역을 커버하지만 9개의 픽셀만 터칭합니다. 형식으로, 1D 신호의 경우: (F *ₐ k)[i] = Σⱼ F[i + r·j] · k[j]입니다.
r=1일 때는 표준 합성곱이고, r=6일 때 3×3 커널은 13×13 필드를 봅니다.
- DeepLabV1 / V2 — 확장 합성곱과 경계를 선명하게 하기 위한 조밀한 조건부 무작위 필드(Dense CRF) 후처리를 도입했습니다. CRF는 느리고(~1초) 미분 불가능합니다.
- DeepLabV3 — Dense CRF를 완전히 제거합니다. ASPP(확장 합성곱을 병렬로 여러 규모에서 실행)로 대체합니다. 이미지 수준의 컨텍스트를 위해 전역 평균 풀링 분기를 추가합니다.
- DeepLabV3+ — U-Net에서 영감을 받은 백본에서의 스킵 연결이 있는 인코더-디코더를 추가합니다. 디코더는 CRF 없이 경계를 정제합니다.
2. ASPP — 확장 공간 피라미드 풀링
§02전역 평균 풀링 분기는 중요합니다: 이미지 수준의 컨텍스트(이것이 어떤 종류의 장면인가?)를 제공하며, 어떤 유한한 확장 비율도 캡처할 수 없습니다. 연결 후, 1×1 합성곱이 채널 차원을 줄이고, 결과는 최종 분류를 위해 출력 해상도로 쌍선형 업샘플링됩니다.
DeepLabV3+는 경량 디코더를 추가합니다: 백본의 1/4 해상도 저수준 특성(스트라이딩 전)은 48개 채널로 투영되고 업샘플된 ASPP 출력과 연결됩니다. 2개의 3×3 합성곱이 병합된 특성을 정제하고, 그 다음 쌍선형으로 4배 전체 해상도로 업샘플링합니다. 이 U-Net 스타일 스킵은 CRF 없이 얇은 물체(기둥, 자전거 탄 사람) 주변의 경계를 더 선명하게 합니다.
3. SqueezeSegV2 — LiDAR 의미론적 분할
§03DeepLabV3이 RGB 이미지를 대상으로 하는 동안, SqueezeSegV2는 다른 모달을 다룹니다: 자율 주행 자동차를 위한 LiDAR 포인트 클라우드. 핵심 아이디어: 비용이 많이 드는 3D 합성곱으로 3D 포인트 클라우드를 처리하는 대신, 범위 이미지(구형 투영)에 투영하고 표준 2D CNN을 적용합니다.
4. SqueezeSegV2 아키텍처 & 도메인 적응
§04인코더는 Fire 모듈(압축 + 확장 1×1/3×3 합성곱)을 가진 SqueezeNet 영감 네트워크입니다. 디코더는 전치된 합성곱으로 업샘플링하고 경계 정제를 위해 CRF-RNN 계층을 추가합니다 — DeepLabV1의 CRF와 정신은 비슷하지만 미분 가능한 순환 단위로 네트워크에 통합됩니다.
도메인 적응은 중요한 우려사항입니다: SqueezeSegV2는 시뮬레이션된 데이터(CARLA / GTA)에서 훈련되지만 실제 LiDAR(KITTI)에서 작동해야 합니다. 시뮬레이션은 완벽한 밀도와 센서 노이즈가 없습니다. 실제 데이터는 누락된 반환, 빗방울, 보정 불완전성이 있습니다. SqueezeSegV2는 측지선 상관 정렬(GCA)을 도입합니다: 리만 매니폴드의 측지 거리를 따라 측정된 양의 정부호 행렬의 상관 행렬 사이의 차이를 최소화합니다. 이는 실제 도메인에서의 레이블이 필요 없이 인코더를 적응시킵니다.
- 속도 — GTX 1080Ti에서 완전한 360° LiDAR 스캰당 8.7ms. 3D 복셀 기반 방법보다 거의 10배 빠르므로 실시간 자율 주행 스택에 적합합니다.
- 범위 이미지 제한 — 구형 투영은 일부 3D 구조 정보를 손실합니다(같은 방위/높이이지만 서로 다른 범위의 2개 포인트는 1개 픽셀로 축소됨). 폐색 처리는 불완전합니다.
- 컨텍스트 인식 특성 재가중화(CAF) — V2에서 추가됨. 전역 컨텍스트를 기반으로 채널 응답을 재보정합니다(스퀴즈-앤-엑시테이션 스타일). 소형 물체 재현율을 개선합니다.
5. PyTorch 구현 — ASPP 모듈
§05import torch
import torch.nn as nn
import torch.nn.functional as F
class AtrousConvBNReLU(nn.Module):
def __init__(self, in_ch, out_ch, kernel_size, dilation=1, padding=0):
super().__init__()
self.block = nn.Sequential(
nn.Conv2d(in_ch, out_ch, kernel_size,
padding=padding, dilation=dilation, bias=False),
nn.BatchNorm2d(out_ch),
nn.ReLU(inplace=True),
)
def forward(self, x):
return self.block(x)
class ASPP(nn.Module):
# 확장 공간 피라미드 풀링 (DeepLabV3).
# in_ch: 백본 출력 채널 (예: ResNet-101의 2048)
# out_ch: ASPP 출력 채널 (논문의 256)
# rates: 병렬 3×3 분기의 확장 비율 목록
def __init__(self, in_ch=2048, out_ch=256, rates=(6, 12, 18)):
super().__init__()
# 분기 1: 1×1 합성곱 (r=1, 패딩 불필요)
self.b1 = AtrousConvBNReLU(in_ch, out_ch, 1)
# 분기 2,3,4: 3×3 확장 합성곱
self.branches = nn.ModuleList([
AtrousConvBNReLU(in_ch, out_ch, 3, dilation=r, padding=r)
for r in rates
])
# 분기 5: 전역 평균 풀링
self.global_avg = nn.Sequential(
nn.AdaptiveAvgPool2d(1),
nn.Conv2d(in_ch, out_ch, 1, bias=False),
nn.BatchNorm2d(out_ch),
nn.ReLU(inplace=True),
)
# 융합 1×1 합성곱
num_branches = 1 + len(rates) + 1 # b1 + 확장 + 전역
self.project = nn.Sequential(
nn.Conv2d(num_branches * out_ch, out_ch, 1, bias=False),
nn.BatchNorm2d(out_ch),
nn.ReLU(inplace=True),
nn.Dropout(0.5),
)
def forward(self, x):
H, W = x.shape[-2:]
# 모든 분기 출력 수집
out = [self.b1(x)]
for branch in self.branches:
out.append(branch(x))
# 전역 분기: 풀 → 합성곱 → 공간 크기로 업샘플링
g = self.global_avg(x)
g = F.interpolate(g, size=(H, W), mode='bilinear', align_corners=False)
out.append(g)
# 연결 및 투영
out = torch.cat(out, dim=1) # B × (5×256) × H × W
return self.project(out) # B × 256 × H × W
# 빠른 테스트
if __name__ == "__main__":
aspp = ASPP(in_ch=2048, out_ch=256, rates=(6, 12, 18))
x = torch.randn(2, 2048, 65, 65) # 전형적인 ResNet-101 출력
out = aspp(x)
print(out.shape) # torch.Size([2, 256, 65, 65])
total = sum(p.numel() for p in aspp.parameters())
print(f"ASPP 매개변수: {total:,}") # ~16M
6. 결과
§06| 방법 | 데이터셋 | 백본 | mIoU |
|---|---|---|---|
| DeepLabV2 | Cityscapes | ResNet-101 | 70.4% |
| DeepLabV3 | Cityscapes | ResNet-101 | 81.3% |
| DeepLabV3+ | Cityscapes | Xception-65 | 83.0% |
| SqueezeSeg | KITTI | SqueezeNet | 29.5% |
| SqueezeSegV2 | KITTI | SqueezeNet+CAF | 57.4% |
| SqueezeSegV2+DA | KITTI | GCA 적응 | 57.4% (+시뮬) |
7. 평가
§07DeepLabV3의 ASPP는 의미론적 분할의 사실상 표준이 되었습니다. 논문의 제거 실험은 각 성분이 그 몫을 제대로 하고 있음을 명확히 보여줍니다: 전역 평균 풀링 분기를 제거하면 ~1.5 mIoU 비용이 들고, 확장 비율의 수를 반으로 줄이면 추가로 ~1 mIoU 비용이 듭니다. V3+의 인코더-디코더 확장은 남은 약점(흐릿한 경계)을 해결했으며 CRF를 재도입하지 않아 아키텍처를 완전히 미분 가능한 엔드-투-엔드로 만들었습니다.
DeepLabV1(확장 합성곱 + CRF) → V2(ASPP + CRF) → V3(ASPP, CRF 없음) → V3+(인코더-디코더)의 계보는 아키텍처 개선이 어떻게 체계적으로 후처리 휴리스틱을 대체할 수 있는지 보여줍니다.
SqueezeSegV2의 범위 이미지 아이디어는 현대 LiDAR 분할에서 살아있습니다: RangeNet++, FIDNet, CENet은 모두 구형 투영 패러다임을 기반으로 합니다. 왜냐하면 그것이 빠르고 메모리 효율적이기 때문입니다. 도메인 적응 문제(시뮬에서 실제로)는 계속 열려 있는 문제이지만, 실제 라벨이 없는 스캔에서의 자가 지도 사전 훈련이 GCA와 같은 명시적 정렬 방법을 크게 대체했습니다.
함께, 이 2개 논문은 2D/3D 분할 나눗셈을 괄호로 표시합니다: DeepLabV3는 이미지 도메인 분할에 대한 최상의 관행을 정의하며(PointPainting으로 공급됨), SqueezeSegV2는 올바른 표현을 선택하여 LiDAR에 동일한 2D CNN 도구 상자를 직접 적용할 수 있음을 보여줍니다.