Skip to content

Grape Yield Occlusion UNet Eval 2026 06

ehdwo0427 edited this page Jun 16, 2026 · 2 revisions

🍇 잎 가림 복원 — WGISD 정량 평가 + 자체 UNet 학습 + 드론 검증 (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 측정 + 회귀식 재추정.


0. 우리 현재 위치 (요약)

항목 현 상태
단계 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

1. 평가 인프라 — 학계 표준 dataset에서 정량 비교

1-1. WGISD 데이터셋 활용

항목
출처 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)

1-2. 합성 occlusion 파이프라인

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배 악화).

진짜 포도잎 라이브러리 (120장 중 12장)

real grape leaf library

Occlusion 단계 예시 (한 송이 × 4 ratio, 녹색 = GT)

occlusion progression

입력 데이터 4종 (input / GT / visible / leaf)

4-mask explanation


2. 8가지 복원 방법 정량 비교 (v2, 진짜 잎)

2-1. Mean Weight Error (낮을수록 좋음)

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% 🏆

2-2. 평가 곡선 (occ_ratio 별)

v2 evaluation curves

2-3. 5종 방법 시각 비교 (동일 송이 × 4 ratio)

5 methods aligned comparison

위에서부터: INPUT / LaMa / SDXL / pix2gestalt / UNet (ours). 녹색 윤곽 = GT, UNet cyan = pred mask.

2-4. 핵심 발견

  • 자체 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% — 비용 대비 매우 효율적

2-5. UNet 모델 spec

항목
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

UNet 학습 곡선 (30 epoch)

UNet learning curve

왼쪽: Train Loss / 가운데: Val IoU / 오른쪽: Val Weight Error vs 다른 방법 baseline. ep4 이후 plateau, overfitting 없이 안정적.


3. 진짜 occlusion에서의 검증 — WGISD val 27장

합성이 아닌 실제 잎이 자연스럽게 가린 송이 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 영역까지 정확히 확장

UNet이 가장 효과적이었던 4 사례

WGISD val real test 4-panel

각 row: input | GT (녹색) | SAM3 visible (노란) | UNet pred (cyan). 특히 CSV_1883 b10 (최상단)은 대표적 사례 — SAM3가 송이 절반만 인식한 걸 UNet이 GT까지 정확히 확장.


4. 우리 드론 5장 적용 (V6) — Cross-domain 한계

4-1. 결과 (GSD fallback 버그 수정 후)

사진 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×)

drone 8/13 v6

2025-08-23 (GSD fallback 적용, 그래도 GT 1.24×)

drone 8/23 v6

2025-07-17 (성숙 전, GT 0.6× — 실제로 송이가 덜 큰 시기)

drone 7/17 v6

4-2. 비정상 무게 버그 (10,497g) 진단 → 수정

원인: SAM3 "vertical pole" 검출 실패 시 GSD를 임의로 5.0 mm/px로 fallback. 진짜 GSD 0.4 mm/px → 약 12배 과대 → 면적 144배 → 무게 약 50배 과대.

수정: 직전 성공한 GSD 평균으로 fallback 처리. → 10,497g → 207g (정상).

4-3. "근데 가린 송이 많아 보이는데?" — SAM3 leaf 검출 한계

사진 측정된 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 검출의 실패 모드:

  1. 송이 위에 덮인 잎이 SAM3에서 "송이"로 분류됨 → leaf mask에서 빠짐
  2. SAM3 "grape leaf"는 잎만 보이는 영역 (캐노피 상단) 만 잎으로 분류
  3. → leaf ∩ bunch_mask = 0 → occlusion_ratio = 0
  4. GCNet 보정 + UNet 둘 다 입력 신호 자체가 없어서 작동 안 함

5. 우리 UNet = Leaf-aware Amodal Segmentation

학계 amodal 모델과 비교

모델 입력 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.


6. 진짜 병목 진단

마스크 복원이 아니라 앞 단계가 진짜 한계:

우선순위 병목 영향
⭐⭐⭐ 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)

7. 다음 단계 후보

A. YOLOv11 + SAM3 box-prompt 통합 (가장 우선)

  • 학습된 YOLOv11-large best.pt (mAP@50 0.665) → SAM3에 box prompt로 mask 받기
  • 송이 mask가 잎 너머까지 확장 → occlusion 신호 살아남
  • 예상: 송이 면적 +20~50%, 무게 ±5% 가능

B. 회귀식 재추정

  • 니키힐즈 GT 1,534송이 무게 ↔ 드론 면적 매칭
  • w = K·A^α 계수 재fit (품종별/시기별)
  • 예상 ROI 최대 (±3~5%)

C. UNet drone-domain fine-tune

  • grape_relabeling 작년 데이터 (test 29 + train 64 + valid 18)
  • bbox 라벨링뿐이라 SAM3로 pseudo-mask GT 생성
  • 합성 occlusion + drone 도메인 fine-tune
  • A 완료 후에야 의미 있음

D. 잎 detector 별도 학습

  • grape_relabeling test 29장에 leaf 라벨링 추가
  • SAM3 zero-shot 의존 탈피

7-bonus. 검증 — 우리 학습 YOLOv11 vs SAM3 zero-shot (충격 발견)

V7 (YOLO + SAM3 box-prompt + UNet) 통합을 시도했는데 우리 드론 5장에서 YOLO가 송이를 너무 적게 잡음. 5장은 통계적으로 적으니 grape_relabeling/test 29장 (YOLO 학습 시 test set, bbox GT 363 송이) 으로 정밀 평가.

결과 (iou_thr=0.5)

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 진단 sweep — 7 ckpt × 5 conf × 3 imgsz

모든 후보 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 라벨링 분포 차이

원인 증거
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 위치는 일부 맞지만 작은 송이 누락

시각 비교 (녹색 = GT, 노란 = SAM3, 청록 = YOLO)

relabeling test vis 1

relabeling test vis 4

→ SAM3는 작은 송이까지 잘 잡지만 YOLO는 큰/명확한 송이만 검출.

결정

  • V3 (SAM3 단독) 유지 — F1 0.75로 학습 모델보다 우수
  • ❌ YOLO 통합 (V7) 폐기
  • 다음 우선순위: GSD 보강 + 회귀식 재추정 (검출은 SAM3로 OK)

8. 정직한 한계 (반드시 명시)

  1. 합성 occlusion ≠ 실제 잎 가림 — procedural 잎 (v1)은 카툰풍, 진짜 잎 (v2) 으로 교체했으나 paste 방식이라 depth/3D 구조 부족
  2. WGISD는 근접 사진 — 드론 nadir view와 도메인 다름 (cross-domain 한계 확인됨)
  3. UNet은 leaf-aware — leaf 입력이 부정확하면 baseline와 동일 결과
  4. GT mask는 2D projected — 실제 송이 3D 형태와 차이
  5. drone GT 167g — 한 시기 한 품종 단일 값, 일반화 한계

9. 참고

Woody's AI Backend Engineering Log


💼 About

Deepvisions | AI Engineer 2026.03 ~ 재직중


🚀 Projects (최신순)

CCTV 자전거 경로 & 공회전 탐지 — 한동대학교 리빙랩

2026.05 ~ | @ Deepvisions 캠퍼스 CCTV 4대 · 자전거 OCR + 차량 공회전 다중 신호

야생동물 탐지 — RPi 엣지 배포

2026.04 ~ | @ Deepvisions 포도밭 침입 탐지 (5종 multi-class · 라즈베리파이 4 실시간)

포도밭 병해충 탐지 및 수확량 예측

2026.03 ~ | @ Deepvisions 드론 이미지 기반 객체 탐지 + GSD calibration + 수확량 예측


📦 종료된 프로젝트

OnTheTop

2025.03 ~ 2025.08 | 카카오테크부트캠프 | ✅ 종료 AI 기반 데스크테리어 추천 서비스


AI Notes


About

Clone this wiki locally