-
Notifications
You must be signed in to change notification settings - Fork 0
Grape Yield Occlusion UNet Eval 2026 06
이전 페이지: Grape-Yield-Research-Synthesis-2026-05 (학계 종합 + 적용 로드맵) 본 페이지: WGISD 데이터셋으로 8가지 occlusion 복원 방법 정량 비교 + 자체 UNet 학습 + 드론 적용 + 한계 진단
WGISD 137장에 진짜 포도잎 합성 occlusion (2,732 sample) 만들어서 baseline / GCNet / SAM2 / LaMa / SDXL / pix2gestalt / 자체 UNet 8가지 비교 평가. 자체 UNet (14.3M params)이 weight_err 1.8%로 학계 SOTA (Quiñones GCNet 17%) 압도. 단 우리 드론 nadir view에선 효과 없음 — SAM3가 송이 위 잎을 잎으로 인식 못 해 occlusion 신호 자체가 0%. 결론: 드론 정확도의 진짜 병목은 마스크 복원이 아니라 SAM3 leaf 검출 + GSD 측정 + 회귀식 재추정.
| 항목 | 현 상태 |
|---|---|
| 단계 | PoC → drone 적용 검증 단계 |
| 검출 | SAM3 text-prompt ("grape bunch" / "grape leaf" / "vertical pole") |
| Reference | 트렐리스 기둥 80mm 지름 |
| 무게 식 | w = 11.74 · A^0.78 (변경 없음, 재추정 필요) |
| 드론 test set | DJI Zenmuse P1 5장 (수확량 테스트용) |
| 학습 모델 (신규) | 자체 UNet amodal segmentation (14.3M params, 57MB) |
| 학습 데이터 | WGISD 137장 × 진짜 잎 4단계 occlusion = 2,732 sample |
| 항목 | 값 |
|---|---|
| 출처 | Embrapa (Brazil), CC BY 4.0 |
| 이미지 | 300장 grape bunch, 137장 GT mask 있음 |
| 사이즈 | 2048×1365 (close-up, our grape_relabeling과 동일) |
| 품종 | Chardonnay / Cabernet Franc / Cabernet Sauvignon / Sauvignon Blanc / Syrah |
| GT mask | 2,020 송이 binary mask (.npz) |
WGISD 137장 (송이 GT mask 보유)
↓
[STEP 1] 진짜 포도잎 추출
WGISD 사진 → SAM3 "grape leaf" → 120장 RGBA library
↓
[STEP 2] 합성 occlusion
GT mask 위에 잎 RGBA random paste
occ_ratio = 10% / 30% / 50% / 70% (4 단계)
= 2,732 sample × (image, GT, visible, leaf) 4 파일
↓
[STEP 3] 8가지 복원 알고리즘에 동일 입력
↓
[STEP 4] 평가 metric
- IoU (송이 mask 정확도)
- Area error (면적 오차율)
- Weight error (w = 11.74·A^0.78 적용)
중요: 처음에는 procedural (cartoon) 잎으로 평가했는데 사용자 지적으로 진짜 잎(SAM3 추출)으로 교체. v1(cartoon) 결과는 inpainting 능력 과대평가로 확인됨 (LaMa weight_err 7% → 14.8%로 2배 악화).
| method | r10 | r30 | r50 | r70 | all |
|---|---|---|---|---|---|
| Baseline (visible only) | 8.1% | 27.4% | 46.0% | 63.1% | 36.1% |
| GCNet bbox-est | 2.5% | 8.7% | 17.0% | 27.0% | 13.8% |
| GCNet oracle (이론 상한) | 0% | 0% | 0% | 0% | 0% |
| SAM2 amodal prompt | 29.7% | 30.4% | 32.8% | 34.6% | 31.9% |
| LaMa inpaint | 2.4% | 10.2% | 21.2% | 25.4% | 14.8% |
| SDXL inpaint | 3.0% | 8.7% | 15.4% | 20.3% | 11.8% |
| pix2gestalt | 87% | 87% | 87% | 87% | 87% (mask 추출 실패) |
| UNet (ours) ⭐ | 0.3% | 1.1% | 2.6% | 3.3% | 1.8% 🏆 |
위에서부터: INPUT / LaMa / SDXL / pix2gestalt / UNet (ours). 녹색 윤곽 = GT, UNet cyan = pred mask.
- 자체 UNet이 압도적 1위 — 학계 SOTA (Quiñones 2025 GCNet 17%) 능가
- SDXL/LaMa 같은 inpainting은 진짜 잎에서 11-15% (cartoon 7% 대비 2배 악화)
- pix2gestalt는 mask 추출 단계 (whole RGB → background threshold) 가 우리 도메인에 안 맞아 실패
- GCNet bbox correction (모델 X)도 13.8% — 비용 대비 매우 효율적
| 항목 | 값 |
|---|---|
| Architecture | ResNet18 encoder + UNet decoder |
| Params | 14.3M (57MB) |
| 입력 | 5채널 (RGB + visible mask + leaf mask) |
| 출력 | 1채널 (GT mask probability) |
| 손실 | BCE + Dice |
| 학습 | 30 epoch, AdamW lr=1e-4, image-level 80/20 split |
왼쪽: Train Loss / 가운데: Val IoU / 오른쪽: Val Weight Error vs 다른 방법 baseline. ep4 이후 plateau, overfitting 없이 안정적.
합성이 아닌 실제 잎이 자연스럽게 가린 송이 379개에서 검증.
| method | IoU | area_err | weight_err |
|---|---|---|---|
| SAM3 visible only (baseline) | 0.734 | 56.2% | 37.3% |
| UNet prediction | 0.710 | 36.6% | 26.2% |
- 합성(1.8%) → 진짜(26.2%) 격차 큰 이유: 합성은 visible/leaf mask가 정확(GT 기반), 진짜는 SAM3 검출(부정확) → UNet은 입력 노이즈를 그대로 전파
- 그래도 baseline 대비 30% 개선 (37.3% → 26.2%)
- 특히 SAM3가 송이를 작게 잡은 경우 UNet이 GT 영역까지 정확히 확장
각 row: input | GT (녹색) | SAM3 visible (노란) | UNet pred (cyan). 특히 CSV_1883 b10 (최상단)은 대표적 사례 — SAM3가 송이 절반만 인식한 걸 UNet이 GT까지 정확히 확장.
| 사진 | n 송이 | GSD (mm/px) | V3 base avg | V6 UNet avg | vs GT 167g |
|---|---|---|---|---|---|
| 2025-07-10 | 3 | 0.36 ✅ | 128g | 128g | 0.77× |
| 2025-07-17 |
45 | 0.37 fallback | 100g | 105g | 0.60× (성숙 전) |
| 2025-08-13 | 19 | 0.44 ✅ | 173g | 175g | 1.03× ✅ |
| 2025-08-23 |
10 | 0.40 fallback | 207g | 207g | 1.24× ✅ |
| 2025-09-12 | 13 | 0.38 ✅ | 163g | 163g | 0.98× ✅ |
→ 수확 시점은 GT ±5~25% 안. UNet 효과 거의 없음 (≤1.5%).
2025-08-13 (가장 정확, GT 1.03×)
2025-08-23 (GSD fallback 적용, 그래도 GT 1.24×)
2025-07-17 (성숙 전, GT 0.6× — 실제로 송이가 덜 큰 시기)
원인: SAM3 "vertical pole" 검출 실패 시 GSD를 임의로 5.0 mm/px로 fallback. 진짜 GSD 0.4 mm/px → 약 12배 과대 → 면적 144배 → 무게 약 50배 과대.
수정: 직전 성공한 GSD 평균으로 fallback 처리. → 10,497g → 207g (정상).
| 사진 | 측정된 occ_ratio (max / mean) |
|---|---|
| 7/10 | 0% / 0% |
| 7/17 | 0.18% / 0.01% |
| 8/13 | 3.23% / 0.21% |
| 8/23 | 0% / 0% |
| 9/12 | 0% / 0% |
SAM3 leaf 검출의 실패 모드:
- 송이 위에 덮인 잎이 SAM3에서 "송이"로 분류됨 → leaf mask에서 빠짐
- SAM3 "grape leaf"는 잎만 보이는 영역 (캐노피 상단) 만 잎으로 분류
- → leaf ∩ bunch_mask = 0 → occlusion_ratio = 0
- → GCNet 보정 + UNet 둘 다 입력 신호 자체가 없어서 작동 안 함
| 모델 | 입력 | occluder 신호 | 학습 데이터 | 크기 |
|---|---|---|---|---|
| AISFormer (BMVC 2022) | RGB + bbox | 암묵적 | COCO-A, KINS | 큼 |
| ORCNN (Géné-Mola 2023) | RGB | 암묵적 | apple | 중 |
| pix2gestalt (CVPR 2024) | RGB + visible | 암묵적 | LAION + SD fine-tune | 4GB |
| Amodal SAM 류 | RGB + bbox/point | 암묵적 | COCO-A | 90M~600M |
| UNet (ours) | RGB + visible + leaf | 명시적 | grape only | 14.3M |
특징: occluder(잎) 정보를 명시적 입력 → leaf detector 정확도에 의존. 합성에서는 1.8%지만 진짜 drone에선 leaf 검출 실패로 효과 0.
마스크 복원이 아니라 앞 단계가 진짜 한계:
| 우선순위 | 병목 | 영향 |
|---|---|---|
| ⭐⭐⭐ | SAM3 leaf-on-bunch 검출 실패 | occlusion 신호 0 → 모든 보정 모델 무력화 |
| ⭐⭐⭐ | 회귀식 w = 11.74·A^0.78 |
nadir-domain 미적합. 우리 GT 1,534송이 활용 가능 |
| ⭐⭐ | SAM3 송이 mask 작게 잡힘 | 송이 위 잎을 송이로 인식 X → 면적 과소 |
| ⭐⭐ | 검출에 자체 학습 YOLOv11 안 씀 | 이미 학습된 best.pt 있는데 SAM3 zero-shot 사용 중 |
| ✅ | GSD fallback 버그 | 수정 완료 (10,497g → 207g) |
- 학습된 YOLOv11-large best.pt (mAP@50 0.665) → SAM3에 box prompt로 mask 받기
- 송이 mask가 잎 너머까지 확장 → occlusion 신호 살아남
- 예상: 송이 면적 +20~50%, 무게 ±5% 가능
- 니키힐즈 GT 1,534송이 무게 ↔ 드론 면적 매칭
-
w = K·A^α계수 재fit (품종별/시기별) - 예상 ROI 최대 (±3~5%)
-
grape_relabeling작년 데이터 (test 29 + train 64 + valid 18) - bbox 라벨링뿐이라 SAM3로 pseudo-mask GT 생성
- 합성 occlusion + drone 도메인 fine-tune
- A 완료 후에야 의미 있음
-
grape_relabelingtest 29장에 leaf 라벨링 추가 - SAM3 zero-shot 의존 탈피
V7 (YOLO + SAM3 box-prompt + UNet) 통합을 시도했는데 우리 드론 5장에서 YOLO가 송이를 너무 적게 잡음. 5장은 통계적으로 적으니 grape_relabeling/test 29장 (YOLO 학습 시 test set, bbox GT 363 송이) 으로 정밀 평가.
| Method | conf | imgsz | P | R | F1 |
|---|---|---|---|---|---|
| V3 SAM3 zero-shot "grape bunch" | 0.25 | orig 2048 | 0.78 | 0.72 | 0.75 🏆 |
| V7 YOLOv11-large (mixed) | 0.25 | 1280 | 0.68 | 0.24 | 0.35 |
→ SAM3 zero-shot이 우리 학습 YOLO보다 F1 2배 좋음.
모든 후보 YOLO의 best F1 (iou=0.5):
| ckpt | best conf | best imgsz | P | R | F1 |
|---|---|---|---|---|---|
| yolo11l_wgisd_then_mixed | 0.05 | 1792 | 0.62 | 0.32 | 0.42 |
| yolo11m_wgisd_then_mixed | 0.05 | 1792 | 0.57 | 0.36 | 0.44 (YOLO 최고) |
| yolo26m_wgisd_then_mixed | 0.05 | 1536 | 0.53 | 0.32 | 0.40 |
| phase2_v11l_joint | 0.05 | 1792 | 0.62 | 0.30 | 0.40 |
| phase2_v11m_joint | 0.05 | 1280 | 0.46 | 0.36 | 0.41 |
| phase2_v11m_joint_img1536 | 0.05 | 1792 | 0.62 | 0.25 | 0.36 |
| phase2_v26m_joint | 0.05 | 1536 | 0.54 | 0.34 | 0.42 |
- conf 0.25→0.05로 낮춰도 Recall 0.36 한계
- imgsz 1280→1792로 키워도 Recall 0.36 한계
- 모든 ckpt가 F1 0.36~0.44 범위 → 학습 자체의 구조적 한계
| 원인 | 증거 |
|---|---|
| test labeling이 빡빡 (작은/먼/가려진 송이까지 GT) | GT 363/29 = 사진당 12.5 송이 |
| YOLO 학습 데이터는 visible/명확한 송이만 GT 가능성 | conf 0.05까지 낮춰도 Recall 0.36 |
| iou=0.3 loose 매칭에서도 R=0.49 | YOLO 위치는 일부 맞지만 작은 송이 누락 |
→ SAM3는 작은 송이까지 잘 잡지만 YOLO는 큰/명확한 송이만 검출.
- ✅ V3 (SAM3 단독) 유지 — F1 0.75로 학습 모델보다 우수
- ❌ YOLO 통합 (V7) 폐기
- 다음 우선순위: GSD 보강 + 회귀식 재추정 (검출은 SAM3로 OK)
- 합성 occlusion ≠ 실제 잎 가림 — procedural 잎 (v1)은 카툰풍, 진짜 잎 (v2) 으로 교체했으나 paste 방식이라 depth/3D 구조 부족
- WGISD는 근접 사진 — 드론 nadir view와 도메인 다름 (cross-domain 한계 확인됨)
- UNet은 leaf-aware — leaf 입력이 부정확하면 baseline와 동일 결과
- GT mask는 2D projected — 실제 송이 3D 형태와 차이
- drone GT 167g — 한 시기 한 품종 단일 값, 일반화 한계
- GCNet (Quiñones 2025): https://pmc.ncbi.nlm.nih.gov/articles/PMC11856392/
- ORCNN apple (Géné-Mola 2023): https://www.sciencedirect.com/science/article/pii/S0168169923002429
- pix2gestalt (CVPR 2024): https://arxiv.org/abs/2401.14398
- WGISD: https://github.com/thsant/wgisd
- 이전 wiki: Grape-Yield-Research-Synthesis-2026-05
Deepvisions | AI Engineer 2026.03 ~ 재직중
2026.05 ~ | @ Deepvisions 캠퍼스 CCTV 4대 · 자전거 OCR + 차량 공회전 다중 신호
2026.04 ~ | @ Deepvisions 포도밭 침입 탐지 (5종 multi-class · 라즈베리파이 4 실시간)
2026.03 ~ | @ Deepvisions 드론 이미지 기반 객체 탐지 + GSD calibration + 수확량 예측
- 프로젝트 메인
- 관련 연구 종합 + 한계 (2026-05) ← 최신
- 수확량 close-up 4장 + 3-Model (2026-05-19)
- 드론 포도 수확량 예측 — 파이프라인 (2026-05)
- 드론 포도송이 탐지 — 학습 변천사 (2026-04)
- SAM3 vs Fine-tuned YOLO
- Grounding DINO vs YOLO Top3 비교 요약
- YOLO Baseline Top3 비교 요약
- YOLO Model Comparison Summary
- 포도 탐지를 위한 데이터 수집
- 포도 수확량 측정을 위한 Object Detection
2025.03 ~ 2025.08 | 카카오테크부트캠프 | ✅ 종료 AI 기반 데스크테리어 추천 서비스
- Name: Woody (이동재)
- Focus: Vision AI, LLM Integration, Backend Engineering
- GitHub: @ehdwo0427
- Email: ehdwo0427@naver.com
- 포트폴리오 : 포트폴리오











