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
'On Going > Point Cloud Data' 카테고리의 다른 글
| [IMU] What is an IMU(Inertial Measurement Unit)- 관성측정 장치? (0) | 2026.03.22 |
|---|---|
| [Gaussian Splatting] 3D 표현의 혁신과 SAM 3D Objects에서의 활용 (0) | 2025.11.21 |
| [pcd] LiDAR 데이터의 noise 제거 방법론 (0) | 2025.04.15 |
| [pcd] 도로 포인트클라우드를 평면으로 정렬하는 4가지 방법: 딥러닝 전처리를 위한 접근(4. PCA기반 평면정렬) (0) | 2025.04.14 |
| [pcd] 도로 포인트클라우드를 평면으로 정렬하는 4가지 방법: 딥러닝 전처리를 위한 접근(3. DTM기반 CSF) (0) | 2025.04.14 |
댓글