도시 3D 메시를 부분 단위로 분할하는 벤치마크가 무엇이고, 우리 과제에 어떻게 쓰이는가.
SUM Parts는 데이터셋이다. 모델이 아니다. 새 신경망을 만든 논문이 아니라, 기존 모델들을 채점할 새 시험지를 만든 논문이다. CVPR 2025, TU Delft.
"SUM Parts를 쓴다" = 데이터로 모델을 학습시킨다는 뜻이다.
실제로 예측을 내놓는 건 PointVector 같은 별개 모델이고,
그건 다른 팀이 2023년에 발표한 것이다.
겹친 것 ÷ 합친 것.
클래스별로 구하고 평균 낸 것이 mIoU다.| 제공 | 내용 |
|---|---|
| ✓ 데이터셋 | 2.5 km² 도시 텍스처 메시, 21개 클래스, 라벨 완비 |
| ✓ 벤치마크 점수표 | 기존 모델 13종을 태워본 결과 — 어느 모델이 좋은지 |
| ✓ 학습 코드 | PointNeXt 번들 (모델 구현 + 학습 스크립트) |
| ✗ 학습된 가중치 | 없다. 직접 학습해야 한다 |
| ✗ 어노테이션 도구 | 비공개. 저자가 유료 서비스로 판매 중 |
| ✗ 채점 스크립트 | TODO. test 세트 채점은 저자에게 요청 |
라벨을 어디에 붙였느냐로 갈린다. 데이터도 클래스 수도 다르다.
| 트랙 | 라벨 부착 대상 | 클래스 | 세부 수준 |
|---|---|---|---|
| face | 삼각형 면 | 13 | 외벽 · 지붕 · 굴뚝 · 발코니 |
| texture | 텍스처 픽셀 | 19 | 위 + 창문 · 문 · 노면표시 |
건물·수목·차량·지면만 필요하다. 창문이나 노면표시 단위는 필요 없다.
도로면은 face 트랙에서 terrain에 포함된다.
facade_surface는 건물 외벽이고,
wall은 건물에 속하지 않은 수직 구조물이다 — 옹벽, 방음벽, 담장.
도로 프로젝트에서 옹벽은 지형이 아니라 구조물이므로 이 구분이 중요하다.
포인트 클라우드의 속성은 두 층으로 나눠 봐야 한다. 파일에 실제로 저장돼 있는 것과, 거기서 계산해 만들어내는 것이다.
점 하나 = 숫자 몇 개짜리 행. 뭐가 들어 있는지는 어떤 센서로 찍었나에 달렸다.
| 속성 | 뜻 | 어디서 나오나 |
|---|---|---|
| x, y, z | 3D 좌표 | 항상 있음. 유일한 필수 항목 |
| intensity | 반사 강도 | LiDAR. 금속은 밝고 아스팔트는 어둡다 |
| r, g, b | 색 | RGB-D 카메라, 사진측량, 카메라 융합 |
| return_number | 몇 번째 되돌아온 신호인가 | LiDAR. 나뭇잎 뚫고 땅까지 여러 번 튐 |
| ring / laser_id | 몇 번 레이저 채널인가 | 회전식 LiDAR (Velodyne 64채널 등) |
| scan_angle | 스캔 각도 | LiDAR |
| timestamp | 찍힌 시각 | 움직이는 물체 분리에 씀 |
| label / class | 정답 라벨 | 사람이 붙인 것. 학습용 데이터만 |
그래서 딥러닝 모델은 보통 xyz만 있어도 돌아가게 설계한다.
SUM Parts는 메시에서 점을 뽑기 때문에 xyz + 텍스처에서 가져온 rgb를 쓴다.
"이 점은 모서리 같다", "평평한 면 위에 있다" 같은 판단이 여기서 나온다. 센서가 알려주는 게 아니라 주변 이웃점을 보고 직접 계산한다.
이웃점 K개를 모아 공분산 행렬을 만들고 고유값 3개를 뽑는다 (λ₁ ≥ λ₂ ≥ λ₃). 고유값 = "주변 점들이 어느 방향으로 얼마나 퍼져 있나".
| 이름 | 공식 | 크면 뭐냐 |
|---|---|---|
| Linearity | (λ₁−λ₂)/λ₁ | 선형 구조 — 전선, 난간 |
| Planarity | (λ₂−λ₃)/λ₁ | 평면 — 벽, 바닥, 지붕 |
| Sphericity | λ₃/λ₁ | 덩어리 — 수관, 덤불 |
| Curvature | λ₃/(λ₁+λ₂+λ₃) | 표면 굴곡, 모서리 |
| Anisotropy | (λ₁−λ₃)/λ₁ | 방향성 있음 |
| Omnivariance | (λ₁λ₂λ₃)^⅓ | 전체 부피감 |
| Eigenentropy | −Σ λᵢ·ln λᵢ | 무질서한 정도 |
| 이름 | 뜻 |
|---|---|
| normal (nx,ny,nz) | 표면이 향하는 방향. λ₃의 고유벡터 |
| verticality | 1 − |nz|. 벽이냐 바닥이냐 구분 |
| density | 반경 안에 점이 몇 개인가 |
| height above ground | 지면 기준 높이. 야외 데이터의 강력한 단서 |
| local height range | 이웃점들의 z 최대 − 최소 |
반경 10 cm로 보면 벽돌 하나의 굴곡이 보이고, 5 m로 보면 건물 전체가 평면으로 보인다. 그래서 여러 반경에서 뽑아 합치는 multi-scale 방식을 쓴다.
위 특징들을 누가 고르느냐가 옛 방식과 딥러닝의 갈림길이다.
xyz(+ 있으면 rgb)만 던져주고
MLP가 알아서 저런 특징을 학습하게 한다.출력 64개에는 이름표가 없다. 3번 채널이 planarity고 17번이 curvature다 — 그런 대응은 없다. 학습 중에 "이 조합이 벽 구분에 유용하더라"를 네트워크가 찾아낸 결과일 뿐이다. 뜯어보면 앞쪽 층이 planarity·linearity 비슷한 걸 학습하는 경향은 있지만 보장된 건 아니다.
포인트 클라우드는 순서도 격자도 없는 점 덩어리다. 이걸 신경망에 어떻게 먹이느냐가 이 계보의 역사다.
수치는 논문 Table 3, face 트랙 12클래스 mIoU.
신경망 중 가장 단순한 형태다. Linear → 활성화(ReLU) → Linear 를 쌓은 것.
하는 일은 딱 하나 — 숫자 묶음 하나를 받아서 다른 숫자 묶음으로 바꾼다.
PointNet 계열에서는 보통 1×1 convolution, 즉 점마다 독립으로 도는 작은 MLP다.
PointNet++이 지역 특징을 만드는 절차는 이렇다.
4번이 문제다. 채널별 최댓값만 남기면 누가 그 값을 냈는지가 사라진다 — 위쪽 이웃인지 왼쪽 이웃인지 구분이 안 된다. 이게 등방적(isotropic), 즉 어느 방향이든 똑같이 취급한다는 뜻이다.
벽과 바닥이 만나는 모서리를 생각해 보자. "위쪽엔 아무것도 없고 옆으로만 평평하다"는 정보가 있어야 모서리인 줄 아는데, 방향을 뭉개면 "주변에 평평한 점들이 있다"까지밖에 모른다.
대조군은 일반 이미지 CNN이다. 3×3 필터는 칸마다 다른 가중치를 쓴다.
방향마다 다르게 반응한다 — 이게 비등방(anisotropic)이다.
MLP + max 방식은 이웃마다 다른 가중치를 줄 방법이 구조상 없다.
이웃의 상대 좌표(p_j − p_i)를 입력에 같이 넣어 힌트는 주지만,
그건 방향을 재료로 알려주는 것이지 방향별로 다르게 처리하는 게 아니다.
| 방식 | 방향 구분 | 왜 비싼가 |
|---|---|---|
| MLP + max PointNet++ | ✗ 못 함 | 대신 싸다 |
| Attention | ✓ 됨 | 이웃마다 중요도를 매번 계산 — QKV 행렬 추가, 점 × 이웃 K개 전부 연산 |
| Dynamic Conv | ✓ 됨 | 입력마다 필터를 새로 생성 — 필터 생성기 신경망이 따로 필요 |
점구름은 점이 수만~수십만 개라 이 비용이 그대로 곱해진다. 자율주행이나 로봇 같은 실시간 처리에서는 감당이 안 된다. "싸면서도 방향을 구분하는 법" — PointVector가 벡터 집계로 노리는 지점이 여기다.
앞 탭의 문제는 이것이었다. 방향을 구분하려면 attention이나 dynamic conv가 필요한데 둘 다 비싸다. PointVector는 기계를 추가하지 않고 방향을 얻는다.
특징값(숫자 하나)을 방향을 가진 3D 벡터로 바꾼다. 벡터는 원래 방향이 있으니, 더할 때 방향이 저절로 작용한다.
회전각 α, β는 MLP가 예측한다.
입력은 이웃과의 상대 위치(p_j − p_i)와
상대 특징(f_j − f_i)이다.
즉 "이 이웃이 어디에 어떻게 놓여 있느냐"가 벡터 방향을 결정한다.
3×3 행렬 원소 9개는 서로 종속이다 (직교 조건 때문에 아무 값이나 못 넣는다). 그런 걸 신경망에 예측시키면 최적화가 어렵다. 각도 두 개는 서로 독립이라 자유롭게 움직여도 항상 유효한 회전이 된다. 논문이 "facilitates the network to find the better solution"이라 쓴 지점이다.
마지막에 다시 스칼라로 되돌리는 이유는, 다음 층이 일반 특징을 받아야 하기 때문이다. 벡터는 집계하는 순간에만 쓰인다.
| 방식 | 방향 구분 | 추가 비용 |
|---|---|---|
| MLP + max | ✗ | 없음 |
| Attention | ✓ | QKV 행렬 3개 + 이웃 전체 내적 |
| Dynamic Conv | ✓ | 필터 생성 신경망 |
| PointVector | ✓ | 각도 2개 예측 |
이것이 PointNeXt 파라미터의 58%로 더 높은 정확도가 나온 이유다 (S3DIS Area 5에서 72.3% mIoU). 무거운 기계를 붙이는 대신, 이미 있는 것을 방향 있는 형태로 바꿨을 뿐이다.
지면 = 이웃이 수평으로 퍼져 있음 · 외벽 = 이웃이 수직으로 퍼져 있음. 등방적 집계는 "주변에 점이 많다"까지만 알고 어느 방향인지를 못 본다.
우리 측정치가 이 얘기를 뒷받침한다. 비지면이 지면으로 샌 26,217 포인트 중
49.90%가 facade_surface였다 —
벽 하단, 지면과 만나는 경계다. 수평 이웃과 수직 이웃이 섞이는 바로 그 구간이다.
최종 목표가 구조물을 걷어낸 지형이라면, 13클래스도 4클래스도 필요 없다. 지면 / 비지면 둘이면 된다.
그러면 어려운 곳은 전부 "지면과 X가 만나는 경계"로 정리된다. 그런데 그 경계들이 성질이 서로 다르다 — 이게 핵심이다.
| 경계 | 성질 | 난이도 |
|---|---|---|
| 지면 – 벽 | 법선이 급변 (수평→수직) | 쉬움 · 기하만으로도 |
| 지면 – 수목 | 수직 이격, 단 캐노피가 위를 덮음 | 중간 |
| 지면 – 자동차 | 지면 위에 얹힌 닫힌 물체 | 중간 |
| 지면 – 지장물 | 위와 같음 | 중간 |
| 지면 – 비탈면 | 둘 다 지면. 잘라내면 안 됨 | 가장 어려움 |
나머지 넷은 "잘라내기"인데 비탈면만 "잘라내면 안 되는 것"이다. 성질이 반대다. "수평이면 지면"이라는 직관으로 가면 절토·성토 비탈면을 통째로 날린다. 도로 노선은 양쪽이 전부 비탈면이라 치명적이다.
Bare earth 추출은 LiDAR 분야에서 20년 넘은 문제다. 학습이 필요 없는 기하 기법들이 있다.
| 기법 | 발상 |
|---|---|
| CSF Cloth Simulation Filter |
점군을 뒤집고 위에서 천을 덮어 늘어뜨린다. 천이 닿는 곳이 지면 |
| PMF | 윈도우를 키워가며 형태학적 열림 연산 |
| TIN 반복 조밀화 | 최저점으로 삼각망을 만들고 점진적으로 점을 추가 |
CSF가 비탈면에 강하다. 천이 경사를 따라 늘어지므로 경사면을 지면으로 유지한다. 하지만 고전 기법은 무엇인지를 모른다 — 나무 밑동·차량·옹벽을 형상만으로 판단하니 애매하면 틀린다.
신경망이 무엇인지를 알려주고, CSF가 어디까지가 지면인지를 결정한다. 서로의 약점을 메운다.
클래스를 합칠수록 수치가 올랐다. 지금은 추론 후 합치기만 한 결과다.
| 클래스 수 | mIoU | 방식 |
|---|---|---|
| 13 | 51.83% | 원본 학습 |
| 4 | 72.14% | 추론 후 통합 |
| 2 | ? | 학습부터 이진 — 미검증 |
학습부터 2클래스로 하면 모델이 dormer vs balcony 구분에
용량을 쓰지 않고 전부 지면/비지면 경계에 쓴다.
구현은 데이터로더에서 라벨을 remap하는 정도다.
SUM Parts는 헬싱키다. 평지 도시라 도로 절·성토 비탈면이 거의 없다. 모델이 "경사진 지면"을 본 적이 없으면 인식할 근거가 없다. 재학습으로도 안 고쳐진다 — 데이터에 없는 개념이다. 비탈면만큼은 기하 기법이 더 신뢰할 만하다.
RTX 3060 12GB에서 직접 학습·평가한 결과다.
| 모델 | 논문 | 우리 | 비고 |
|---|---|---|---|
| PointNet | 15.1% | 17.19% | 논문 설정 그대로 — 재현 확인 |
| PointVector | 70.0% | 51.83% | VRAM 부족으로 설정 축소 |
PointNet이 논문값을 넘긴 것이 중요하다. 파이프라인이 맞다는 증거다.
PointVector가 못 미친 건 voxel_max를 64000 → 24000으로 낮춰서다.
논문 설정은 16.5 GB가 필요한데 카드가 12 GB다.
13클래스를 우리가 필요한 4개로 합치면 수치가 달라진다.
dormer·balcony 같은 세부 클래스의 실패가
전부 "건물" 안으로 흡수되기 때문이다.
| 클래스 | IoU | precision | recall |
|---|---|---|---|
| 수목 | 90.70% | 95.11% | 95.14% |
| 건물 | 86.10% | 88.01% | 97.54% |
| 지면 | 60.69% | 95.24% | 62.59% |
| 차량 | 51.05% | 78.81% | 59.17% |
세부 13클래스로는 51.83%지만, 4클래스로는 72.14%다. 목표가 bare earth라면 지면 precision 95.24%가 핵심 숫자다 — 지면이라 부른 것의 95%가 실제 지면이라는 뜻이다.
모델은 13개 점수를 내고 그중 최고를 고른다. "모르겠음"이 없다. 학습에서 본 적 없는 것을 만나도 반드시 13개 중 하나를 답한다 — 특징 공간에서 가장 가까운 것으로.
서산 도로 타일에 추론했더니 water 21%, boat 5%가 나왔다.
물도 배도 없는 현장이다. 헬싱키에서 배운 "물"의 특징 —
어둡고 평평하고 균질하고 수평 — 이 한국 포장면과 맞아떨어진 것이다.
배는 물 위에 있는 것이라 따라왔다. 일관성 있는 착각이다.
SUM Parts는 헬싱키 도시다. 한국 도로 현장에 그대로 쓰면 도메인 갭이 생긴다. 더 좋은 모델로 더 오래 학습해도 이건 안 줄어든다. 해결하려면 한국 데이터에 라벨을 붙여 파인튜닝해야 한다.
| 대상 | 라이선스 | 뜻 |
|---|---|---|
| 데이터셋 | CC BY-NC 4.0 | 비상업 한정. 출처 표기 필수 |
| 코드 | GPL-3.0 | 파생 배포 시 소스 공개 의무 |
NC 데이터로 학습한 가중치도 NC로 취급하는 게 안전하다. 상업 이용은 저자 허락이 필요하다.
왼쪽 두 개는 한 번만 하면 되는 자산 구축이고, 아래쪽은 타일마다 반복하는 적용이다.