Files
nbrightandClaude Opus 5 e529c449b5 Add the paper study material and set the bare-earth goal
Six papers converted to Markdown with the local doc2md tool, figures extracted
and annotated. The tool's venv had a CPU-only torch, so marker-pdf silently ran
on CPU and stalled; swapping in 2.5.1+cu121 dropped a paper from "hung after six
minutes" to three. Gemini then described all 86 figures in place, below each
original caption.

The PDFs themselves are gitignored - 88 MB of public arXiv downloads that
convert_papers.sh regenerates. The .md and figures are tracked, because the
annotations took a separate pass and do not reproduce byte-for-byte.

sum-parts-explained.html gains two tabs:

- PointVector. Why representing a scalar feature as a rotated 3D vector buys
  anisotropic aggregation without attention's cost, and why the paper predicts
  two independent angles rather than a rotation matrix whose nine elements are
  interdependent.
- Bare Earth. Reframes the task as ground vs not-ground, and separates the five
  boundaries by their nature. Four of them are cuts; the slope boundary is the
  one that must NOT be cut, which is why "horizontal means ground" destroys road
  cut and fill. Notes that SUM Parts is flat Helsinki and cannot teach slopes at
  all, so that part needs a geometric filter rather than more training.

NEXT.md carries the goal forward: separate bare earth from the rest as OBJ
meshes, then reclassify the remainder. Removing the ground first is sound -
it is 24-40% of the points, and without it the remaining objects fall apart
into separate connected components instead of being joined through the floor.

The gap that blocks step 4 is named: mesh_to_ply.py samples points without
recording which face each came from, so there is no way back to the mesh yet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-24 12:53:50 +09:00

6.3 KiB

다음 세션 시작 프롬프트

목표가 정해졌다. 이 문서를 읽고 아래 프롬프트로 이어간다.


단기 목표

bare earth 모델과 나머지를 분리한다. OBJ(mesh) 형태로 분리한 뒤, 그 나머지 모델을 다시 분류한다. 지면이 없어지면 분류가 더 쉬울 것이다.

이 순서는 타당하다. 근거:

  • 지면이 전체 포인트의 24~40%를 차지한다 — 제거하면 남은 문제가 그만큼 작아진다
  • 지면을 걷어내면 건물·수목·차량이 공간적으로 분리된 덩어리가 된다. 지면이 있으면 전부 하나로 이어져 있어 연결 성분 분석이 안 된다
  • 2단계 분류는 실패가 국소화된다. 1단계에서 지면을 놓쳐도 2단계가 무너지지 않는다

프롬프트

docs/sum-parts-explained.html 의 "Bare Earth" 탭과 STATUS.md 를 먼저 읽어라.
그 다음 이어서 작업한다.

## 목표

bare earth(지면)와 나머지를 분리해서 각각 OBJ 메시로 내보낸다.
그 다음 나머지를 건물/수목/차량으로 다시 분류한다.

## 현재 가진 것

- PointVector 학습 완료 (3060, voxel_max 24000, 100 epoch)
  SUM val 기준 지면 precision 95.24% / recall 66.10%
- 서산 명천 BlockYBA 타일 1장 변환·추론 완료
- 클래스별 분리 산출물 D:\AI_Test\sum-part\{ground,building,tree,vehicle,unseen}\
  단 포인트 클라우드(.ply)이고 메시가 아니다

## 해야 할 일 — 순서대로

### 1. 이진 학습이 실제로 이득인지 확인

가설: 학습부터 2클래스(지면/비지면)로 하면 경계 정확도가 오른다.
근거: 13클래스 51.83% → 4클래스 통합 72.14%. 합칠수록 올랐다.

구현: 데이터로더에서 라벨 remap.
  terrain(1) → 1, 나머지 → 2, unclassified(0) → 0(ignore)
  num_classes: 3, 나머지 cfg 그대로

측정: 지면 precision / recall을 현재 95.24 / 66.10과 비교.
약 4시간. 3060으로 가능하다.

### 2. CSF를 서산 타일에 단독 적용

Cloth Simulation Filter. 학습 불필요, 파라미터 몇 개.
비탈면(절토·성토)에 강한 것이 알려져 있고, SUM(헬싱키 평지)으로는
비탈면을 배울 수 없으므로 이 부분은 기하 기법이 필요하다.

파이썬 구현: CSF (pip install cloth-simulation-filter) 또는 PDAL filters.csf

측정: 신경망 결과와 어디가 다른지. 특히 경사면에서.

### 3. 조합

신경망(의미) → 나무·차량·건물 제거 → CSF(기하) → 비탈면 보존
둘의 합의/불일치 지점을 본다.

### 4. 포인트 → 메시 복원  ← 여기가 미구현이고 핵심

현재 변환기(scripts/mesh_to_ply.py)는 면적가중 샘플링만 하고
**각 포인트가 어느 face에서 왔는지 기록하지 않는다.**
포인트 예측을 원본 메시로 되돌리려면 이 역매핑이 필요하다.

해야 할 것:
  a. mesh_to_ply.py에 face index 보존 추가 (PLY에 face_idx 속성)
  b. 포인트 예측 → face 다수결 → face별 클래스
  c. 클래스별로 face를 분리해 OBJ 저장

원칙: 원본 vertex는 불가침. 분리는 재생성이 아니라 face 분할이다.
구멍 메우기는 새 vertex 덧대기만 허용된다.

검증: 분할된 face 수의 합 == 원본 face 수. 누락도 중복도 없을 것.

### 5. 나머지 재분류

지면 제거 후 남은 메시에서 건물/수목/차량 분리.
지면이 없으면 연결 성분(connected component)으로 물체가 자연히 나뉜다.
이 단계는 4번이 끝나야 의미가 있다.

## 주의사항

- WSL2에서 VRAM 초과는 OOM을 안 낸다. 호스트 RAM으로 흘려서
  25~100배 느리게 조용히 완주한다. peak VRAM과 전력(W)으로 판정해라.
- 파일을 만들었으면 scripts/verify_outputs.sh 로 읽히는지 확인해라.
  "만들었다"고 보고하기 전에 파서로 검증한다.
- 포인트 클라우드는 PLY로 내라. 면 없는 OBJ는 뷰어가 아무것도 안 보여준다.
- 각 단계 게이트를 통과 못 하면 다음으로 넘어가지 마라.

## 판정 기준

bare earth의 성패는 precision이다. 지면이라 부른 것에 구조물이 섞이면
지형이 왜곡된다. 반대로 지면을 놓쳐 생긴 구멍은 보간으로 메운다.

현재 기준선: precision 95.24% / recall 66.10%

참고 — 이 세션에서 확인한 것

PointVector 핵심

특징값(스칼라)을 3D 벡터로 확장해서 방향을 얻는다. 회전각 α, β 두 개만 MLP로 예측한다 — 회전행렬을 직접 예측하면 원소끼리 종속이라 최적화가 어렵기 때문이다.

attention이나 dynamic conv 없이 이방성(anisotropy)을 얻으므로 PointNeXt 파라미터의 58%로 더 높은 정확도가 나온다.

왜 우리 과제에 맞나

지면과 벽의 구분은 본질적으로 방향 문제다. 지면은 이웃이 수평으로, 벽은 수직으로 퍼져 있다. 등방적 집계는 이 차이를 뭉갠다.

측정치가 이를 뒷받침한다 — 비지면이 지면으로 샌 26,217 포인트 중 49.90%가 facade_surface였다. 벽 하단, 지면과 만나는 경계다.

경계 5종의 성질이 다르다

경계 성질 난이도
지면–벽 법선 급변 쉬움
지면–수목 수직 이격 중간
지면–자동차 얹힌 물체 중간
지면–지장물 얹힌 물체 중간
지면–비탈면 둘 다 지면 가장 어려움

비탈면만 성질이 반대다 — 나머지는 잘라내야 하고 비탈면은 남겨야 한다. "수평이면 지면"으로 가면 도로 절·성토를 통째로 날린다.

SUM Parts의 한계

헬싱키 평지 도시라 비탈면을 배울 수 없다. 재학습으로도 안 고쳐진다. 데이터에 없는 개념이다. → 비탈면은 CSF 같은 기하 기법으로 보완한다.


문서

문서 내용
docs/sum-parts-explained.html 학습 정리 — 용어, 모델 계보, PointVector 원리, bare earth 전략
STATUS.md 작업 현황, 실측 수치, 미해결 문제
docs/pipeline.html 6단계 공정 정의
docs/papers/md/ 논문 6편 마크다운 + 그림 86개 (Vision 주석 완료)
SETUP.md · TRAIN.md 새 머신 구축