본문 바로가기
On Going/Point Cloud Data

[PCD] 3D segmentation - 3D LiDAR 기반 차선 검출 프로젝트: Cylinder3D로 직접 만들며 얻은 실전 노하우

by 에아오요이가야 2025. 11. 18.

3D LiDAR 포인트 클라우드를 활용해 도로 차선을 자동으로 검출하는 것은 HD 맵핑, 자율주행, 도로 유지보수 분야 등에서 매우 중요한 기술입니다. 이번 프로젝트에서는 Cylinder3D 모델을 기반으로 실제 수집한 MMS LiDAR 데이터를 활용하여 3D Lane Segmentation 시스템을 구축했습니다.  이 글에서는 그 과정 전체를 정리하며 실전 팁까지 함께 공유합니다.

 

1. 데이터 준비 및 전처리

1.1 데이터 구성

이번 프로젝트에서 사용한 데이터는 다음과 같습니다.

  • 원본 LiDAR 데이터: LAS 포맷 - MMS(Mobile Mapping System)에서 수집된 고해상도 포인트 클라우드
  • 라벨 데이터: Shapefile 형식의 도로 차선 폴리라인
  • 최종 데이터셋 크기: 774개 (Train 608 / Val 166)

초기 데이터는 총 2,503개였지만, 품질을 높이기 위해 필터링을 거쳤습니다.

 

1.2 데이터 전처리 파이프라인

Step 1. LAS → SemanticKITTI 포맷 변환

Cylinder3D는 SemanticKITTI 포맷을 기본으로 하기 때문에 LAS 파일을 다음 포맷으로 변환했습니다.

  • .bin: 포인트 클라우드 (x, y, z, intensity)
  • .label: 각 포인트의 클래스 레이블 (배경/차선)

변환 과정에서 다음 작업을 포함했습니다:

  • 좌표계 정규화
  • Ground 제거(선택)
  • 대규모 데이터의 Window Patching

Step 2. Shapefile 기반 차선 라벨링

차선 Shapefile을 불러와 포인트당 라벨을 생성합니다.

lane_geometries = [lane.geometry.buffer(0.1) for _, lane in lanes.iterrows()]

버퍼 크기 실험 결과

  • 0.2m: 실제 차선보다 영역이 넓어 False Positive 증가
  • 0.1m: GT보다 과도한 확장이 없고 더 높은 정확도

→ 최종 버퍼 크기: 0.1m로 확정

Step 3. 데이터 품질 필터링

필터링 기준:

항목 기준 이유
포인트수 10,000개이상 너무 적은 샘플은 학습에 방해
라벨 비율 0.1%이상 차선이 거의 없는 샘플 제거

결과: 2,503개 → 774개 고품질 샘플 확보

2. Cylinder3D 모델 구성

Cylinder3D는 원통형 좌표계 기반 3D Sparse Convolution을 사용하여 LiDAR의 불균일한 분포를 효과적으로 처리합니다.

모델 구조

  • Voxel Encoder: SegVFE
  • Backbone: Asymm3DSpconv
  • Head: Cylinder3DHead (Binary: Lane vs Background)

데이터 증강(Augmentation)

이번 프로젝트의 성능을 크게 올려준 요소 중 하나가 LaserMix + PolarMix 조합입니다.

연산 설명
LaserMix LiDAR의 세로 스캔 라인 단위 믹싱
PolarMix 극좌표계 기반 오브젝트 단위 믹싱
Global Aug 회전, 스케일, 반사, 랜덤 드롭

→ 실제로 다양한 도로 상황 데이터를 가진 것처럼 일반화 성능을 개선했습니다.

 

3. 손실 함수 최적화

3.1 초기 설정의 문제점

초기 Loss 조합:

  • CrossEntropy: weight=[1.0, 4.0]
  • Lovász Loss: weight=1.0

초기 성능:

Metric
Lane IoU 27.31%
Precision 39.36%
Recall 22.75%
F1 28.50%

Recall이 매우 낮은 것이 핵심 문제였습니다.

→ 모델이 차선을 거의 잡지 못하는 상황.

3.2 Lovász Loss 중심 전략

Lovász Loss는 IoU 기반 최적화를 직접 수행하기 때문에 작은 객체 클래스가 중요한 세그멘테이션에서 특히 유리합니다. 의료영상 분야에서 혈관segmentation에 이용된다는 점에 착안하여 혈관의 성질이 차선과 유사하다고 판단하여 Lovász Loss를 loss function으로 차용하였습니다. 또한 차선이 전체 영역에서 매우낮은 부분을 차지하고 있기 때문에 차선의 weight에 6의 가중치를 적용하였습니다.

개선된 Loss 조합

  • CrossEntropy loss_weight = 0.5
  • Lovász loss_weight = 1.5
  • Class weight = [1.0, 6.0]

결과적으로 Recall과 Lane IoU가 큰 폭으로 개선 가능함을 확인했습니다.

핵심:

✔ CrossEntropy = 학습 안정화

✔ Lovász = IoU 직접 최적화 (차선에 필수)

4. 하이퍼파라미터 실험

4가지 조합을 테스트했습니다.

실험 Class  Weight CE Weight Lovász Weight 목적
1 8.0 0.5 1.5 기본 + Recall 향상
2 8.0 0.4 2.0 Lovász 최대 강화
3 10.0 0.5 1.5 극단적 Class Weight
4 8.0 0.7 1.5 CE 강화로 안정성

최종 발견

Config Best Lane IoU 특징
classweight8_ce07_200ep 0.2815 최고 성능
classweight10 0.2769 Class weight 증가 효과 없음
lovasz2.0 0.2723 Loss weight 과도함 → 성능 하락

결론

  • CrossEntropy loss_weight = 0.7이 가장 안정적
  • Class weight 10은 오히려 과적합
  • Lovász weight 2.0도 지나침

5. 최종 성능 및 시각화

최종 모델 성능

Metric Score
mIoU 0.6163
Background IoU 0.9510
Lane IoU 0.2815
Accuracy 0.9520

Lane IoU가 절대적으로 높은 값은 아니지만, 극도로 불균형한 Small-class 문제임을 고려하면 실제로 모델이 차선을 잘 집어내기 시작한 수준입니다.

6. 프로젝트에서 얻은 주요 인사이트

데이터 품질의 중요성

  • 2,503개 → 774개로 줄였지만 오히려 성능 향상
  • 버퍼 크기 0.1m 선택이 결정적
  • 결국 “좋은 데이터가 성능을 만든다”

Loss 조합의 영향력

  • Lovász Loss는 IoU 최적화에 강력
  • CE Loss는 학습을 안정시키는 역할
  • 적절한 Weight 조절이 모델 성능을 크게 좌우함

지나친 튜닝의 부작용

  • Class weight 10은 성능 하락
  • Lovász Loss weight 2.0도 오버슈팅
  • “한 번에 하나씩” 실험하는 것이 중요

다양한 지표 사용의 필요성

  • mIoU 하나만 보면 차선 클래스 성능을 놓칠 수 있음
  • Lane IoU, Precision, Recall, F1 등 여러 지표로 평가해야 정확한 파악 가능

7. 향후 개선 방향

데이터 측면

  • 다양한 도로 환경 추가
  • 야간·악천후 데이터 확보
  • 더 다양한 도시 레이아웃 확보

모델 측면

  • Attention 기반 아키텍처 도입
  • Multi-scale feature integration
  • 더 큰 모델 실험

학습 측면

  • Focal Loss 조합
  • Cosine Annealing 스케줄
  • Early Stopping 개선

후처리

  • CRF 후처리
  • 시퀀스 기반 Temporal smoothing

8. 결론

이번 프로젝트는 다음과 같은 성과를 달성했습니다:

✔ 고품질 데이터셋 구성

✔ Cylinder3D 기반 차선 세그멘테이션 파이프라인 구축

✔ Loss weight 튜닝을 통한 Lane IoU 개선

✔ 최종 Lane IoU 0.2815, mIoU 0.6163 달성

 

짧은 기간 동안의 실험이었지만, 3D LiDAR 기반 차선 검출의 전체 흐름을 이해하고 실제 적용 가능한 수준의 결과를 얻었다는 점에서 매우 의미 있는 경험이었습니다.

 

 

📎 부록

 

  • Framework: MMDetection3D
  • Model: Cylinder3D
  • Dataset Format: SemanticKITTI

댓글