Skip to content

Drone Detection Progression 2026 04

ehdwo0427 edited this page May 7, 2026 · 4 revisions

드론 포도송이 탐지 — 학습 변천사 (Progression) 2026-04

작성일: 2026-04-24

문서 역할

드론 이미지 기반 포도송이(grape bunch) 탐지를 단계적으로 개선해 온 변천사 기록. 결과 숫자보다 "왜 그렇게 결정했고, 왜 좋아졌고/나빠졌는가" 에 포커스를 둔다.

어디서 들어와서 어디로 이어지나

이 문서는 다음 흐름의 결산 위치에 있다.

순서 문서 이 문서에서 무엇을 가져오나
1 포도밭 병해충 탐지 및 수확량 예측 프로젝트 전체 동기와 문제 정의
2 포도 탐지를 위한 데이터 수집 사용한 데이터셋의 출처와 구성
3 YOLO Model Comparison Summary YOLO 계열 baseline 비교의 출발점
4 YOLO Baseline Top3 비교 요약 baseline 시점에서의 model selection 근거
5 Grounding DINO vs YOLO 비교 요약 다른 detector family와의 비교
6 SAM3 vs Fine-tuned YOLO on Drone Imagery foundation model 검증
7 이 문서 (Progression) 위 흐름의 결산 + 다음 단계 의사결정

이 문서를 처음 보는 경우 위에서부터 1→7 순서로 읽으면 자연스럽다. 단계별 결정의 이유가 어떻게 누적되어 왔는지 알 수 있다.


한눈에 보기

항목
평가셋 드론 test split 29장, GT bbox 363개
주 metric mAP50-95 (단일 IoU만으로는 박스 품질 차이를 못 잡음)
현재 best yolov8m + (open ∪ drone×100) mixed 학습, mAP50-95 = 0.286 (S2)
Stage A 결과 yolo11m@1280 → mAP50-95 = 0.257 (−0.029, 빗나감)
Stage B2 결과 yolo11m@1536 → mAP50-95 = 0.251 (−0.035, 빗나감)
시사점 "더 큰 모델/더 큰 입력" 축은 64장 train data에서는 효과 없음. 데이터 축으로 다음 시도 전환

변천사 mAP50 / mAP50-95 line chart Stage별 mAP50 (좌) 및 mAP50-95 (우) 변천. S2 (mixed-best) 가 정점, A/B2는 빗나감


단계별 결과 — 한 표로

Stage 한 줄 변경 사항 mAP50 mAP50-95 한 줄 평가
S0 yolov8m, 최소 aug 0.486 0.210 출발선
S1a + 강한 aug (mosaic 0.5, mixup 0.1, hsv/회전/스케일 ↑) 0.574 0.281 aug 단독으로 +0.07, 가장 큰 단일 도약
S1b + 타일링만 0.505 0.219 단독은 효과 미미
S1c + freeze backbone 0.496 0.208 오히려 하락
S1d + 강한 aug + 타일링 0.567 0.250 aug 단독보다 못함
S1e + copy_paste 0.5 0.590 0.277 aug와 비슷
S1f + copy_paste 0.3 0.594 0.274 aug와 비슷
S2 + mixed (open ∪ drone×100) 0.650 0.286 현재 best, 데이터 합성 효과
S2-aux + SAM3 mask로 박스 refine 다양 recall ↑이지만 mAP50-95 ↓ (라벨 스타일 충돌)
S2-aux + base/TTA/SAHI/WBF 앙상블 0.576 0.216 single 모델 미만
A 모델만 yolov8m → yolo11m 0.595 0.257 빗나감 (이유는 아래 해석)
B1 + yolo11m → yolo11l (capacity ↑) 보류 (A/B2 결과 보고 결정)
B2 + imgsz 1280 → 1536 (해상도 ↑) 0.548 0.251 빗나감 (이유는 아래 해석)

Stage 그룹별 mAP 막대 비교 Baseline / Augmentation / Data mix / SAM3 refine / Model-Resolution / Ensemble 6 그룹별 mAP50, mAP50-95 비교


"왜?" — 단계별 의사결정과 해석

S0 → S1: Augmentation 강화

왜 시도했나? drone 데이터가 64장으로 작다. 모델이 이 적은 분포에 overfit 하지 않으려면 입력 다양성을 인위적으로 늘려야 한다.

왜 가장 큰 도약이 일어났나? mosaic이 한 step에서 4장을 한 캔버스로 합치고 매번 다른 random seed가 적용되므로, 같은 이미지라도 모델이 보는 입력 텐서는 매번 다르다. 작은 데이터셋에서는 이런 합성 다양성이 진짜 데이터 추가와 비슷한 효과를 낸다.

왜 일부 변형은 효과가 없거나 음수였나?

변형 결과 왜?
타일링 단독 (S1b) 효과 미미 학습 시 random crop+scale로 비슷한 효과가 이미 발생
freeze backbone (S1c) 하락 drone 도메인이 pretrained source와 충분히 달라서 backbone fine-tune 필요
copy_paste (S1e/f) aug와 비슷 객체 다양성보다 배경/맥락 다양성이 부족한 도메인

S1 → S2: 데이터 mix와 oversampling

출발한 문제

S1에서 augmentation만으로 mAP50-95가 0.281까지 올라왔지만 거기서 plateau. 모델이 보는 이미지 자체의 진짜 다양성이 부족하다는 한계가 보였다. drone train 64장은 augment를 아무리 강하게 해도 결국 64장 안의 변형일 뿐이다.

손에 있는 자원

데이터셋 장 수 도메인 비고
drone (재라벨링, 학습 대상 도메인) 64 우리가 잘 하고 싶은 진짜 분포 test 29장도 같은 도메인
open dataset (외부, 같은 객체 클래스) 7,341 다른 카메라/촬영 조건의 grape 도메인 갭 있음

단순 합치면 왜 안 되나 — 첫 번째 사고

시나리오 학습 시 drone이 보일 빈도 문제
drone만 (S1까지) 100% 다양성 한계, plateau
단순 합치기 (drone 64 + open 7341) 0.86% drone 도메인이 학습에서 사실상 묻힘
drone × N 복제 (oversample) N에 따라 조정 가능 dataloader가 같은 라인 여러 번 sampling

drone을 그대로 합치면 7341장의 open이 압도적이라 모델이 "open 분포"를 학습한다. test는 drone 분포라 일반화 망함. 그래서 drone 비중을 인위적으로 올리는 oversample이 필요했다.

왜 정확히 100배인가 — 두 번째 사고

여러 비율이 가능했지만 100을 선택한 이유:

비율 drone 비중 우려
×10 8% 여전히 open이 dominant. drone이 묻힘
×50 30% 적정 부근이지만 open 우위
×100 47% 거의 1:1, balanced
×200 64% 같은 64장의 단순 반복 비중 ↑ → overfit 위험 ↑
×500 81% 사실상 drone-only에 open 양념. S1으로 회귀

47% 부근이 직관적으로 자연스럽다. 모델이 두 도메인을 거의 균등하게 본다.

왜 같은 이미지 100번이 단순 메모리 복제가 아닌가 — 세 번째 사고 (가장 자주 받는 질문)

manifest의 같은 라인을 100번 적어놓으면 처음에는 "동일 이미지를 100번 학습? 의미 없는 메모리 복제 아닌가?" 싶다. 핵심은 dataloader가 매 sampling마다 random augmentation을 새로 적용한다는 점.

메커니즘 같은 64장이지만 매번 다르게 보이는 이유
hsv / 회전 / 스케일 / flip 매 step random seed가 다름 → 같은 이미지가 매번 다른 색/각도/크기
mosaic (mosaic=0.5) 50% 확률로 base 1장 + 추가 3장이 한 캔버스로 합쳐짐. 추가 3장은 manifest 13,741에서 random sample → 조합이 사실상 무한
mixup (mixup=0.1) 두 이미지를 alpha blend. 같은 base가 매번 다른 partner와 섞임
random crop / shear 한 이미지의 다른 부분이 잘려 보임

특히 mosaic이 결정적이다. drone 한 장을 base로 뽑았을 때 mosaic 슬롯의 다른 3장 중 일부는 open dataset에서 옴. 즉 매 mosaic 캔버스가 drone-open 혼합 패턴이 되고, 모델이 두 분포가 섞인 입력을 학습하게 된다.

비유하면: 64장의 카드 + 7341장의 다른 카드가 한 덱에 있고, 매 라운드 4장을 콜라주로 합쳐 보여줌. drone 카드가 100번 들어있어 자주 base로 뽑히지만, 매 라운드의 시각 자극은 매번 unique.

효과와 한계

지표 결과
mAP50-95 0.281 → 0.286 (+0.005)
mAP50 0.574 → 0.650 (+0.076, 큰 도약)
학습 안정성 val_loss 분산이 눈에 띄게 줄어듦
overfit 신호 drone-only 학습 대비 약화

큰 도약은 mAP50에서 일어났고, mAP50-95 도약은 작았다. 이게 의미하는 것: open data 추가는 어떤 송이가 송이인지를 더 잘 알게 해주지만 (mAP50), 박스 위치 정확도(strict IoU)는 drone 라벨 품질이 더 결정적이다.

한계와 다음 후보

한계 설명
Information ceiling 64장 원본의 진짜 정보(다른 시기/각도/품종)는 늘어나지 않음. augment는 변형만 만듦
×N의 sweet spot ×100이 직관적이지만 ×50/×200 비교를 명시적으로 한 적은 없음
Test 분포가 train과 매우 다르면 drone 64장과 test 29장이 같은 도메인이라 효과를 봤음. 더 다른 분포면 효과 작음

→ "drone × 50/×200 ablation"을 다음 시도 후보에 넣어둠.


S2-aux: SAM3 mask refine — 효과가 음수였던 사례

왜 시도했나? YOLO 박스는 약간 loose하다. SAM3로 정확한 mask를 만들고 그 mask의 tight한 bounding rectangle로 박스를 다시 만들면 IoU가 올라갈 거라 기대.

왜 빗나갔나?

사실 결과
SAM3 mask 품질 자체는 양호 (IoU 0.85) OK
GT 박스가 사람이 그린 loose한 박스 문제 발생
SAM3 tight 박스 ↔ GT loose 박스 매칭 시 IoU 손실 recall ↑, mAP50-95 ↓

일반화할 수 있는 교훈:

후처리로 박스 정밀도를 올리는 건 GT 라벨 스타일과 호환될 때만 의미가 있다. GT가 loose하면 예측도 loose해야 점수가 잘 나온다. 이건 metric의 한계지 모델 품질의 한계가 아니다.


S2-aux: WBF 앙상블 — single 모델을 못 이긴 사례

구성: S2 best 모델 1개를 base / TTA / SAHI 세 가지로 추론 후 Weighted Boxes Fusion.

왜 빗나갔나?

앙상블 효과 조건 우리 시도의 문제
서로 다른 결정 경계의 모델들 같은 모델의 inference variant는 결정 경계가 거의 같음
TTA = 약간 다른 view, 같은 모델 추가 정보 거의 없음
SAHI = sliced inference 큰 객체에서 손해, 작은 객체에 약간 ↑

일반화할 수 있는 교훈:

앙상블을 시도하려면 서로 다른 architecture, 또는 적어도 다른 training schedule로 학습된 여러 모델이 있어야 한다. 같은 모델 inference variant 합치기는 효과가 작다.


S2 → A: 모델 architecture 변경 (yolov8m → yolo11m)

왜 시도했나? yolo11은 신형 architecture 블록 (C3k2, C2PSA)을 도입. 동일 데이터/aug에서 모델만 바꿔서 architecture 효과를 측정.

결과: mAP50-95 0.286 → 0.257. 빗나감.

왜 빗나갔나? — training log를 보면 단서가 보임

epoch mAP50-95 관찰
1 0.310 이 시점이 최고
2 0.248 급락
3 0.212 더 떨어짐
... ... 회복 시도
14 0.263 일부 회복
18 0.271 early-stop 발동

이게 시사하는 것:

wgisd-pretrained weights에 이미 충분한 일반화가 있었고, mixed dataset으로 fine-tune이 모델을 다른 분포로 끌고 가버린 형태. 즉 "mixed data로 fine-tune이 항상 좋다"는 가정이 yolo11m에는 적용되지 않음.

왜 yolov8m에는 적용되고 yolo11m에는 안 됐나? (가설들)

가설 설명
1. learning rate 차이 hyperparam이 yolov8m 기준. yolo11m에는 더 보수적인 schedule 필요 가능
2. patience 너무 짧음 epoch 18 stop. 더 멀리 갔으면 회복했을지 확신 불가
3. architecture가 도메인에 약함 C3k2/C2PSA가 일반 객체에 강해도, 1280px 드론의 작은 송이에는 다를 수 있음

다음 시도 (B1, B2)에서 검증할 것:

  • B1 yolo11l: 더 큰 모델이면 회복하나? → capacity 부족이 원인이었는지 검증
  • B2 imgsz 1536: 해상도가 결정적 축이면 yolo11m@1536 > yolo11m@1280 일 것

S2 → B2: 입력 해상도 변경 (imgsz 1280 → 1536)

왜 시도했나? drone bbox 분포 분석 결과 norm area median 0.0016 (1280px 기준 ~50×80px). 작은 송이가 다수다. 입력 해상도를 ↑하면 작은 송이 detection이 회복될 거라 기대.

설정 변경:

항목 Stage A Stage B2
모델 yolo11m yolo11m (동일)
데이터/aug mixed (open ∪ drone×100) 동일
imgsz 1280 1536 (↑)
BATCH 8 4 (해상도↑로 메모리↑)
patience 10 15 (Stage A 회고 반영, 더 길게)
epochs 50 50

결과: mAP50-95 0.286 (S2 best) → 0.251. 또 빗나감. Stage A보다 더 떨어짐.

training log 관찰:

epoch mAP50-95 (val) 해석
1 0.269 시작
5 0.301 warmup 후 도달
10 0.303 val 최고점
13 0.303 plateau
25 0.280 (early-stop) 하강 후 stop

val 기준으로는 epoch 10 부근이 best였는데, test split 평가에서는 0.251. 이건 두 split 사이 분포가 다르거나, val 18장이 너무 적어 selection이 noisy하다는 신호.

yolo11m@1280 vs @1536 epoch별 val mAP + test 결과 A (yolo11m@1280) 와 B2 (yolo11m@1536) 의 val mAP50-95 추이. 회색 점선 = mixed-best (S2) test 기준점. val 정점이 test에서 재현 안 됨

왜 빗나갔나? — 단순 "해상도 ↑"가 답이 아닌 이유

가설 근거
1. train/test 분포 미스매치 val 18장에서 best였던 weights가 test 29장에서는 underperform. 두 split이 동질적이지 않음
2. 데이터 부족 + 큰 입력 drone train 64장만 있는데 입력 해상도↑ → 모델이 과한 detail에 fit하면서 일반화 떨어짐
3. mosaic 효과 약화 imgsz↑ + BATCH↓ (8→4) → 한 step에서 모델이 보는 이미지 수↓ → mosaic의 다양성 효과↓
4. Recall 급락 P 0.668 → 0.718 (↑), R 0.493 → 0.399 (↓). 모델이 confident할 때만 예측 → 놓치는 송이↑

가장 의심스러운 건 3, 4번 조합. 해상도가 크면 한 송이가 더 많은 픽셀로 보여 confident detection은 늘지만, batch가 줄어 학습 다양성이 떨어지면서 robust한 recall은 떨어지는 trade-off.


Stage A + B2 종합 해석 — 두 가설 모두 빗나간 의미

시도 변경 축 mAP50-95 변화 결론
Stage A 모델 architecture (yolov8m → yolo11m) -0.029 신형이 우리 도메인에 약함
Stage B2 입력 해상도 (1280 → 1536) -0.035 해상도↑가 효과 없음
공통 모델/입력 축은 막혔다

현재 가설: drone 64장의 정보량이 진짜 ceiling. 모델/해상도 같은 "표현력 ↑" 축은 데이터가 받쳐주지 않으면 오히려 overfit/noise. 의미 있는 다음 도약은:

  • 데이터 측면: drone 데이터를 더 라벨링 (현실적이지만 비용 큼) 또는 oversample 비율 sweep (×50/×200)
  • 라벨 형식: OBB(rotated detection)로 박스 정보를 더 활용
  • 학습 schedule: epochs↑ + patience↑로 yolo11m이 더 멀리 가는지 확인 (가능성 낮음)

Stage B1 (yolo11l) 재평가:

A/B2 패턴이 "더 큰 모델/해상도 = 음수"라면, B1 (yolo11l, 더 큰 모델)도 같은 결과 가능성 높음. 하지만 변천사 완성 + 가설의 명확한 반증을 위해 한 번은 돌릴 가치 있음. 음수 결과도 데이터다.


회고: 무엇을 잘하고 무엇을 놓쳤나

잘했다고 생각하는 것

# 결정 왜 좋았나
1 결과물 인벤토리 먼저 "재학습 필요한 것"과 "이미 결과 있는 것"을 분리해 시간 절약
2 한 번에 한 축만 변경 Stage A/B1/B2가 model arch / capacity / resolution 직교라 결과 해석 깔끔
3 변천사 자동 수집 스크립트 손으로 표 옮기지 않고 코드가 모든 metric 자동 수집
4 안전 영역에서 시작해 부하 점진 증가 OOM/시스템 다운의 손실 >> 보수적 시작의 비용

다시 결정하고 싶은 것

# 결정 무엇이 잘못됐나
1 batch를 한 번에 16까지 키움 시스템 한계점 초과 → 학습 도중 시스템 다운. 8 → 12 → 16 단계적이 맞았음
2 yolo11m에 yolov8m과 같은 patience 사용 새 모델은 다른 학습 곡선. patience를 더 길게 두고 곡선 보고 결정했어야 (B2에서는 patience=15로 반영)
3 S2-aux SAM3 refine 결과 분석에 시간을 덜 썼음 "라벨 스타일 호환성" 문제를 더 빨리 알았다면 비슷한 후처리 시도 반복 안 해도 됐음
4 A/B2 모두 "더 키우기" 축이라 과적합 위험 동시에 부담 모델 capacity↑(A)와 입력 해상도↑(B2)가 둘 다 train data 64장이 받쳐주지 않으면 효과 없음. 한쪽이 빗나간 시점에 다른 쪽 가설을 재검토했어야

일반화할 수 있는 학습 실험 체크리스트

다음에 비슷한 종류의 detection 실험을 처음부터 설계한다면 — 자기 자신을 위한 체크리스트로 정리.

# 항목 안 하면 발생하는 일
1 인벤토리 먼저 이미 있는 결과 다시 돌려서 시간 낭비
2 base/control 정하기 이후 비교가 의미 없어짐
3 변경 축은 한 번에 하나만 효과의 원인 분리 불가
4 결과 정리는 코드로 자동화 손으로 옮기다 누락 발생
5 자원 보수적 시작 → 실측 후 키움 한계 못 본 채 큰 부하 → 시스템 다운
6 죽지 않을 범위에서 빠르게 학습 1회 손실 >> 보수적 시작 비용
7 각 단계 한 줄 해석 남김 변천사가 데이터 모음으로 전락
8 실패한 시도도 기록 다음에 같은 시도 반복

다음 시도 후보 (직교 축으로 정리)

후보 변경 축 가설 우선순위
yolo11l (B1) capacity ↑ 더 큰 모델로 추가 capacity 활용 중간 (A/B2가 음수였지만 변천사 완성을 위해 한 번은 돌려봄)
imgsz 1536 (B2) 해상도 ↑ 작은 송이 detection 회복 빗나감 (mAP50-95 0.286 → 0.251, 위 해석 단락 참고)
drone oversample ×50 / ×200 data sampling 비율 A/B2 음수 결과 → 데이터 축이 더 효과적일 가능성. ×100이 최적인지 ablation 높음 (다음 우선)
drone 데이터 추가 라벨링 data 절대량 ↑ 64장 → 128장 등. 정보 ceiling 자체를 올림 높음 (현실적이면)
OBB (rotated) 라벨 형식 송이의 63%가 세로 길쭉, OBB tight fit 중간 (라벨 변환 비용)
epochs 100 + patience 20 학습 시간 ↑ yolo11m이 더 멀리 가면 회복할까 낮음 (B2의 patience=15에서도 회복 못 함, 가능성 작음)
RT-DETR architecture family CNN과 다른 inductive bias로 일반화 검증 낮음 (model 축이 막힌 상황에서 추가 model 시도 우선순위↓)

후속 작업 (2026-05 업데이트)

위 "다음 시도 후보"의 데이터 축 (oversample sweep, fair chain w/ wgisd 사전학습) 모두 진행한 결과 → detection axis 전부 plateau 확정 (mAP50-95 ≈ 0.286 ± 0.008, noise 수준). 미세 튜닝 시도 종료.

대신 새 axis (segmentation → 면적 → 무게 회귀) 로 전환해 수확량 예측 파이프라인 구축으로 넘어감.

Fair chain 4-way 검증 결과 (Plateau 확정)

모델 mAP50-95 mixed-best 대비
yolov8m mixed-best (이 문서 S2) 0.286 baseline
yolo11m fair-chain (wgisd→mixed) 0.291 +0.005 (noise)
yolo11l fair-chain 0.284 −0.002
yolo26m fair-chain 0.283 −0.003

→ 4 모델 모두 0.286 ± 0.008 안에 수렴. architecture / capacity axis는 도약 가능성 없음 공식 확인.

후속 문서

주제 위치
수확량 예측 파이프라인 구축 (segmentation, GSD, 합성, end-to-end) 드론 포도 수확량 예측 — 파이프라인 (2026-05)

후속 문서 핵심 내용:

  • Detection plateau 후 axis 전환 의사결정
  • YOLO + SAM3 mask 파이프라인 + 4단계 overlap 후처리
  • 기둥/와이어 reference로 GSD calibration
  • 합성 vineyard 데이터 (copy-paste vs diffusion 비교)
  • 도메인별 detector winner 차이 (드론 top-down vs 측면 시점)

참고

주제 위치
전체 프로젝트 컨텍스트 포도밭 병해충 탐지 및 수확량 예측
데이터셋 출처와 구성 포도 탐지를 위한 데이터 수집
이전 YOLO 계열 baseline 비교 흐름 YOLO Model Comparison Summary
YOLO baseline 모델 selection 근거 YOLO Baseline Top3 비교 요약
다른 detector family와의 비교 Grounding DINO vs YOLO Top3 비교 요약
SAM3 vs YOLO 정량 비교 (S2-aux SAM3 refine 단락의 출발점) SAM3 vs Fine-tuned YOLO on Drone Imagery
후속 — 수확량 예측 파이프라인 Drone Yield Prediction Pipeline 2026-05

부록 — 보조 차트

각 변경 축이 mAP50-95 에 끼친 효과

각 변경 축의 Δ mAP50-95 양수 = 개선, 음수 = 하락. 강한 aug (+0.07) 이 가장 큰 단일 도약, SAM3 mask refine 과 architecture/resolution↑ 변경은 모두 음수

Recall × mAP50-95 산점도 (Stage 그룹별)

PR scatter — Stage 위치 그룹별 색상으로 각 Stage 위치 표시. mixed-best (data mix) 가 우측 상단 (high R, high mAP)

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