공정 정의 · v1 · 2026-08-21

서산 명천 메시 분할 파이프라인

드론 사진측량 메시를 건물·수목·차량·지면으로 분할하고, 원본 면(face)을 클래스별로 쪼개 내보내기까지의 전 공정.

대상
서산 명천 도로
원본
OBJ 6블록 · 3.0 GB
좌표계
EPSG:5186
학습 자산
SUM Parts
모델
PointVector
연산
RTX 3060 12 GB

공정은 6단계다. 앞 3단계는 1회성 자산 구축이고, 뒤 3단계는 타일마다 반복된다. 각 단계에는 통과 조건(게이트)이 있다. 게이트를 건너뛰면 다음 단계에서 원인을 알 수 없는 형태로 실패한다 — 실제로 그렇게 여러 번 잃었다.

공정

단계 0 실행 환경 1회 · 반나절

커스텀 CUDA 커널을 직접 빌드해야 하므로 Windows 네이티브로는 안 된다. WSL2에서만 성립한다.

입력

없음

처리

conda 환경 · CUDA 11.8 · torch 2.0.1 · CUDA 확장 5종 빌드

출력

동작하는 sumparts 환경

# 환경 + 확장 빌드 + 소스 현대화 패치 bash scripts/setup_env.sh bash scripts/setup_pointnext.sh bash scripts/patch_numpy_aliases.sh bash scripts/patch_unlabeled_test.sh bash scripts/patch_val_mode.sh
게이트 python scripts/verify_env.pyALL OK 를 낼 것. 확장 6종 import + openpoints 체인 전부 통과해야 한다.
단계 1 학습 데이터 확보 1회 · 30분

한국 데이터에 라벨이 없으므로 SUM Parts로 대신 학습한다. 저자가 학습 가중치를 공개하지 않아 직접 학습이 유일한 경로다.

입력

HuggingFace 게이트 수락 (브라우저 수동)

처리

다운로드 5.3 GB → 전개 13 GB → split 정리

출력

train 24 / val 8 / test 8 타일

bash scripts/download_data.sh all bash scripts/prepare_full_split.sh bash scripts/link_data.sh

배포본 split 이름이 로더와 다르다

디렉토리는 validate/인데 로더는 val/을 찾는다. 그대로 두면 예외 없이 검증 0개로 학습이 돌아간다. prepare_full_split.sh가 심볼릭 링크로 해결한다.

게이트 세 split 모두 24 / 8 / 8로 집계될 것.
단계 2 모델 학습 1회 · 4시간

PointVector를 쓴다. 논문 실측 mIoU 70.0 %로 번들 최고이고, PointNeXt보다 빠르다. PointNet은 15.1 %로 실무용이 아니다.

입력

SUM Parts face 트랙 · 13클래스

처리

100 epoch · voxel_max 24000 · 워치독 자동 재개

출력

ckpt_best.pth 41 MB

bash scripts/launch_overnight.sh pointvector-xl bash scripts/check_training.sh # 진행 확인

VRAM 초과가 OOM을 내지 않는다

WSL2 드라이버는 VRAM을 넘으면 호스트 RAM으로 흘린다. 학습은 조용히 완주한다 — 25~100배 느리게. 12 GB 카드에서 peak 15.47 GB가 찍힌다.

판별법: 전력. 사용률 100 %인데 전력이 낮으면(3060 기준 60 W대) 연산이 아니라 PCIe 전송 대기다. 정상이면 140 W대.

게이트 verify_speed.shHEALTHY 를 낼 것. peak VRAM < 11 GB 이고 전력이 120 W를 넘어야 한다.
단계 3 한국 데이터 변환 타일마다 · 5분

원본 OBJ는 읽기만 한다. 모델 입력은 포인트 클라우드 PLY여야 한다 — 데이터로더가 *.ply만 스캔하고, OBJ에는 포인트별 라벨 필드가 없다.

입력

ContextCapture OBJ + 텍스처 아틀라스 17~21장

처리

노선 축 타일링 → 면적가중 샘플링 → 텍스처 UV 조회

출력

타일당 47만 포인트 PLY

python scripts/inspect_obj.py Block.obj # 범위·머티리얼 파악 python scripts/mesh_to_ply.py Block.obj tile.ply \ --bbox X0 Y0 X1 Y1 --points 470000 python scripts/check_ply.py tile.ply # 스키마 대조

색상 스케일이 조용히 망가진다

SUM 배포본은 r,g,b float32 [0,1]이다. red,green,blue uint8로 쓰면 로더가 정규화를 하지 않아 255배 큰 특징값이 네트워크에 들어간다. 에러 없이 결과만 무의미해진다.

멀티머티리얼도 함정이다. trimesh.load(force='mesh')로 합치면 텍스처가 전부 유실되어 결과가 회색이 된다. Scene으로 받아 머티리얼별로 샘플링해야 한다.

게이트 check_ply.py가 SUM 배포본과 나란히 OK를 낼 것. 회색 폴백 경고가 없어야 한다.
단계 4 추론 및 클래스 통합 타일마다 · 1분

SUM 13클래스를 우리가 필요한 4클래스로 합친다. 창·문 수준 세부는 필요 없으므로 세부 클래스의 개별 성적은 비용이 아니다.

입력

변환된 PLY + 학습 체크포인트

처리

슬라이딩 윈도우 추론 → 13→4 매핑

출력

포인트별 클래스 + 예측 PLY

우리 클래스SUM 원본 클래스논문 IoU
건물facade · roof · chimney · dormer · balcony · roof_installation · wall85.9–91.7 %
수목high_vegetation96.8 %
차량car · boat95.2 %
지면 (도로 포함)terrain92.3 %

도로면은 face 트랙에서 terrain에 포함된다. 별도 road 클래스는 texture 트랙(19클래스)에만 있고 우리에겐 필요 없다.

게이트 Mapple로 육안 확인 + 통합 4클래스 mIoU 측정. "전부 건물" 무지성 분류기(IoU 67 %)를 반드시 이길 것. 못 이기면 모델이 퇴화한 상태다.
단계 5 메시 분할 타일마다 · 미구현

최종 산출물. 포인트 예측을 원본 면으로 되돌려 클래스별 OBJ로 쪼갠다.

입력

포인트별 예측 + 원본 OBJ

처리

포인트→면 역매핑 → 면 다수결 → 클래스별 분리

출력

building.obj · vegetation.obj · vehicle.obj · ground.obj

원본 vertex는 불가침

분할은 재생성이 아니라 면(face) 분할이다. 구멍 메우기는 새 vertex 덧대기만 허용된다. 원본 지면 Z를 DTM으로 덮어쓰면 실패다.

현재 변환기는 샘플링 시 face index를 남기지 않는다. 역매핑을 위해 face index 보존 기능 추가가 필요하다.

게이트 분할된 면 수의 합 = 원본 면 수. 누락도 중복도 없을 것.

정확도가 부족할 때

단계 4의 게이트를 통과 못 하면 도메인 갭 때문이다. 헬싱키 도시로 학습한 모델을 한국 도로 현장에 적용하는 구조적 한계다. 그때 붙이는 분기가 아래다.

분기 자동 라벨링 + 파인튜닝 조건부

입력

드론 원본 8,120장 + 카메라 포즈

처리

SAM 3.1 텍스트 프롬프트 → 2D 마스크 → 포즈로 3D 투영 → 면 투표

출력

한국 데이터 자동 라벨 → 파인튜닝

모델 선택 근거

모델발표핵심논문 mIoU우리 실측 s/iter
PointNet2017전체 한 번에 max-pool. 이웃 개념 없음15.1 %0.291
PointNet++2017이웃끼리 묶어 계층 처리33.1 %0.675
PointNeXt2022++ 구조 유지, 학습법·크기 개선65.3 %0.635
PointVector2023이웃 특징을 고차원 벡터로 합침70.0 %0.402

s/iter는 RTX 3060 12 GB 실측, XL 모델은 VRAM에 맞춰 voxel_max를 낮춘 값이다. PointVector가 가장 정확하고 동시에 가장 빠르다.

현재 상태

단계상태비고
0 · 실행 환경완료확장 5종 빌드, 패치 4건
1 · 학습 데이터완료13 GB 전개, 24/8/8
2 · 모델 학습진행 중PointVector 100 epoch
3 · 데이터 변환검증됨BlockYBA 1타일 POC 통과
4 · 추론·통합대기학습 완료 후
5 · 메시 분할미구현face index 보존 필요

제약