@
docs: 확정 설정 16장 검증 + 4090 이관 지시서 16장 실측 무라벨(conf 0.10): 0.5% ~ 6.4%, 평균 3.44%. 15/16 장이 목표 5% 이하. 같은 16장 기준선 평균은 19.9%. 소요 466~907초/장 (평균 585초). 예상이 틀린 곳: 물 많은 사진이 위험할 것으로 봤으나 0423 이 0.5% 로 16장 중 최저였다. water surface / reservoir 프롬프트가 검출 0 이어도 다른 프롬프트가 그 면적을 덮는다. 유일한 5% 초과인 0581(6.4%)은 큰 구멍이 없다. 구멍 1,554개 중 최대가 0.83%, 상위 6개 합이 2.15% 뿐이고 나머지 4.25%가 작은 조각 1,548개로 흩어져 있다. 자재 야적장·건물 밀집 구역이라 폴리곤이 1,079개 나왔는데도 객체 사이 얇은 틈이 누적된 것이다. 0654 유형(큰 필지 통째 누락)과 다르고 프롬프트로는 못 줄인다. docs/envsetting.md: RTX 4090 PC 로 옮기는 작업 지시 프롬프트. git 이 안 실어 나르는 3가지(체크포인트, 원본 JPEG, venv)와 브랜치 체크아웃 누락 시 증상을 명시했다. docs/pilot/theater_v4/ (뷰어 JPEG 55MB)는 커밋하지 않았다. tools/make_viewer.py 로 다시 구울 수 있다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> @
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
# 다른 PC(RTX 4090)에 SAM 3.1 검출 환경 세우기 — 작업 지시 프롬프트
|
||||
|
||||
이 문서는 그대로 복사해서 새 PC 의 Claude Code(또는 사람)에게 주는 **작업 지시서**다.
|
||||
아래 `---` 사이를 통째로 붙여넣으면 된다.
|
||||
|
||||
측정 근거: RTX 3060 12GB 에서 사진 1장 548초. 4090 24GB 추정 80~180초.
|
||||
자세한 내역은 `docs/pilot/sam_merge.html` 의 단계 기록을 봐라.
|
||||
|
||||
---
|
||||
|
||||
## 지시
|
||||
|
||||
RTX 4090 이 달린 이 PC 에 드론 사진 SAM 3.1 검출 환경을 세워라.
|
||||
목적은 사진 1장을 튜닝된 설정으로 검출해 3060 대비 실제 배속을 재는 것이다.
|
||||
전체 블록 실행은 그 측정 뒤에 결정한다.
|
||||
|
||||
### 전제
|
||||
|
||||
- OS: Windows (원래 환경과 같음). Linux 면 경로 구분자만 바꿔라.
|
||||
- GPU: RTX 4090 24GB. `nvidia-smi` 로 드라이버가 올라와 있는지 먼저 확인해라.
|
||||
- 소스 PC 에서 가져와야 하는 큰 파일이 2종 있다 (아래 3, 4단계). git 에 없다.
|
||||
|
||||
### 1. 리포 2개 clone
|
||||
|
||||
두 리포를 **형제 폴더로** 두어라. `sam3_multi_prompt.py` 가 기본값으로
|
||||
`../sam31server` 를 찾는다 (환경변수 `SAM31SERVER_DIR` 로 바꿀 수 있다).
|
||||
|
||||
```
|
||||
D:\MYCLAUDE_PROJECT\
|
||||
├── railway-client\
|
||||
└── sam31server\
|
||||
```
|
||||
|
||||
```bash
|
||||
git clone https://gitea.hmac.kr/kimminsung/railway-client.git
|
||||
git clone https://gitea.hmac.kr/kimminsung/sam31server.git
|
||||
|
||||
cd railway-client
|
||||
git checkout sam31-coverage-tuning
|
||||
```
|
||||
|
||||
**브랜치 체크아웃을 빠뜨리지 마라.** `main` 에는 튜닝된 프롬프트
|
||||
(`prompts/discovery_v4.txt`)와 집합 정의(`configs/merge_groups_v4.txt`),
|
||||
그리고 `--wide-in-tiles` 플래그가 없다.
|
||||
|
||||
`sam31server` 는 FastAPI 서버지만 **서버를 띄울 필요는 없다.**
|
||||
검출 스크립트는 그 안의 `sam3` 패키지를 `sys.path` 로 직접 import 한다
|
||||
(`tools/sam3_multi_prompt.py:28-33`). `app/` 은 안 쓴다.
|
||||
|
||||
### 2. Python 환경
|
||||
|
||||
venv 를 **복사하지 마라.** 절대경로가 박혀 있어 깨진다. 새로 만들어라.
|
||||
|
||||
원본 환경 (참고용, 실측):
|
||||
- Python 3.12.8
|
||||
- torch 2.10.0+cu126 (CUDA 12.6)
|
||||
|
||||
```bash
|
||||
cd sam31server
|
||||
python -m venv .venv
|
||||
.venv\Scripts\activate
|
||||
|
||||
# torch 는 CUDA 버전에 맞춰 먼저 설치해라 (requirements.txt 의 torch>=2.4.0 보다 우선)
|
||||
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126
|
||||
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
`sam3` 는 pip 설치 대상이 아니다 (site-packages 에 없고 .pth 도 없다).
|
||||
폴더가 있으면 된다. 의존성만 깔면 끝이다.
|
||||
|
||||
설치 확인:
|
||||
```bash
|
||||
.venv\Scripts\python.exe -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))"
|
||||
```
|
||||
`True` 와 `NVIDIA GeForce RTX 4090` 이 나와야 한다.
|
||||
|
||||
### 3. 체크포인트 + BPE 사전 (git 에 없음, 수 GB)
|
||||
|
||||
`.gitignore` 가 `*.pt`, `*.gz` 를 뺀다.
|
||||
|
||||
필요한 것:
|
||||
- `sam3.1_multiplex.pt` — HuggingFace `facebook/sam3.1`
|
||||
- `bpe_simple_vocab_16e6.txt.gz`
|
||||
|
||||
받는 방법 둘 중 하나:
|
||||
1. HuggingFace 에서 새로 받는다 (`huggingface-cli download facebook/sam3.1`)
|
||||
2. 소스 PC 의 HF 캐시를 복사한다
|
||||
(`C:\Users\<사용자>\.cache\huggingface\hub\models--facebook--sam3.1\...`)
|
||||
|
||||
경로 지정은 셋 중 하나 (앞이 우선):
|
||||
1. CLI 인자 `--checkpoint` / `--bpe`
|
||||
2. 환경변수 `SAM3_CHECKPOINT` / `SAM3_BPE`
|
||||
3. `sam31server/configs/auto_labeling/segment_anything_3.yaml` 의
|
||||
`params.model_path` / `params.bpe_path`
|
||||
|
||||
3번 파일에는 **원래 PC 의 절대경로가 적혀 있다.** 그대로 쓰면 파일을 못 찾는다.
|
||||
환경변수로 덮거나 이 파일을 고쳐라.
|
||||
|
||||
### 4. 원본 사진 (git 에 없음, 블록당 약 1.2GB)
|
||||
|
||||
`.gitignore:42` 가 `output/` 을 통째로 뺀다.
|
||||
|
||||
소스 PC 에서 복사해라:
|
||||
```
|
||||
railway-client/output/sam3/stage_BlockYYX/ JPEG 69장, 장당 14~23MB
|
||||
```
|
||||
SMB 공유, rsync, 외장 디스크 아무거나. 방법은 상관없다.
|
||||
|
||||
### 5. 시험 실행 — 사진 1장
|
||||
|
||||
```bash
|
||||
set SAM31SERVER_DIR=D:\MYCLAUDE_PROJECT\sam31server
|
||||
set SAM3_CHECKPOINT=<체크포인트 절대경로>
|
||||
set SAM3_BPE=<BPE 절대경로>
|
||||
|
||||
cd D:\MYCLAUDE_PROJECT\railway-client
|
||||
|
||||
..\sam31server\.venv\Scripts\python.exe tools\sam3_multi_prompt.py ^
|
||||
--input output\sam3\stage_BlockYYX\DJI_20250805165516_0654.JPG ^
|
||||
--output output\sam3\gpu4090_test\DJI_20250805165516_0654_multi.json ^
|
||||
--prompts prompts\discovery_v4.txt ^
|
||||
--wide-prompts prompts\wide_v1.txt --wide-in-tiles ^
|
||||
--cols 6 --rows 4 --conf 0.10 --merge ^
|
||||
--batch 32
|
||||
```
|
||||
|
||||
`--batch 32` 는 24GB 라서 가능하다. 3060 은 VRAM 때문에 16 이 한계였다.
|
||||
OOM 이 나면 24 → 16 으로 낮춰라.
|
||||
|
||||
**비교 기준 (3060 실측, 같은 사진 0654):**
|
||||
|
||||
| 구간 | 3060 |
|
||||
|---|---|
|
||||
| 타일 패스 (24타일 × 6청크 = 144 forward) | 410초 |
|
||||
| 통짜 패스 | 43초 |
|
||||
| 모델 로딩 + NMS + 병합 + 저장 | 약 105초 |
|
||||
| **합계** | **466~662초 (10장 평균 548초)** |
|
||||
|
||||
로그에 찍히는 `전체 1장 완료 — N초` 와 타일별 시간을 그대로 보고해라.
|
||||
|
||||
### 6. 결과 검증
|
||||
|
||||
무라벨(미검출) 지표를 재라. GPU 불필요:
|
||||
|
||||
```bash
|
||||
python tools\coverage_stats.py ^
|
||||
--run-dir output\sam3\gpu4090_test ^
|
||||
--groups configs\merge_groups_v4.txt ^
|
||||
--size 8192,5460
|
||||
```
|
||||
|
||||
0654 는 3060 에서 **무라벨 5.0%** 가 나왔다. 4090 에서도 5% 근처여야 한다.
|
||||
GPU 아키텍처가 달라 비트 단위로 같지는 않지만 소수점 아래에서만 달라야 한다.
|
||||
**1%p 넘게 벌어지면 설정이 다른 것이니 멈추고 보고해라.**
|
||||
|
||||
### 7. 전체 블록 실행 (측정 뒤 지시 받고 할 것)
|
||||
|
||||
`--input` 을 **폴더**로, `--outdir` 로 주면 모델을 한 번만 로딩한다.
|
||||
장별로 프로세스를 새로 띄우면 사진마다 60~90초를 로딩에 버린다.
|
||||
|
||||
```bash
|
||||
..\sam31server\.venv\Scripts\python.exe tools\sam3_multi_prompt.py ^
|
||||
--input output\sam3\stage_BlockYYX --outdir output\sam3\YYX_v4 ^
|
||||
--prompts prompts\discovery_v4.txt ^
|
||||
--wide-prompts prompts\wide_v1.txt --wide-in-tiles ^
|
||||
--cols 6 --rows 4 --conf 0.10 --merge --batch 32
|
||||
```
|
||||
|
||||
끝나면 집합 병합:
|
||||
```bash
|
||||
python tools\merge_labels.py --json <각 _multi.json> --groups configs\merge_groups_v4.txt --gap 2
|
||||
```
|
||||
|
||||
### 8. 결과 회수
|
||||
|
||||
산출 JSON 만 가져오면 된다 — 장당 2~5MB, 69장 약 300MB.
|
||||
집계·병합·뷰어 생성은 GPU 없이 원래 PC 에서 돌린다.
|
||||
|
||||
### 하지 말 것
|
||||
|
||||
- venv 복사 (절대경로 깨짐)
|
||||
- `main` 브랜치로 실행 (튜닝 설정 없음)
|
||||
- FastAPI 서버 기동 (이 작업에 불필요)
|
||||
- 설정값 임의 변경. `--cols 6 --rows 4 --conf 0.10 --wide-in-tiles` 넷이
|
||||
무라벨 16% → 3.6% 를 만든 조합이다. 하나라도 바꾸면 품질이 달라진다.
|
||||
- 측정 안 한 수치 보고. 추정이면 추정이라고 써라.
|
||||
|
||||
---
|
||||
|
||||
## 부록: 이 설정이 나온 근거
|
||||
|
||||
BlockYYX 사진 8~16장 실측. 지표는 "무라벨 화면%" — 마스크 합집합으로 재서
|
||||
겹침을 뺀 값이다.
|
||||
|
||||
| 단계 | 0654 | 0006 |
|
||||
|---|---|---|
|
||||
| 기준선 (conf 0.25, 타일 4×3, 통짜 분리) | 52.1% | 19.4% |
|
||||
| `--wide-in-tiles` | 15.4% | 12.2% |
|
||||
| 경계 띠 프롬프트 +5 (v3) | 14.9% | 11.9% |
|
||||
| conf 0.25 → 0.10 | 9.5% | 5.8% |
|
||||
| 프롬프트 +4 (v4) | 9.6% | 5.7% |
|
||||
| 타일 4×3 → 6×4 | **5.0%** | **5.0%** |
|
||||
|
||||
기여도: 통짜→타일 −36.7pp · conf −5.4pp · 타일 세분화 −4.6pp ·
|
||||
프롬프트 추가 −0.5pp. **프롬프트 추가는 거의 기여하지 않았다.**
|
||||
|
||||
원인은 통짜(1×1) 패스였다. `wide_v1.txt` 의 21개 프롬프트는 8192×5460 을
|
||||
한 장으로 넣어 대상 하나에 인스턴스가 하나만 살아남았다 — 도로는 한쪽 차로만,
|
||||
논은 한 필지만 잡혔다.
|
||||
Reference in New Issue
Block a user