docs: 집합 조정(M2) 보류 기록 + 반입 목록 실측

M2 는 교통시설물을 가르는 안까지 만들고 보류했다. 16장 실측으로
structure 1,079 -> utility pole 608 / streetlight pole 372 /
road sign 358 / culvert 9, fence 702 -> guardrail 668 / fence 46 /
roadside barrier 17 로 갈라지는 것을 확인했다 (라벨 14 -> 19종).
사용자 지시로 v4 로 되돌렸고 v5 는 보류 표시와 함께 남긴다.
culvert 9개, roadside barrier 17개는 16장 기준 표본이 부족하다.

정정: "집합 없는 검출은 버려진다"는 앞선 판단은 틀렸다.
merge_labels.py 의 merge_by_group 은 집합에 없는 라벨을 passthrough 로
그대로 통과시킨다. 16장 병합 결과에 orange traffic cone 114 개와
yellow safety cone 6 개가 독립 클래스로 살아 있다. [cone] 으로 묶으면
오히려 나란히 선 콘이 gap 2px 에서 한 덩어리가 되어 개수를 잃는다.

envsetting.md 에 반입 목록을 실측 크기로 정리했다:
  git 으로 오는 것 (복사 금지)
  손으로 복사할 것  체크포인트 3.3GB / BPE 1.4MB / JPEG 69장 1.2GB
  복사하면 안 되는 것  venv(절대경로), output/, theater 뷰어 JPEG 55MB

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@
This commit is contained in:
minsung
2026-09-02 09:30:15 +09:00
parent b754694ef8
commit 833816061b
4 changed files with 228 additions and 10 deletions
+180
View File
@@ -0,0 +1,180 @@
# ==========================================================
# 보류 (2026-09-02). 세부 세그멘테이션은 후순위로 미뤘다.
# 현재 쓰는 정의는 configs/merge_groups_v4.txt 다.
#
# 이 파일은 교통시설물을 뭉치지 않고 가른 안이다. 16장 실측으로
# structure 1,079 -> utility pole 608 / streetlight pole 372 /
# road sign 358 / culvert 9, fence 702 -> guardrail 668 /
# fence 46 / roadside barrier 17 로 갈라지는 것까지 확인했다.
# 라벨 14종 -> 19종, 폴리곤 6,370 -> 6,667.
#
# 다시 쓸 때 주의: culvert 9개, roadside barrier 17개는 16장 기준
# 표본이 너무 적다. 69장 전체를 돌린 뒤 클래스로 쓸지 판단해라.
# ==========================================================
# 병합 그룹 정의 — 대괄호 안이 병합 후 대표 라벨.
# 같은 그룹에 속한 라벨끼리 외곽선이 --gap px 이내로 인접하면 하나로 합친다.
# 어느 그룹에도 없는 라벨은 건드리지 않는다.
#
# 여기서 나누지 않는 구분이 있다. SAM은 사진만 보므로 미터도 규모도 모른다.
# 아래는 2D가 아니라 3D 메시에서 갈라야 정확하다:
# 낮은수목 / 수목 CSF 지면 위 높이
# 수목 / 숲 [vegetation] 연결성분 면적
# 지형 / 경사면 면 법선 경사각
# 건물 / 빌딩 [building] 연결성분 면적·높이
# 그래서 tree canopy와 dense forest, building과 residential house는
# 일부러 같은 그룹에 둔다 — 2D에서 갈라봐야 중복 마스크만 나온다.
# [building]
building
building rooftop
building facade
residential house
warehouse
factory structure
storage container
blue roof
red roof
green roof
gray roof
dark gray roof
black roof
white roof
silver metal roof
orange roof
brown roof
yellow roof
greenhouse roof
plastic greenhouse
vinyl greenhouse tunnel
# [road]
gravel shoulder
asphalt road
concrete pavement
parking lot
pedestrian sidewalk
crosswalk
bridge
# 아래는 비활성 — discovery_v1.txt에서 프롬프트를 통째로 껐다.
# 최종 목표가 지면 대 나머지라 차선은 도로면의 일부지 별도 클래스가 아니다.
# 검출량 1위였지만(583개 중 277개) 전부 [road] 안에서 버려지고,
# 논밭 이랑을 yellow center dividing line으로 오인하기까지 했다.
# [road marking]
# road lane marking
# yellow center dividing line
# white solid lane marking
# white dashed lane marking
# white directional arrow marking
# yellow parking stall line
# white parking stall line
# blue handicap parking space
# pink pedestrian safety marking
# green bike lane marking
# [vegetation]
yellow grass field
overgrown weeds
shrub
tree canopy
dense forest
green hedge
grass lawn
# [farmland]
ripening rice field
harvested field
crop field
farmland
plowed field
bare soil field
rice paddy
vegetable field
# [ground]
bare ground
dirt field
earth bank
dirt path
# [stored material]
blue plastic drum
orange plastic barrel
yellow plastic container
white industrial tank
metallic storage tank
blue waterproof tarp
green waterproof tarp
black protective sheet
white canvas canopy
# [retaining wall]
retaining wall
concrete retaining wall
gabion wall
# [slope]
grass covered embankment
road embankment slope
cut slope
riprap slope
# [water]
water surface
pond
reservoir
stream
irrigation canal
drainage ditch
# 교통시설물은 나중에 더 자세히 봐야 하므로 하나로 뭉치지 않는다.
# 전주/가로등/표지판은 형태도 역할도 다르다 — [structure] 로 묶으면
# 병합 후에 다시 못 가른다. 같은 물건의 다른 이름만 한 집합에 둔다.
# [utility pole]
utility pole
# [streetlight pole]
streetlight pole
# [road sign]
road sign
# [structure]
culvert
# [fence]
gray metal fence
green wire fence
# [guardrail]
guardrail
metal guardrail
# [roadside barrier]
red roadside barrier
# [vehicle]
white vehicle
black vehicle
silver vehicle
gray vehicle
red vehicle
blue vehicle
yellow vehicle
orange vehicle
green vehicle
white cargo truck
blue cargo truck
yellow school bus
commercial bus
tractor
farm tractor
excavator
# 콘은 일부러 어느 집합에도 넣지 않는다.
# merge_labels.py 는 집합에 없는 라벨을 건드리지 않고 그대로 통과시킨다
# (merge_by_group 의 passthrough). 그래서 콘은 버려지지 않고 독립 클래스로 남는다.
# [cone] 으로 묶으면 나란히 선 콘이 gap 2px 에서 한 덩어리가 되어 개수를 잃는다.
# 16장 실측: orange traffic cone 114 · yellow safety cone 6 이 그대로 살아 있다.
+7 -3
View File
@@ -75,9 +75,9 @@
}, },
{ {
"id": "M2", "id": "M2",
"name": "집합 정의 조정", "name": "집합 정의 조정 — 보류",
"state": "todo", "state": "blocked",
"detail": "튜닝 검출 결과(라벨 79종)를 보고 집합을 다시 짠다. 1차는 Claude, 이후 사용자." "detail": "교통시설물을 가르는 안(configs/merge_groups_v5.txt)을 만들고 16장으로 확인했다: structure 1,079 → utility pole 608 / streetlight pole 372 / road sign 358 / culvert 9, fence 702 → guardrail 668 / fence 46 / roadside barrier 17. 라벨 14 → 19종. 사용자 지시로 보류하고 v4 로 되돌렸다. 세부 세그멘테이션은 후순위."
}, },
{ {
"id": "M3", "id": "M3",
@@ -87,6 +87,10 @@
} }
], ],
"issues": [ "issues": [
{
"state": "closed",
"text": "'집합 없는 검출은 버려진다'는 앞선 판단은 틀렸다. merge_labels.py 의 merge_by_group 은 집합에 없는 라벨을 passthrough 로 그대로 통과시킨다. 16장 병합 결과에 orange traffic cone 114 · yellow safety cone 6 이 독립 클래스로 살아 있다. 콘을 [cone] 으로 묶으면 오히려 나란한 콘이 gap 2px 에서 한 덩어리가 되어 개수를 잃는다 — 지금처럼 집합 밖에 두는 게 맞다."
},
{ {
"state": "closed", "state": "closed",
"text": "통짜(1×1) 패스는 대상 하나에 인스턴스가 하나만 남는다 — 도로 한쪽 차로, 논 한 필지만 잡힘. --wide-in-tiles 로 해결(측정치는 M1e)." "text": "통짜(1×1) 패스는 대상 하나에 인스턴스가 하나만 남는다 — 도로 한쪽 차로, 논 한 필지만 잡힘. --wide-in-tiles 로 해결(측정치는 M1e)."
+38 -5
View File
@@ -18,7 +18,40 @@ RTX 4090 이 달린 이 PC 에 드론 사진 SAM 3.1 검출 환경을 세워라.
- OS: Windows (원래 환경과 같음). Linux 면 경로 구분자만 바꿔라. - OS: Windows (원래 환경과 같음). Linux 면 경로 구분자만 바꿔라.
- GPU: RTX 4090 24GB. `nvidia-smi` 로 드라이버가 올라와 있는지 먼저 확인해라. - GPU: RTX 4090 24GB. `nvidia-smi` 로 드라이버가 올라와 있는지 먼저 확인해라.
- 소스 PC 에서 가져와야 하는 큰 파일이 2종 있다 (아래 3, 4단계). git 에 없다.
### 반입 목록 (실측 크기)
**git 으로 오는 것 — 복사하지 마라**
| 경로 | 리포 |
|---|---|
| `prompts/discovery_v4.txt` (94개 프롬프트) | railway-client, `sam31-coverage-tuning` 브랜치 |
| `prompts/wide_v1.txt` | 〃 |
| `configs/merge_groups_v4.txt` (현재 활성 집합 정의) | 〃 |
| `tools/*.py` 전부 | 〃 |
| `sam3/` 패키지 | sam31server |
| `configs/auto_labeling/segment_anything_3.yaml` | 〃 |
`merge_groups_v5.txt` 도 리포에 있지만 **보류 상태다. 쓰지 마라.** 활성은 v4 다.
**손으로 복사해야 하는 것 — git 에 없다**
| 항목 | 실측 크기 | 원본 위치 | 왜 git 에 없나 |
|---|---|---|---|
| SAM3.1 체크포인트 | **3.3 GB** | `C:\Users\<사용자>\.cache\huggingface\hub\models--facebook--sam3.1\` | `.gitignore``*.pt` 제외 |
| BPE 사전 `bpe_simple_vocab_16e6.txt.gz` | 1.4 MB | `sam31server\bpe_simple_vocab_16e6.txt.gz` | `.gitignore``*.gz` 제외 |
| 원본 JPEG `stage_BlockYYX\` 69장 | **1.2 GB** | `railway-client\output\sam3\stage_BlockYYX\` | `.gitignore:42``output/` 제외 |
체크포인트는 복사 대신 HuggingFace 에서 새로 받아도 된다
(`huggingface-cli download facebook/sam3.1`). 회선이 느리면 복사가 빠르다.
**복사하면 안 되는 것**
| 항목 | 이유 |
|---|---|
| `.venv\` | 절대경로가 박혀 있어 다른 PC 에서 깨진다. 새로 만들어라 |
| `output\` 의 나머지 (`tune_t64` 등) | 이쪽 PC 의 산출물이다. 4090 은 새로 만든다 |
| `docs\pilot\theater*\` | 뷰어 JPEG 55MB. `make_viewer.py` 로 다시 굽는다 |
### 1. 리포 2개 clone ### 1. 리포 2개 clone
@@ -75,13 +108,13 @@ pip install -r requirements.txt
``` ```
`True``NVIDIA GeForce RTX 4090` 이 나와야 한다. `True``NVIDIA GeForce RTX 4090` 이 나와야 한다.
### 3. 체크포인트 + BPE 사전 (git 에 없음, 수 GB) ### 3. 체크포인트 + BPE 사전 (git 에 없음, 실측 3.3GB + 1.4MB)
`.gitignore``*.pt`, `*.gz` 를 뺀다. `.gitignore``*.pt`, `*.gz` 를 뺀다.
필요한 것: 필요한 것:
- `sam3.1_multiplex.pt` — HuggingFace `facebook/sam3.1` - `sam3.1_multiplex.pt` — HuggingFace `facebook/sam3.1` (캐시 폴더 전체 3.3GB)
- `bpe_simple_vocab_16e6.txt.gz` - `bpe_simple_vocab_16e6.txt.gz` (1.4MB)
받는 방법 둘 중 하나: 받는 방법 둘 중 하나:
1. HuggingFace 에서 새로 받는다 (`huggingface-cli download facebook/sam3.1`) 1. HuggingFace 에서 새로 받는다 (`huggingface-cli download facebook/sam3.1`)
@@ -97,7 +130,7 @@ pip install -r requirements.txt
3번 파일에는 **원래 PC 의 절대경로가 적혀 있다.** 그대로 쓰면 파일을 못 찾는다. 3번 파일에는 **원래 PC 의 절대경로가 적혀 있다.** 그대로 쓰면 파일을 못 찾는다.
환경변수로 덮거나 이 파일을 고쳐라. 환경변수로 덮거나 이 파일을 고쳐라.
### 4. 원본 사진 (git 에 없음, 블록당 약 1.2GB) ### 4. 원본 사진 (git 에 없음, 실측 1.2GB)
`.gitignore:42``output/` 을 통째로 뺀다. `.gitignore:42``output/` 을 통째로 뺀다.
+3 -2
View File
@@ -55,7 +55,7 @@ border-radius:6px;padding:5px 8px;font:inherit;font-size:13px}
<div class="wrap"> <div class="wrap">
<h1>SAM 3.1 후처리 — 검출 커버리지 · 집합 병합</h1> <h1>SAM 3.1 후처리 — 검출 커버리지 · 집합 병합</h1>
<p class="sub">1단계는 미검출을 없애는 것이다. 지표는 &#x27;무라벨 화면%&#x27; — 마스크 합집합으로 재서 겹침을 뺀 값. 목표 5% 이하, 8장 평균 3.6% 로 달성. 2단계는 집합으로 묶고 외곽선이 gap px 이내로 인접한 폴리곤을 합치는 것.</p> <p class="sub">1단계는 미검출을 없애는 것이다. 지표는 &#x27;무라벨 화면%&#x27; — 마스크 합집합으로 재서 겹침을 뺀 값. 목표 5% 이하, 8장 평균 3.6% 로 달성. 2단계는 집합으로 묶고 외곽선이 gap px 이내로 인접한 폴리곤을 합치는 것.</p>
<p class="sub" style="font-size:12px">생성 2026-09-01 22:36 · 집계 <code>tune_t64</code></p> <p class="sub" style="font-size:12px">생성 2026-09-02 09:19 · 집계 <code>tune_t64</code></p>
<h2>실측</h2><div class="cards"> <h2>실측</h2><div class="cards">
<div class="card"><div class="k">사진</div><div class="v">16</div></div> <div class="card"><div class="k">사진</div><div class="v">16</div></div>
<div class="card"><div class="k">폴리곤</div><div class="v">11,169</div></div> <div class="card"><div class="k">폴리곤</div><div class="v">11,169</div></div>
@@ -113,9 +113,10 @@ border-radius:6px;padding:5px 8px;font:inherit;font-size:13px}
<div class="step"><span class="id">M1h</span><span class="badge" style="color:#1a7f4b;background:#e3f5ea">완료</span><div><div>v4 프롬프트 (익은 논·갓길)</div><div class="d">ripening rice field / yellow grass field / harvested field / gravel shoulder 추가. 효과 없음 — 0006 5.8→5.7%, 0654 9.5→9.6%. 프롬프트 추가는 포화.</div></div></div> <div class="step"><span class="id">M1h</span><span class="badge" style="color:#1a7f4b;background:#e3f5ea">완료</span><div><div>v4 프롬프트 (익은 논·갓길)</div><div class="d">ripening rice field / yellow grass field / harvested field / gravel shoulder 추가. 효과 없음 — 0006 5.8→5.7%, 0654 9.5→9.6%. 프롬프트 추가는 포화.</div></div></div>
<div class="step"><span class="id">M1i</span><span class="badge" style="color:#1a7f4b;background:#e3f5ea">완료</span><div><div>타일 4×3 → 6×4 (목표 달성)</div><div class="d">conf 0.10 · v4 프롬프트 · --wide-in-tiles 와 함께. 4장 실측 무라벨: 0654 5.0% (기준선 52.1) · 0484 3.0% (38.7) · 0079 4.4% (27.1) · 0006 5.0% (19.4). 평균 34.3% → 4.35%. 비용 466~616초/장, 평균 523초 = 기준선 140초의 3.7배. 69장 재검출 시 약 10시간.</div></div></div> <div class="step"><span class="id">M1i</span><span class="badge" style="color:#1a7f4b;background:#e3f5ea">완료</span><div><div>타일 4×3 → 6×4 (목표 달성)</div><div class="d">conf 0.10 · v4 프롬프트 · --wide-in-tiles 와 함께. 4장 실측 무라벨: 0654 5.0% (기준선 52.1) · 0484 3.0% (38.7) · 0079 4.4% (27.1) · 0006 5.0% (19.4). 평균 34.3% → 4.35%. 비용 466~616초/장, 평균 523초 = 기준선 140초의 3.7배. 69장 재검출 시 약 10시간.</div></div></div>
<div class="step"><span class="id">M1j</span><span class="badge" style="color:#1a7f4b;background:#e3f5ea">완료</span><div><div>확정 설정 16장 검증</div><div class="d">16장 실측 무라벨(conf 0.10): 최소 0.5%(0423) ~ 최대 6.4%(0581), 평균 3.44%. 15/16 장이 5% 이하. 같은 16장 기준선 평균 19.9%. 소요 466~907초/장(평균 585초). 예상이 틀린 곳: 물 많은 사진이 위험할 것으로 봤으나 0423 이 0.5% 로 최저였다 — water surface/reservoir 검출이 0이어도 다른 프롬프트가 그 면적을 덮는다.</div></div></div> <div class="step"><span class="id">M1j</span><span class="badge" style="color:#1a7f4b;background:#e3f5ea">완료</span><div><div>확정 설정 16장 검증</div><div class="d">16장 실측 무라벨(conf 0.10): 최소 0.5%(0423) ~ 최대 6.4%(0581), 평균 3.44%. 15/16 장이 5% 이하. 같은 16장 기준선 평균 19.9%. 소요 466~907초/장(평균 585초). 예상이 틀린 곳: 물 많은 사진이 위험할 것으로 봤으나 0423 이 0.5% 로 최저였다 — water surface/reservoir 검출이 0이어도 다른 프롬프트가 그 면적을 덮는다.</div></div></div>
<div class="step"><span class="id">M2</span><span class="badge" style="color:#5a5f66;background:#eceef0">대기</span><div><div>집합 정의 조정</div><div class="d">튜닝 검출 결과(라벨 79종)를 보고 집합을 다시 짠다. 1차는 Claude, 이후 사용자.</div></div></div> <div class="step"><span class="id">M2</span><span class="badge" style="color:#a12a2a;background:#fbe6e6">막힘</span><div><div>집합 정의 조정 — 보류</div><div class="d">교통시설물을 가르는 안(configs/merge_groups_v5.txt)을 만들고 16장으로 확인했다: structure 1,079 → utility pole 608 / streetlight pole 372 / road sign 358 / culvert 9, fence 702 → guardrail 668 / fence 46 / roadside barrier 17. 라벨 14 → 19종. 사용자 지시로 보류하고 v4 로 되돌렸다. 세부 세그멘테이션은 후순위.</div></div></div>
<div class="step"><span class="id">M3</span><span class="badge" style="color:#5a5f66;background:#eceef0">대기</span><div><div>gap 값 조정</div><div class="d">외곽선 인접 판정 1~3 px. 파일럿 기준 2 px 로 시작.</div></div></div> <div class="step"><span class="id">M3</span><span class="badge" style="color:#5a5f66;background:#eceef0">대기</span><div><div>gap 값 조정</div><div class="d">외곽선 인접 판정 1~3 px. 파일럿 기준 2 px 로 시작.</div></div></div>
<h2>이슈 · 기각된 시도</h2> <h2>이슈 · 기각된 시도</h2>
<div class="issue"><span class="badge" style="color:#1a7f4b;background:#e3f5ea">해결</span><div>&#x27;집합 없는 검출은 버려진다&#x27;는 앞선 판단은 틀렸다. merge_labels.py 의 merge_by_group 은 집합에 없는 라벨을 passthrough 로 그대로 통과시킨다. 16장 병합 결과에 orange traffic cone 114 · yellow safety cone 6 이 독립 클래스로 살아 있다. 콘을 [cone] 으로 묶으면 오히려 나란한 콘이 gap 2px 에서 한 덩어리가 되어 개수를 잃는다 — 지금처럼 집합 밖에 두는 게 맞다.</div></div>
<div class="issue"><span class="badge" style="color:#1a7f4b;background:#e3f5ea">해결</span><div>통짜(1×1) 패스는 대상 하나에 인스턴스가 하나만 남는다 — 도로 한쪽 차로, 논 한 필지만 잡힘. --wide-in-tiles 로 해결(측정치는 M1e).</div></div> <div class="issue"><span class="badge" style="color:#1a7f4b;background:#e3f5ea">해결</span><div>통짜(1×1) 패스는 대상 하나에 인스턴스가 하나만 남는다 — 도로 한쪽 차로, 논 한 필지만 잡힘. --wide-in-tiles 로 해결(측정치는 M1e).</div></div>
<div class="issue"><span class="badge" style="color:#a12a2a;background:#fbe6e6">미해결</span><div>0581 무라벨 6.4% — 16장 중 유일한 5% 초과. 원인 확인함: 큰 구멍이 없다. 구멍 1,554개 중 최대가 0.83%, 상위 6개 합이 2.15% 뿐이고 나머지 4.25%가 작은 조각 1,548개로 흩어져 있다. 자재 야적장·건물 밀집 구역이라 폴리곤이 1,079개 나왔는데도 객체 사이 얇은 틈이 누적된 것. 0654 유형(큰 필지 통째 누락)과 다르다. 프롬프트로는 못 줄인다 — 후처리(폴리곤 팽창·구멍 메우기) 영역.</div></div> <div class="issue"><span class="badge" style="color:#a12a2a;background:#fbe6e6">미해결</span><div>0581 무라벨 6.4% — 16장 중 유일한 5% 초과. 원인 확인함: 큰 구멍이 없다. 구멍 1,554개 중 최대가 0.83%, 상위 6개 합이 2.15% 뿐이고 나머지 4.25%가 작은 조각 1,548개로 흩어져 있다. 자재 야적장·건물 밀집 구역이라 폴리곤이 1,079개 나왔는데도 객체 사이 얇은 틈이 누적된 것. 0654 유형(큰 필지 통째 누락)과 다르다. 프롬프트로는 못 줄인다 — 후처리(폴리곤 팽창·구멍 메우기) 영역.</div></div>
<div class="issue"><span class="badge" style="color:#a12a2a;background:#fbe6e6">미해결</span><div>orange traffic cone / yellow safety cone 은 어느 집합에도 없어 검출 52 폴리곤이 버려진다. [cone] 그룹이 주석 처리돼 있음 — 나란히 놓인 콘이 한 덩어리로 융합된다는 이유.</div></div> <div class="issue"><span class="badge" style="color:#a12a2a;background:#fbe6e6">미해결</span><div>orange traffic cone / yellow safety cone 은 어느 집합에도 없어 검출 52 폴리곤이 버려진다. [cone] 그룹이 주석 처리돼 있음 — 나란히 놓인 콘이 한 덩어리로 융합된다는 이유.</div></div>