입력
없음
드론 사진측량 메시를 건물·수목·차량·지면으로 분할하고, 원본 면(face)을 클래스별로 쪼개 내보내기까지의 전 공정.
공정은 6단계다. 앞 3단계는 1회성 자산 구축이고, 뒤 3단계는 타일마다 반복된다. 각 단계에는 통과 조건(게이트)이 있다. 게이트를 건너뛰면 다음 단계에서 원인을 알 수 없는 형태로 실패한다 — 실제로 그렇게 여러 번 잃었다.
커스텀 CUDA 커널을 직접 빌드해야 하므로 Windows 네이티브로는 안 된다. WSL2에서만 성립한다.
없음
conda 환경 · CUDA 11.8 · torch 2.0.1 · CUDA 확장 5종 빌드
동작하는 sumparts 환경
python scripts/verify_env.py 가 ALL OK 를 낼 것.
확장 6종 import + openpoints 체인 전부 통과해야 한다.
한국 데이터에 라벨이 없으므로 SUM Parts로 대신 학습한다. 저자가 학습 가중치를 공개하지 않아 직접 학습이 유일한 경로다.
HuggingFace 게이트 수락 (브라우저 수동)
다운로드 5.3 GB → 전개 13 GB → split 정리
train 24 / val 8 / test 8 타일
디렉토리는 validate/인데 로더는 val/을 찾는다.
그대로 두면 예외 없이 검증 0개로 학습이 돌아간다.
prepare_full_split.sh가 심볼릭 링크로 해결한다.
24 / 8 / 8로 집계될 것.
PointVector를 쓴다. 논문 실측 mIoU 70.0 %로 번들 최고이고, PointNeXt보다 빠르다. PointNet은 15.1 %로 실무용이 아니다.
SUM Parts face 트랙 · 13클래스
100 epoch · voxel_max 24000 · 워치독 자동 재개
ckpt_best.pth 41 MB
WSL2 드라이버는 VRAM을 넘으면 호스트 RAM으로 흘린다.
학습은 조용히 완주한다 — 25~100배 느리게.
12 GB 카드에서 peak 15.47 GB가 찍힌다.
판별법: 전력. 사용률 100 %인데 전력이 낮으면(3060 기준 60 W대) 연산이 아니라 PCIe 전송 대기다. 정상이면 140 W대.
verify_speed.sh 가 HEALTHY 를 낼 것.
peak VRAM < 11 GB 이고 전력이 120 W를 넘어야 한다.
원본 OBJ는 읽기만 한다. 모델 입력은 포인트 클라우드 PLY여야 한다 —
데이터로더가 *.ply만 스캔하고, OBJ에는 포인트별 라벨 필드가 없다.
ContextCapture OBJ + 텍스처 아틀라스 17~21장
노선 축 타일링 → 면적가중 샘플링 → 텍스처 UV 조회
타일당 47만 포인트 PLY
SUM 배포본은 r,g,b float32 [0,1]이다.
red,green,blue uint8로 쓰면 로더가 정규화를 하지 않아
255배 큰 특징값이 네트워크에 들어간다. 에러 없이 결과만 무의미해진다.
멀티머티리얼도 함정이다. trimesh.load(force='mesh')로 합치면
텍스처가 전부 유실되어 결과가 회색이 된다. Scene으로 받아 머티리얼별로 샘플링해야 한다.
check_ply.py가 SUM 배포본과 나란히 OK를 낼 것.
회색 폴백 경고가 없어야 한다.
SUM 13클래스를 우리가 필요한 4클래스로 합친다. 창·문 수준 세부는 필요 없으므로 세부 클래스의 개별 성적은 비용이 아니다.
변환된 PLY + 학습 체크포인트
슬라이딩 윈도우 추론 → 13→4 매핑
포인트별 클래스 + 예측 PLY
| 우리 클래스 | SUM 원본 클래스 | 논문 IoU |
|---|---|---|
| 건물 | facade · roof · chimney · dormer · balcony · roof_installation · wall | 85.9–91.7 % |
| 수목 | high_vegetation | 96.8 % |
| 차량 | car · boat | 95.2 % |
| 지면 (도로 포함) | terrain | 92.3 % |
도로면은 face 트랙에서 terrain에 포함된다. 별도 road 클래스는
texture 트랙(19클래스)에만 있고 우리에겐 필요 없다.
최종 산출물. 포인트 예측을 원본 면으로 되돌려 클래스별 OBJ로 쪼갠다.
포인트별 예측 + 원본 OBJ
포인트→면 역매핑 → 면 다수결 → 클래스별 분리
building.obj · vegetation.obj · vehicle.obj · ground.obj
분할은 재생성이 아니라 면(face) 분할이다. 구멍 메우기는 새 vertex 덧대기만 허용된다. 원본 지면 Z를 DTM으로 덮어쓰면 실패다.
현재 변환기는 샘플링 시 face index를 남기지 않는다. 역매핑을 위해 face index 보존 기능 추가가 필요하다.
단계 4의 게이트를 통과 못 하면 도메인 갭 때문이다. 헬싱키 도시로 학습한 모델을 한국 도로 현장에 적용하는 구조적 한계다. 그때 붙이는 분기가 아래다.
드론 원본 8,120장 + 카메라 포즈
SAM 3.1 텍스트 프롬프트 → 2D 마스크 → 포즈로 3D 투영 → 면 투표
한국 데이터 자동 라벨 → 파인튜닝
| 모델 | 발표 | 핵심 | 논문 mIoU | 우리 실측 s/iter |
|---|---|---|---|---|
| PointNet | 2017 | 전체 한 번에 max-pool. 이웃 개념 없음 | 15.1 % | 0.291 |
| PointNet++ | 2017 | 이웃끼리 묶어 계층 처리 | 33.1 % | 0.675 |
| PointNeXt | 2022 | ++ 구조 유지, 학습법·크기 개선 | 65.3 % | 0.635 |
| PointVector | 2023 | 이웃 특징을 고차원 벡터로 합침 | 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 보존 필요 |
-1이라 로컬 채점이 원천 불가하다. 논문 수치와 직접 대조하려면 예측을 저자에게 보내야 한다.voxel_max를 64000에서 낮춰야 12 GB에 들어간다. 이 값은 중립적 손잡이가 아니라 모델의 동작점 일부다 — 같은 체크포인트가 프로토콜에 따라 mIoU 17.19 / 4.20으로 갈렸다.