Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

50 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

HybridTwoWay ํ”ผ๋“œ๋ฐฑ ๊ธฐ๋ฐ˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ชจ๋ธ

ํ”„๋กœ์ ํŠธ ์œ ํ˜•: ์ „์žฅ ์ธ์‹ ์—ฐ๊ตฌ / ๊ฐ์ฒด ํƒ์ง€ ํ”„๋ ˆ์ž„์›Œํฌ: PyTorch ๋ชจ๋ธ ๊ตฌ์กฐ: Anomaly-Aware CNN Stem โ†’ ViT Encoder โ†’ ๋ฐ˜๋ณต์  ํ”ผ๋“œ๋ฐฑ โ†’ PANLite Neck โ†’ YOLOHead ๋ชฉํ‘œ: CNN์˜ ๊ตญ์†Œ ํŠน์ง•๊ณผ ViT์˜ ์ „์—ญ ๋ฌธ๋งฅ์„ ๋ฐ˜๋ณต์  ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ํƒ์ง€ ์ •ํ™•๋„ ํ–ฅ์ƒ

์‚ฌ์šฉํŒŒ์ผ: model.ipynb ๋ชจ๋ธ ๊ตฌ์กฐ ๊ฐœ์„ : Flash Attention ์ ์šฉ, Dynamic Positional Embedding resizing, torch.compile ์ง€์›


1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ๋ฐฐ๊ฒฝ

์ „์žฅ ํ™˜๊ฒฝ์˜ ๊ฐ์ฒด ํƒ์ง€๋Š” ์œ„์žฅ, ๊ฐ€๋ฆผ, ์ž‘์€ ํฌ๊ธฐ ๋“ฑ ๋น„์ •ํ˜•์  ํŠน์ง• ๋•Œ๋ฌธ์— ๊ธฐ์กด ๋ชจ๋ธ๋กœ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. CNN์€ ํ…์Šค์ฒ˜ ๋“ฑ ๊ตญ์†Œ ์ •๋ณด์— ๊ฐ•ํ•˜์ง€๋งŒ ์ „์ฒด์ ์ธ ๋งฅ๋ฝ ํŒŒ์•…์ด ์–ด๋ ต๊ณ , ViT๋Š” ์ „์—ญ ๊ด€๊ณ„ ์ถ”๋ก ์— ์œ ๋ฆฌํ•˜์ง€๋งŒ ์„ธ๋ฐ€ํ•œ ๊ณต๊ฐ„ ์ •๋ณด๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ์ด ๋‘ ์žฅ์ ์„ ๊ฒฐํ•ฉํ•˜๊ณ , ViT๊ฐ€ ํŒŒ์•…ํ•œ **์ „์—ญ ๋ฌธ๋งฅ์„ ๋‹ค์‹œ CNN ํŠน์ง•๋งต์— ์ฃผ์ž…(Feedback)**ํ•˜์—ฌ ๊ตญ์†Œ ํŠน์ง•์„ ์žฌ์กฐ์ •ํ•˜๋Š” ๋ฐ˜๋ณต์  ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ํƒ์ง€ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Anomaly-Aware ํŠน์ง• ์ถ”์ถœ๊ณผ ๋ฐ˜๋ณต์  ํ”ผ๋“œ๋ฐฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์ „์žฅ ํ™˜๊ฒฝ์˜ ๋„์ „์ ์ธ ์กฐ๊ฑด์— ๊ฐ•๊ฑดํ•œ ํƒ์ง€ ๋ชจ๋ธ์„ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.


2๏ธโƒฃ ์„ค๊ณ„ ์ฒ ํ•™

  • Anomaly-Aware Stem: ์ดˆ๊ธฐ CNN ๋‹จ๊ณ„์—์„œ ๊ณ ์ฃผํŒŒ(High-Frequency) ํŠน์ง•(์—์ง€, ์งˆ๊ฐ)์„ ๋ณ„๋„ ๋ถ„๊ธฐ๋กœ ์ถ”์ถœํ•˜์—ฌ ์ผ๋ฐ˜ ํŠน์ง•๊ณผ ์œตํ•ฉํ•จ์œผ๋กœ์จ, ์œ„์žฅ ๊ฐ์ฒด๋‚˜ ๋น„์ •ํ˜• ํŠน์ง•์— ๋Œ€ํ•œ ๋ฏผ๊ฐ๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. Gaussian blur๋ฅผ ์ ์šฉํ•œ ์›๋ณธ๊ณผ์˜ ์ฐจ์ด๋ฅผ ํ†ตํ•ด ๊ณ ์ฃผํŒŒ ์„ฑ๋ถ„์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  • Global Context Encoding: CNN ํŠน์ง•๋งต์„ ViT์— ์ž…๋ ฅํ•˜์—ฌ ์ด๋ฏธ์ง€ ์ „์ฒด์˜ ๊ด€๊ณ„์„ฑ์„ ๋ชจ๋ธ๋งํ•˜๊ณ , ๊ฐ์ฒด์™€ ๋ฐฐ๊ฒฝ, ๊ฐ์ฒด์™€ ๊ฐ์ฒด ๊ฐ„์˜ ์ „์—ญ ๋ฌธ๋งฅ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. Positional Embedding์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ณต๊ฐ„ ์ •๋ณด๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.
  • Iterative Feedback: ViT๊ฐ€ ์ถ”์ถœํ•œ ์ „์—ญ ๋ฌธ๋งฅ์„ Feedback Adapter๋ฅผ ํ†ตํ•ด CNN ํŠน์ง•๋งต์— ๋‹ค์‹œ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ๊ตญ์†Œ ํŠน์ง•์ด ์ „์—ญ ๋ฌธ๋งฅ์— ๋งž๊ฒŒ ๋ณด์ •๋ฉ๋‹ˆ๋‹ค. ์ด ํ”ผ๋“œ๋ฐฑ์€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด ์ ์ง„์ ์ธ ํŠน์ง• ๊ฐœ์„ ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Multi-Scale Detection: PANLite ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ P3, P4, P5 ๋‹ค์ค‘ ์Šค์ผ€์ผ ํ”ผ์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , YOLOHeadLite๋ฅผ ํ†ตํ•ด ๊ฐ ์Šค์ผ€์ผ์—์„œ ํด๋ž˜์Šค, ์‹ ๋ขฐ๋„, ๋ฐ”์šด๋”ฉ๋ฐ•์Šค ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ „์ฒด ๊ตฌ์กฐ๋„

์ž…๋ ฅ ์ด๋ฏธ์ง€ (์˜ˆ: 640ร—640)
   โ”‚
   โ–ผ
โ‘  AnomalyAwareStem (CNN)
   โ”œโ”€ 3๊ฐœ์˜ conv-bn-act ๋ธ”๋ก (stride=2) โ†’ (B, Cs, H/8, W/8)
   โ”œโ”€ ๊ณ ์ฃผํŒŒ ํŠน์ง• ์ถ”์ถœ: ์›๋ณธ - Gaussian blur โ†’ ๊ณ ์ฃผํŒŒ ์„ฑ๋ถ„ ๋ถ„๋ฆฌ
   โ”œโ”€ ๋กœ์ปฌ ํŠน์ง•๊ณผ ๊ณ ์ฃผํŒŒ ํŠน์ง• ์œตํ•ฉ
   โ””โ”€ ๊ฐ€์‹œ์„ฑ ๋งต(visibility map) ์ƒ์„ฑ (์˜ต์…˜)
   โ”‚
   โ–ผ
โ‘ก PatchEmbed1x1
   โ”œโ”€ CNN ํŠน์ง•์˜ ์ฑ„๋„์ˆ˜ Cs โ†’ ViT ์ž„๋ฒ ๋”ฉ์ฐจ์› D๋กœ 1ร—1 conv
   โ””โ”€ ๊ณต๊ฐ„ ํฌ๊ธฐ ์œ ์ง€ (H/8, W/8)
   โ”‚
   โ–ผ
โ‘ข Positional Embedding
   โ”œโ”€ 2D ๊ณต๊ฐ„ ์ •๋ณด๋ฅผ 1D ์‹œํ€€์Šค์— ์ถ”๊ฐ€
   โ””โ”€ ์ด๋ฏธ์ง€ ํฌ๊ธฐ(640x640) ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์ „ ํ•™์Šต๋œ ์œ„์น˜ ์ž„๋ฒ ๋”ฉ
   โ””โ”€ ๋‹ค์ด๋‚˜๋ฏน ๋ฆฌ์‚ฌ์ด์ง• ์ง€์› (bicubic interpolation)
   โ”‚
   โ–ผ
โ‘ฃ ViT Encoder
   โ”œโ”€ CNN feature๋ฅผ flatten โ†’ (B, N=Htร—Wt, D)
   โ”œโ”€ Multihead Self-Attention์œผ๋กœ ์ „์—ญ ๋ฌธ๋งฅ ํ•™์Šต
   โ”œโ”€ Flash Attention ์ ์šฉ (scaled_dot_product_attention)
   โ”œโ”€ Transformer ๋ธ”๋ก์œผ๋กœ ๊ตฌ์„ฑ (LayerNorm + Attention + MLP)
   โ”œโ”€ ์ถœ๋ ฅ ํ† ํฐ (B, N, D)
   โ”‚
   โ–ผ
โ‘ค FeedbackAdapter
   โ”œโ”€ ViT ํ† ํฐ์„ reshape โ†’ (B, D, Ht, Wt)
   โ”œโ”€ 1ร—1 conv๋กœ (ฮณ, ฮฒ) ์ƒ์„ฑ (c_stem * 2 ์ฑ„๋„)
   โ”œโ”€ CNN ์ถœ๋ ฅ ๋ณด์ •:
     f_fb = f_stem ร— (1 + tanh(ฮณ)) + ฮฒ
   โ””โ”€ CNN์˜ ์ง€์—ญ ํŠน์ง•์„ ViT๊ฐ€ ๋ณธ ์ „์—ญ ๋ฌธ๋งฅ์œผ๋กœ ์žฌ์กฐ์ •
   โ”‚
   โ–ผ
โ‘ฅ PatchEmbed1x1 (๋‹ค์‹œ)
   โ”œโ”€ ๋ณด์ •๋œ f_fb๋ฅผ ViT ์ฐจ์› D๋กœ ์žฌ๋งคํ•‘
   โ”‚
   โ–ผ
โ‘ฆ ๋ฐ˜๋ณต (iters ์ง€์ • ํšŸ์ˆ˜๋งŒํผ)
   โ”œโ”€ ViT ์ฒ˜๋ฆฌ โ†’ Feedback ์ ์šฉ (detach_feedback ์˜ต์…˜)
   โ”œโ”€ Neck/Head ์˜ˆ์ธก
   โ””โ”€ ๋‹ค์Œ ๋ฐ˜๋ณต์„ ์œ„ํ•œ ํ† ํฐ ์ค€๋น„
   โ”‚
   โ–ผ
โ‘ง PANLite (neck)
   โ”œโ”€ P3 (80ร—80), P4 (40ร—40), P5 (20ร—20) ๋ฉ€ํ‹ฐ์Šค์ผ€์ผ ์ƒ์„ฑ
   โ”œโ”€ top-down & bottom-up ํ”ผ์ฒ˜ ์œตํ•ฉ ๊ตฌ์กฐ
   โ””โ”€ ์ตœ์ข… ๋ฉ€ํ‹ฐ์Šค์ผ€์ผ ํ”ผ์ฒ˜๋งต ๋ฐ˜ํ™˜
   โ”‚
   โ–ผ
โ‘จ YOLOHeadLite
   โ”œโ”€ P3, P4, P5 ๊ฐ๊ฐ์— ๋Œ€ํ•ด (cls, obj, box) ์˜ˆ์ธก
   โ”œโ”€ 3x3 conv stem + 1x1 conv head ๋ธ”๋ก
   โ”œโ”€ obj ๋ ˆ์ด์–ด bias ์ดˆ๊ธฐ๊ฐ’: -4.59 (confidence ๋งž์ถค)
   โ””โ”€ ๊ฐ ์Šค์ผ€์ผ์—์„œ ํด๋ž˜์Šค, ์‹ ๋ขฐ๋„, ๋ฐ”์šด๋”ฉ๋ฐ•์Šค ์˜ˆ์ธก
   โ”‚
   โ–ผ
โ‘ฉ Focal Loss + GIoU ์†์‹ค
   โ”œโ”€ ํด๋ž˜์Šค ๋ฐ ์‹ ๋ขฐ๋„ ์˜ˆ์ธก: Focal Loss
   โ”œโ”€ ๋ฐ”์šด๋”ฉ๋ฐ•์Šค ์˜ˆ์ธก: GIoU Loss
   โ””โ”€ ๋‹ค์ค‘ ์Šค์ผ€์ผ ์˜ˆ์ธก ํ†ตํ•ฉ ์†์‹ค
   โ”‚
   โ–ผ
์ถœ๋ ฅ
   โ”œโ”€ ์˜ˆ์ธก: [(cls,obj,box)_P3, P4, P5]
   โ””โ”€ ์ค‘๊ฐ„ feature: {'P3', 'P4', 'P5', 'V'}


๋ชจ๋ธ ๊ตฌ์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ

  • in_ch: 3 (์ž…๋ ฅ ์ฑ„๋„ ์ˆ˜)
  • stem_base: 32 (AnomalyAwareStem ๊ธฐ๋ณธ ์ฑ„๋„ ์ˆ˜)
  • embed_dim: 256 (ViT ์ž„๋ฒ ๋”ฉ ์ฐจ์›)
  • vit_depth: 4 (ViT ์ธ์ฝ”๋” ๋ธ”๋ก ์ˆ˜)
  • vit_heads: 4 (Multihead Attention ํ—ค๋“œ ์ˆ˜)
  • num_classes: 3 (ํด๋ž˜์Šค ์ˆ˜)
  • iters: 1 (๋ฐ˜๋ณต ํšŸ์ˆ˜)
  • detach_feedback: True (ํ”ผ๋“œ๋ฐฑ ํ† ํฐ detach ์—ฌ๋ถ€)
  • img_size: 640 (์ž…๋ ฅ ์ด๋ฏธ์ง€ ํฌ๊ธฐ)

ํ™˜๊ฒฝ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • Python >= 3.8
  • torch >= 2.0 (Flash Attention, torch.compile ์ง€์›)
  • torchvision
  • numpy
  • opencv-python
  • tqdm
  • pillow
  • matplotlib
  • roboflow (๋ฐ์ดํ„ฐ์…‹ ๋‹ค์šด๋กœ๋“œ์šฉ)
  • albumentations (๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์šฉ - ์„ ํƒ์ )

model.ipynb ๊ธฐ์ค€์ด๋ฉฐ, ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•, ํ›„์ฒ˜๋ฆฌ ๋“ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ•™์Šต ๋ฐ ํ‰๊ฐ€

๋ชจ๋ธ ํ•™์Šต์€ YOLO ์Šคํƒ€์ผ์˜ ์†์‹ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค:

  • ํด๋ž˜์Šค ์˜ˆ์ธก: Focal Loss (alpha=0.25, gamma=2.0)
  • ์‹ ๋ขฐ๋„ ์˜ˆ์ธก: Focal Loss (alpha=0.25, gamma=2.0)
  • ๋ฐ”์šด๋”ฉ๋ฐ•์Šค ์˜ˆ์ธก: GIoU Loss

๊ฐ ์Šค์ผ€์ผ(P3, P4, P5)์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ชจ๋“  ์Šค์ผ€์ผ์˜ ์˜ˆ์ธก์„ ํ†ตํ•ฉํ•˜์—ฌ ์ตœ์ข… ์†์‹ค์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•™์Šต ์„ค์ •:

  • ์˜ตํ‹ฐ๋งˆ์ด์ €: Adam (lr=1e-4)
  • ์—ํฌํฌ ์ˆ˜: 5
  • ๋ฐฐ์น˜ ํฌ๊ธฐ: 8
  • AMP (Automatic Mixed Precision): ํ™œ์„ฑํ™” (torch.amp.autocast)
  • Gradient Scaler: torch.cuda.amp.GradScaler
  • num_workers: 2
  • pin_memory: True

torch.compile ์ง€์›:

  • torch.compile: ๋ชจ๋ธ ์ปดํŒŒ์ผ ์˜ต์…˜ (PyTorch 2.0+ ์ง€์›)
  • Flash Attention: torch.nn.functional.scaled_dot_product_attention ์‚ฌ์šฉ

ํ•™์Šต๋œ ๋ชจ๋ธ์€ mAP@0.5 ์ง€ํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ฆ ๋ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์…‹์—์„œ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

ํ‰๊ฐ€ ์ง€ํ‘œ ๋ฐ ๋ฐฉ๋ฒ•:

  • mAP@0.5: 0.5 IoU ์ž„๊ณ„๊ฐ’ ๊ธฐ์ค€ ํ‰๊ท  ์ •๋ฐ€๋„
  • Confidence threshold: 0.25
  • NMS IoU threshold: 0.5
  • ํด๋ž˜์Šค ์ˆ˜: 3 (num_classes ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋”ฐ๋ผ ์กฐ์ • ๊ฐ€๋Šฅ)
  • ์ด๋ฏธ์ง€ ํฌ๊ธฐ: 640 (img_size ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋”ฐ๋ผ ์กฐ์ • ๊ฐ€๋Šฅ)
  • ์˜ˆ์ธก ๋””์ฝ”๋”ฉ: NMS (Non-Maximum Suppression) ์ ์šฉ
  • ์„ฑ๋Šฅ ์ €์žฅ: ์ตœ๊ณ  ์„ฑ๋Šฅ ๋ชจ๋ธ์€ 'hybrid_two_way_best.pt'๋กœ ์ €์žฅ

HybridTwoWay ํ”ผ๋“œ๋ฐฑ ๊ธฐ๋ฐ˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ชจ๋ธ (Advanced)

ํ”„๋กœ์ ํŠธ ์œ ํ˜•: ์ „์žฅ ์ธ์‹ ์—ฐ๊ตฌ / ๊ฐ์ฒด ํƒ์ง€ ํ”„๋ ˆ์ž„์›Œํฌ: PyTorch + Timm ๋ชจ๋ธ ๊ตฌ์กฐ: Anomaly-Aware CNN Stem โ†’ Pretrained ViT Encoder โ†’ ๋ฐ˜๋ณต์  ํ”ผ๋“œ๋ฐฑ โ†’ PANLite Neck โ†’ YOLOHead ๋ชฉํ‘œ: ์‚ฌ์ „ํ•™์Šต๋œ ViT์˜ ํ‘œํ˜„๋ ฅ์„ ํ™œ์šฉํ•˜๊ณ , CNN์˜ ๊ตญ์†Œ ํŠน์ง•๊ณผ ViT์˜ ์ „์—ญ ๋ฌธ๋งฅ์„ ๋ฐ˜๋ณต์  ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ํƒ์ง€ ์ •ํ™•๋„ ํ–ฅ์ƒ

์‚ฌ์šฉํŒŒ์ผ: advanced_model.ipynb ๋ชจ๋ธ ๊ตฌ์กฐ ๊ฐœ์„ : Timm ์‚ฌ์ „ํ•™์Šต ๋ชจ๋ธ ์ ์šฉ, Task Aligned Assignment (TAL) Loss, Mosaic Augmentation, torch.compile ์ง€์›


1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ๋ฐฐ๊ฒฝ

์ „์žฅ ํ™˜๊ฒฝ์˜ ๊ฐ์ฒด ํƒ์ง€๋Š” ์œ„์žฅ, ๊ฐ€๋ฆผ, ์ž‘์€ ํฌ๊ธฐ ๋“ฑ ๋น„์ •ํ˜•์  ํŠน์ง• ๋•Œ๋ฌธ์— ๊ธฐ์กด ๋ชจ๋ธ๋กœ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. CNN์€ ํ…์Šค์ฒ˜ ๋“ฑ ๊ตญ์†Œ ์ •๋ณด์— ๊ฐ•ํ•˜์ง€๋งŒ ์ „์ฒด์ ์ธ ๋งฅ๋ฝ ํŒŒ์•…์ด ์–ด๋ ต๊ณ , ViT๋Š” ์ „์—ญ ๊ด€๊ณ„ ์ถ”๋ก ์— ์œ ๋ฆฌํ•˜์ง€๋งŒ ์„ธ๋ฐ€ํ•œ ๊ณต๊ฐ„ ์ •๋ณด๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Advanced ๋ชจ๋ธ์€ ์‚ฌ์ „ํ•™์Šต๋œ ViT ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๊ฐ•๋ ฅํ•œ ์ „์—ญ ๋ฌธ๋งฅ ํ‘œํ˜„์„ ์ถ”์ถœํ•˜๊ณ , ViT๊ฐ€ ํŒŒ์•…ํ•œ **์ „์—ญ ๋ฌธ๋งฅ์„ ๋‹ค์‹œ CNN ํŠน์ง•๋งต์— ์ฃผ์ž…(Feedback)**ํ•˜์—ฌ ๊ตญ์†Œ ํŠน์ง•์„ ์žฌ์กฐ์ •ํ•˜๋Š” ๋ฐ˜๋ณต์  ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ํƒ์ง€ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Anomaly-Aware ํŠน์ง• ์ถ”์ถœ๊ณผ ๋ฐ˜๋ณต์  ํ”ผ๋“œ๋ฐฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜, Task Aligned Assignment (TAL) ์†์‹ค์„ ํ†ตํ•ด ์ „์žฅ ํ™˜๊ฒฝ์˜ ๋„์ „์ ์ธ ์กฐ๊ฑด์— ๊ฐ•๊ฑดํ•œ ํƒ์ง€ ๋ชจ๋ธ์„ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.


2๏ธโƒฃ ์„ค๊ณ„ ์ฒ ํ•™

  • Timm Pretrained ViT Integration: ์‚ฌ์ „ํ•™์Šต๋œ ViT ๋ชจ๋ธ(vit_base_patch16_224.augreg_in21k_ft_in1k ๋“ฑ)์„ ํ†ตํ•ฉํ•˜์—ฌ ๊ฐ•๋ ฅํ•œ ํŠน์ง• ์ธ์ฝ”๋”ฉ ๋Šฅ๋ ฅ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. Positional Embedding์„ ๋™์ ์œผ๋กœ ๋ฆฌ์‚ฌ์ด์ฆˆํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž…๋ ฅ ํฌ๊ธฐ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.
  • Anomaly-Aware Stem: ์ดˆ๊ธฐ CNN ๋‹จ๊ณ„์—์„œ ๊ณ ์ฃผํŒŒ(High-Frequency) ํŠน์ง•(์—์ง€, ์งˆ๊ฐ)์„ ๋ณ„๋„ ๋ถ„๊ธฐ๋กœ ์ถ”์ถœํ•˜์—ฌ ์ผ๋ฐ˜ ํŠน์ง•๊ณผ ์œตํ•ฉํ•จ์œผ๋กœ์จ, ์œ„์žฅ ๊ฐ์ฒด๋‚˜ ๋น„์ •ํ˜• ํŠน์ง•์— ๋Œ€ํ•œ ๋ฏผ๊ฐ๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. Gaussian blur๋ฅผ ์ ์šฉํ•œ ์›๋ณธ๊ณผ์˜ ์ฐจ์ด๋ฅผ ํ†ตํ•ด ๊ณ ์ฃผํŒŒ ์„ฑ๋ถ„์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  • Global Context Encoding: ์‚ฌ์ „ํ•™์Šต๋œ ViT๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€ ์ „์ฒด์˜ ๊ด€๊ณ„์„ฑ์„ ๋ชจ๋ธ๋งํ•˜๊ณ , ๊ฐ์ฒด์™€ ๋ฐฐ๊ฒฝ, ๊ฐ์ฒด์™€ ๊ฐ์ฒด ๊ฐ„์˜ ์ „์—ญ ๋ฌธ๋งฅ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. Positional Embedding์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ณต๊ฐ„ ์ •๋ณด๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.
  • Iterative Feedback: ViT๊ฐ€ ์ถ”์ถœํ•œ ์ „์—ญ ๋ฌธ๋งฅ์„ Feedback Adapter๋ฅผ ํ†ตํ•ด CNN ํŠน์ง•๋งต์— ๋‹ค์‹œ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ๊ตญ์†Œ ํŠน์ง•์ด ์ „์—ญ ๋ฌธ๋งฅ์— ๋งž๊ฒŒ ๋ณด์ •๋ฉ๋‹ˆ๋‹ค. ์ด ํ”ผ๋“œ๋ฐฑ์€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด ์ ์ง„์ ์ธ ํŠน์ง• ๊ฐœ์„ ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Task Aligned Assignment (TAL): YOLOv8 ์Šคํƒ€์ผ์˜ TAL์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋” ์ •ํ™•ํ•œ ์˜ˆ์ธก-์ •๋‹ต ํ• ๋‹น์„ ํ†ตํ•ด ํ•™์Šต ํšจ์œจ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ ์ˆ˜์™€ IoU ์ง€ํ‘œ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ํ›„๋ณด ์•ต์ปค๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • Mosaic Augmentation: 4์žฅ์˜ ์ด๋ฏธ์ง€๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ•™์Šต ๋ฐ์ดํ„ฐ์˜ ๋‹ค์–‘์„ฑ์„ ํ™•๋ณดํ•˜๊ณ , ์†Œ๊ทœ๋ชจ ๊ฐ์ฒด ํƒ์ง€ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • Multi-Scale Detection: PANLite ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ P3, P4, P5 ๋‹ค์ค‘ ์Šค์ผ€์ผ ํ”ผ์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , YOLOHeadLite๋ฅผ ํ†ตํ•ด ๊ฐ ์Šค์ผ€์ผ์—์„œ ํด๋ž˜์Šค, ์‹ ๋ขฐ๋„, ๋ฐ”์šด๋”ฉ๋ฐ•์Šค ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ „์ฒด ๊ตฌ์กฐ๋„

์ž…๋ ฅ ์ด๋ฏธ์ง€ (์˜ˆ: 640ร—640)
   โ”‚
   โ–ผ
โ‘  AnomalyAwareStem (CNN)
   โ”œโ”€ 3๊ฐœ์˜ conv-bn-act ๋ธ”๋ก (stride=2) โ†’ (B, Cs, H/8, W/8)
   โ”œโ”€ ๊ณ ์ฃผํŒŒ ํŠน์ง• ์ถ”์ถœ: ์›๋ณธ - Gaussian blur โ†’ ๊ณ ์ฃผํŒŒ ์„ฑ๋ถ„ ๋ถ„๋ฆฌ
   โ”œโ”€ ๋กœ์ปฌ ํŠน์ง•๊ณผ ๊ณ ์ฃผํŒŒ ํŠน์ง• ์œตํ•ฉ
   โ””โ”€ ๊ฐ€์‹œ์„ฑ ๋งต(visibility map) ์ƒ์„ฑ (์˜ต์…˜)
   โ”‚
   โ–ผ
โ‘ก ViT Dimension Adapter
   โ”œโ”€ CNN ํŠน์ง•์˜ ์ฑ„๋„์ˆ˜ Cs โ†’ ViT ์ž„๋ฒ ๋”ฉ์ฐจ์› D๋กœ 1ร—1 conv
   โ””โ”€ BatchNorm + SiLU ์ ์šฉ
   โ”‚
   โ–ผ
โ‘ข Positional Embedding (Dynamic)
   โ”œโ”€ Timm ์‚ฌ์ „ํ•™์Šต ๋ชจ๋ธ์˜ 2D ๊ณต๊ฐ„ ์ •๋ณด๋ฅผ ํ˜„์žฌ ์ž…๋ ฅ ํฌ๊ธฐ๋กœ ๋ณด๊ฐ„
   โ””โ”€ Bicubic interpolation์„ ์‚ฌ์šฉํ•œ ๋™์  ๋ฆฌ์‚ฌ์ด์ง•
   โ”‚
   โ–ผ
โ‘ฃ Pretrained ViT Encoder (from Timm)
   โ”œโ”€ ์‚ฌ์ „ํ•™์Šต๋œ ViT ๋ธ”๋ก (Transformer blocks)
   โ”œโ”€ Multihead Self-Attention์œผ๋กœ ์ „์—ญ ๋ฌธ๋งฅ ํ•™์Šต
   โ”œโ”€ ImageNet-21k์—์„œ ์‚ฌ์ „ํ•™์Šต๋œ ๋ชจ๋ธ ์‚ฌ์šฉ
   โ”œโ”€ Fine-tuning์šฉ์œผ๋กœ ImageNet-1k ๋ฐ์ดํ„ฐ๋กœ ํŒŒ์ธํŠœ๋‹๋จ
   โ”œโ”€ ์ถœ๋ ฅ ํ† ํฐ (B, N, D)
   โ”‚
   โ–ผ
โ‘ค FeedbackAdapter
   โ”œโ”€ ViT ํ† ํฐ์„ reshape โ†’ (B, D, Ht, Wt)
   โ”œโ”€ 1ร—1 conv๋กœ (ฮณ, ฮฒ) ์ƒ์„ฑ (c_stem * 2 ์ฑ„๋„)
   โ”œโ”€ CNN ์ถœ๋ ฅ ๋ณด์ •:
     f_fb = f_stem ร— (1 + tanh(ฮณ)) + ฮฒ
   โ””โ”€ CNN์˜ ์ง€์—ญ ํŠน์ง•์„ ViT๊ฐ€ ๋ณธ ์ „์—ญ ๋ฌธ๋งฅ์œผ๋กœ ์žฌ์กฐ์ •
   โ”‚
   โ–ผ
โ‘ฅ Neck Dimension Adapter
   โ”œโ”€ ๋ณด์ •๋œ f_fb๋ฅผ Neck ์ฐจ์›์œผ๋กœ ์žฌ๋งคํ•‘ (์˜ˆ: 128โ†’256)
   โ”‚
   โ–ผ
โ‘ฆ ๋ฐ˜๋ณต (iters ์ง€์ • ํšŸ์ˆ˜๋งŒํผ)
   โ”œโ”€ ViT ์ฒ˜๋ฆฌ โ†’ Feedback ์ ์šฉ (detach_feedback ์˜ต์…˜)
   โ”œโ”€ Neck/Head ์˜ˆ์ธก
   โ””โ”€ ๋‹ค์Œ ๋ฐ˜๋ณต์„ ์œ„ํ•œ ํ† ํฐ ์ค€๋น„
   โ”‚
   โ–ผ
โ‘ง PANLite (neck)
   โ”œโ”€ P3 (80ร—80), P4 (40ร—40), P5 (20ร—20) ๋ฉ€ํ‹ฐ์Šค์ผ€์ผ ์ƒ์„ฑ
   โ”œโ”€ top-down & bottom-up ํ”ผ์ฒ˜ ์œตํ•ฉ ๊ตฌ์กฐ
   โ””โ”€ ์ตœ์ข… ๋ฉ€ํ‹ฐ์Šค์ผ€์ผ ํ”ผ์ฒ˜๋งต ๋ฐ˜ํ™˜
   โ”‚
   โ–ผ
โ‘จ YOLOHeadLite
   โ”œโ”€ P3, P4, P5 ๊ฐ๊ฐ์— ๋Œ€ํ•ด (cls, obj, box) ์˜ˆ์ธก
   โ”œโ”€ 3x3 conv stem + 1x1 conv head ๋ธ”๋ก
   โ”œโ”€ obj ๋ ˆ์ด์–ด bias ์ดˆ๊ธฐ๊ฐ’: -4.59 (confidence ๋งž์ถค)
   โ””โ”€ ๊ฐ ์Šค์ผ€์ผ์—์„œ ํด๋ž˜์Šค, ์‹ ๋ขฐ๋„, ๋ฐ”์šด๋”ฉ๋ฐ•์Šค ์˜ˆ์ธก
   โ”‚
   โ–ผ
โ‘ฉ Task Aligned Assignment (TAL) ์†์‹ค
   โ”œโ”€ ํด๋ž˜์Šค ์ ์ˆ˜์™€ IoU ์ง€ํ‘œ๋ฅผ ๊ฒฐํ•ฉ (s^alpha * u^beta)
   โ”œโ”€ Top-k ํ›„๋ณด ์„ ํƒ ๋ฐ ๊ฐ€์žฅ ๋งŽ์ด ๊ฒน์น˜๋Š” GT ํฌํ•จ ๋ณด์žฅ
   โ”œโ”€ Anchor-free ๋ฐฉ์‹์ด ์•„๋‹Œ Anchor-based ๋ฐฉ์‹
   โ””โ”€ ๋‹ค์ค‘ ์Šค์ผ€์ผ ์˜ˆ์ธก ํ†ตํ•ฉ ์†์‹ค
   โ”‚
   โ–ผ
์ถœ๋ ฅ
   โ”œโ”€ ์˜ˆ์ธก: [(cls,obj,box)_P3, P4, P5]
   โ””โ”€ ์ค‘๊ฐ„ feature: {'P3', 'P4', 'P5', 'V'}


๋ชจ๋ธ ๊ตฌ์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ

  • in_ch: 3 (์ž…๋ ฅ ์ฑ„๋„ ์ˆ˜)
  • stem_base: 64 (AnomalyAwareStem ๊ธฐ๋ณธ ์ฑ„๋„ ์ˆ˜ - Advanced ๋ชจ๋ธ์—์„œ๋Š” ์ฆ๊ฐ€)
  • embed_dim: 768 (ViT Base ์ž„๋ฒ ๋”ฉ ์ฐจ์› - ์‚ฌ์ „ํ•™์Šต ๋ชจ๋ธ์— ๋”ฐ๋ผ ์กฐ์ •)
  • vit_model_name: 'vit_base_patch16_224.augreg_in21k_ft_in1k' (Timm ์‚ฌ์ „ํ•™์Šต ๋ชจ๋ธ๋ช…)
  • num_classes: 3 (ํด๋ž˜์Šค ์ˆ˜)
  • iters: 1 (๋ฐ˜๋ณต ํšŸ์ˆ˜ - Notebook์—์„œ๋Š” Safe Mode๋กœ 1๋กœ ์„ค์ •)
  • detach_feedback: False (ํ”ผ๋“œ๋ฐฑ ํ† ํฐ detach ์—ฌ๋ถ€ - Advanced ๋ชจ๋ธ์—์„œ๋Š” False)
  • img_size: 512 (์ž…๋ ฅ ์ด๋ฏธ์ง€ ํฌ๊ธฐ)

ํ™˜๊ฒฝ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • Python >= 3.8
  • torch >= 2.0 (Flash Attention, torch.compile ์ง€์›)
  • torchvision
  • timm (์‚ฌ์ „ํ•™์Šต ViT ๋ชจ๋ธ์šฉ)
  • numpy
  • opencv-python
  • albumentations (๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์šฉ)
  • tqdm
  • pillow
  • matplotlib
  • roboflow (๋ฐ์ดํ„ฐ์…‹ ๋‹ค์šด๋กœ๋“œ์šฉ)

advanced_model.ipynb ๊ธฐ์ค€์ด๋ฉฐ, ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•, ํ›„์ฒ˜๋ฆฌ ๋“ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ•™์Šต ๋ฐ ํ‰๊ฐ€

Advanced ๋ชจ๋ธ ํ•™์Šต์€ YOLOv8 ์Šคํƒ€์ผ์˜ Task Aligned Assignment (TAL) ์†์‹ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค:

  • ํด๋ž˜์Šค ์˜ˆ์ธก: Task Aligned Assignment ๊ธฐ๋ฐ˜ BCE ์†์‹ค
  • ์‹ ๋ขฐ๋„ ์˜ˆ์ธก: TAL ๊ธฐ๋ฐ˜ ํ• ๋‹น์œผ๋กœ ๋Œ€์ฒด (Objectness ํ•™์Šต ์—†์Œ)
  • ๋ฐ”์šด๋”ฉ๋ฐ•์Šค ์˜ˆ์ธก: GIoU Loss (1 - IoU)

๊ฐ ์Šค์ผ€์ผ(P3, P4, P5)์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•˜๊ณ , Task Aligned Assignment๋ฅผ ํ†ตํ•ด ์˜ˆ์ธก-์ •๋‹ต ํ• ๋‹น์„ ์ตœ์ ํ™”ํ•œ ํ›„ ์†์‹ค์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•™์Šต ์„ค์ •:

  • ์˜ตํ‹ฐ๋งˆ์ด์ €: AdamW (lr=2e-5, weight_decay=0.05) - Notebook "Safe Mode" ์„ค์ •
  • ์—ํฌํฌ ์ˆ˜: 15 (์ „์ฒด ํ•™์Šต์„ ์œ„ํ•ด 50~100 ํ•„์š”)
  • ๋ฐฐ์น˜ ํฌ๊ธฐ: 4 (VRAM ์ ˆ์•ฝ์„ ์œ„ํ•ด ๊ฐ์†Œ)
  • AMP (Automatic Mixed Precision): ํ™œ์„ฑํ™” (torch.amp.autocast, float16)
  • Gradient Scaler: torch.cuda.amp.GradScaler
  • num_workers: 2
  • pin_memory: True
  • Gradient Clipping: max_norm=0.5 (ViT ํ•™์Šต์—์„œ ์ค‘์š”)
  • Gradient Accumulation: 4์Šคํ… (์‹ค์ œ ๋ฐฐ์น˜ ํฌ๊ธฐ 16์œผ๋กœ ์ฆ๊ฐ€)
  • Learning Rate Scheduler: OneCycleLR (max_lr=2e-5, pct_start=0.3)

torch.compile ์ง€์›:

  • torch.compile: ๋ชจ๋ธ ์ปดํŒŒ์ผ ์˜ต์…˜ (PyTorch 2.0+ ์ง€์›)
  • Flash Attention: torch.nn.functional.scaled_dot_product_attention ์‚ฌ์šฉ

ํ•™์Šต๋œ ๋ชจ๋ธ์€ mAP@0.5 ์ง€ํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ฆ ๋ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์…‹์—์„œ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

ํ‰๊ฐ€ ์ง€ํ‘œ ๋ฐ ๋ฐฉ๋ฒ•:

  • mAP@0.5: 0.5 IoU ์ž„๊ณ„๊ฐ’ ๊ธฐ์ค€ ํ‰๊ท  ์ •๋ฐ€๋„
  • Confidence threshold: 0.001 (TAL์—์„œ๋Š” ๋‚ฎ์€ ์ž„๊ณ„๊ฐ’์ด ์ผ๋ฐ˜์ )
  • NMS IoU threshold: 0.5
  • ํด๋ž˜์Šค ์ˆ˜: 3 (num_classes ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋”ฐ๋ผ ์กฐ์ • ๊ฐ€๋Šฅ)
  • ์ด๋ฏธ์ง€ ํฌ๊ธฐ: 640 (img_size ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋”ฐ๋ผ ์กฐ์ • ๊ฐ€๋Šฅ)
  • ์˜ˆ์ธก ๋””์ฝ”๋”ฉ: NMS (Non-Maximum Suppression) ์ ์šฉ
  • ์„ฑ๋Šฅ ์ €์žฅ: ์ตœ๊ณ  ์„ฑ๋Šฅ ๋ชจ๋ธ์€ 'hybrid_two_way_best.pt'๋กœ ์ €์žฅ

SAM ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ํƒ์ง€ ๋ชจ๋ธ (SAMDetector)

ํ”„๋กœ์ ํŠธ ์œ ํ˜•: ์ „์žฅ ์ธ์‹ ์—ฐ๊ตฌ / ๊ฐ์ฒด ํƒ์ง€ ํ”„๋ ˆ์ž„์›Œํฌ: PyTorch ๋ชจ๋ธ ๊ตฌ์กฐ: Frozen SAM Encoder โ†’ FPN-like Adapter โ†’ Detection Heads ๋ชฉํ‘œ: Segment Anything Model(SAM)์˜ ๊ฐ•๋ ฅํ•œ ์‚ฌ์ „ ํ•™์Šต ํŠน์ง• ์ถ”์ถœ๊ธฐ๋ฅผ ๊ฐ์ฒด ํƒ์ง€(Object Detection)์— ์ ์šฉํ•˜์—ฌ, ์ ์€ ํ•™์Šต ๋น„์šฉ์œผ๋กœ ๋†’์€ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑ. ์‚ฌ์šฉํŒŒ์ผ: sam_model.ipynb ๋ชจ๋ธ ๊ตฌ์กฐ ํŠน์ง•: SAM์˜ ViT-B ์ธ์ฝ”๋”๋ฅผ ๋™๊ฒฐ(freeze)ํ•˜์—ฌ ๋ฐฑ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๊ฐ€๋ฒผ์šด ์–ด๋Œ‘ํ„ฐ์™€ ํƒ์ง€ ํ—ค๋“œ๋งŒ ํ•™์Šต.


1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ๋ฐฐ๊ฒฝ

Segment Anything Model(SAM)์€ ๋†€๋ผ์šด ์ œ๋กœ์ƒท(zero-shot) ๋ถ„ํ•  ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ ๊ฐ•๋ ฅํ•œ ์‹œ๊ฐ์  ํŠน์ง•์„ ํ•™์Šตํ–ˆ์Œ์„ ์ž…์ฆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ์ด SAM์˜ ์ธ์ฝ”๋”๋ฅผ ํŠน์ง• ์ถ”์ถœ๊ธฐ๋กœ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด ํƒ์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ๋ณธ ์ „์ฒด๋ฅผ ์žฌํ•™์Šตํ•˜๋Š” ๋Œ€์‹ , ์‚ฌ์ „ ํ•™์Šต๋œ SAM์˜ ๊ฐ€์ค‘์น˜๋Š” ๊ณ ์ •ํ•œ ์ฑ„ ๊ฐ„๋‹จํ•œ FPN ์Šคํƒ€์ผ์˜ ์–ด๋Œ‘ํ„ฐ์™€ ํƒ์ง€ ํ—ค๋“œ๋งŒ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•™์Šตํ•จ์œผ๋กœ์จ ํšจ์œจ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋™์‹œ์— ์ถ”๊ตฌํ•ฉ๋‹ˆ๋‹ค.


2๏ธโƒฃ ์„ค๊ณ„ ์ฒ ํ•™

  • Frozen Backbone: SAM์˜ ์ด๋ฏธ์ง€ ์ธ์ฝ”๋”(ViT-B)๋ฅผ ๋™๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•˜์—ฌ, ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ง‰๋Œ€ํ•œ ๊ณ„์‚ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•˜๊ณ  ๊ณผ์ ํ•ฉ(overfitting)์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • Lightweight Adapter: SAM ์ธ์ฝ”๋”๊ฐ€ ์ถœ๋ ฅํ•œ ๋‹จ์ผ ์Šค์ผ€์ผ์˜ ํŠน์ง• ๋งต์„ ์ž…๋ ฅ๋ฐ›์•„, ๊ฐ„๋‹จํ•œ ์ปจ๋ณผ๋ฃจ์…˜๊ณผ ์—…์ƒ˜ํ”Œ๋ง์„ ํ†ตํ•ด FPN(Feature Pyramid Network)๊ณผ ์œ ์‚ฌํ•œ ๋‹ค์ค‘ ์Šค์ผ€์ผ(P3, P4, P5) ํŠน์ง•์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ ๊ฐ์ฒด๋ฅผ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Simple Detection Head: ๊ฐ ์Šค์ผ€์ผ์˜ ํŠน์ง• ๋งต์— ๋Œ€ํ•ด 1x1 ์ปจ๋ณผ๋ฃจ์…˜์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ„๋‹จํ•œ ํƒ์ง€ ํ—ค๋“œ๋ฅผ ์ ์šฉํ•˜์—ฌ ํด๋ž˜์Šค, ๊ฐ์ฒด ์กด์žฌ ์—ฌ๋ถ€(objectness), ๊ทธ๋ฆฌ๊ณ  ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค๋ฅผ ์˜ˆ์ธกํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ๊ฐ€ ๊ฐ„๋‹จํ•˜์—ฌ ํ•™์Šต์ด ๋น ๋ฆ…๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ „์ฒด ๊ตฌ์กฐ๋„

์ž…๋ ฅ ์ด๋ฏธ์ง€ (1024x1024)
   โ”‚
   โ–ผ
โ‘  SAM Image Encoder (vit_b, Frozen)
   โ”œโ”€ ๊ทธ๋ž˜๋””์–ธํŠธ ๊ณ„์‚ฐ ๋น„ํ™œ์„ฑํ™” (torch.no_grad())
   โ””โ”€ ํŠน์ง• ๋งต ์ถœ๋ ฅ (B, 256, 64, 64) โ†’ P4์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ๋จ
   โ”‚
   โ–ผ
โ‘ก FPN-like Adapter (ํ•™์Šต ๋Œ€์ƒ)
   โ”œโ”€ P4 ๊ฒฝ๋กœ: SAM ํŠน์ง•์— ConvNormAct ์ ์šฉ โ†’ P4 (B, 256, 64, 64)
   โ”œโ”€ P3 ๊ฒฝ๋กœ: P4๋ฅผ ์—…์ƒ˜ํ”Œ๋ง(Upsample) โ†’ ConvNormAct ์ ์šฉ โ†’ P3 (B, 256, 128, 128)
   โ””โ”€ P5 ๊ฒฝ๋กœ: P4์— ConvNormAct(stride=2) ์ ์šฉ โ†’ P5 (B, 256, 32, 32)
   โ”‚
   โ–ผ
โ‘ข Detection Heads (ํ•™์Šต ๋Œ€์ƒ)
   โ”œโ”€ P3, P4, P5 ๊ฐ ์Šค์ผ€์ผ์— 1x1 Conv ํ—ค๋“œ ์ ์šฉ
   โ””โ”€ ๊ฐ ํ—ค๋“œ๋Š” (ํด๋ž˜์Šค ์ˆ˜ + 5) ์ฑ„๋„์„ ์˜ˆ์ธก (ํด๋ž˜์Šค, ์‹ ๋ขฐ๋„, ๋ฐ•์Šค ์ขŒํ‘œ)
   โ”‚
   โ–ผ
โ‘ฃ ์†์‹ค ๊ณ„์‚ฐ (ComputeLoss)
   โ”œโ”€ ๋ฐ•์Šค ์˜ˆ์ธก: IoU Loss
   โ”œโ”€ ํด๋ž˜์Šค/์‹ ๋ขฐ๋„ ์˜ˆ์ธก: BCEWithLogitsLoss
   โ””โ”€ YOLO์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์˜ ํƒ€๊ฒŸ ํ• ๋‹น ๋ฐ ์†์‹ค ๊ณ„์‚ฐ

๋ชจ๋ธ ๊ตฌ์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ

  • SAM checkpoint: "sam_vit_b_01ec64.pth"
  • num_classes: 3
  • img_size: 1024
  • batch_size: 4

ํ™˜๊ฒฝ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • torch, torchvision
  • opencv-python, numpy, matplotlib
  • roboflow (๋ฐ์ดํ„ฐ์…‹)
  • segment-anything (SAM ๋ชจ๋ธ)
  • torchmetrics (mAP ๊ณ„์‚ฐ)

ํ•™์Šต ๋ฐ ํ‰๊ฐ€

  • ์†์‹ค ํ•จ์ˆ˜: IoU Loss(๋ฐ•์Šค)์™€ BCE Loss(ํด๋ž˜์Šค/์‹ ๋ขฐ๋„)๋ฅผ ๊ฒฐํ•ฉํ•œ ์ปค์Šคํ…€ ์†์‹ค
  • ์˜ตํ‹ฐ๋งˆ์ด์ €: AdamW (lr=1e-4)
  • ํ‰๊ฐ€ ์ง€ํ‘œ: torchmetrics๋ฅผ ์‚ฌ์šฉํ•œ mAP@0.5
  • ํ•™์Šต ์ „๋žต: SAM ๋ฐฑ๋ณธ์€ ๋™๊ฒฐํ•˜๊ณ  ์–ด๋Œ‘ํ„ฐ์™€ ํ—ค๋“œ๋งŒ ํ•™์Šต.

YOLOv8m + CBAM ๋ชจ๋ธ

ํ”„๋กœ์ ํŠธ ์œ ํ˜•: ์ „์žฅ ์ธ์‹ ์—ฐ๊ตฌ / ๊ฐ์ฒด ํƒ์ง€ ํ”„๋ ˆ์ž„์›Œํฌ: PyTorch, Ultralytics YOLOv8 ๋ชจ๋ธ ๊ตฌ์กฐ: YOLOv8m Backbone + CBAM โ†’ YOLOv8 PAN Head โ†’ YOLOv8 Detect Head ๋ชฉํ‘œ: YOLOv8 ์•„ํ‚คํ…์ฒ˜์— CBAM(Convolutional Block Attention Module)์„ ํ†ตํ•ฉํ•˜์—ฌ, ์ฑ„๋„๊ณผ ๊ณต๊ฐ„์  ํŠน์ง•์˜ ์ค‘์š”๋„๋ฅผ ํ•™์Šตํ•˜๊ณ  ์ „๋ฐ˜์ ์ธ ํƒ์ง€ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ. ์‚ฌ์šฉํŒŒ์ผ: yolo_cbam_fix.ipynb ๋ชจ๋ธ ๊ตฌ์กฐ ํŠน์ง•: Ultralytics ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ ๋ชจ๋“ˆ(CBAM)์„ YOLOv8m ๋ฐฑ๋ณธ์— ์ฃผ์ž…. YAML ํŒŒ์ผ์„ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ •์˜.


1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ๋ฐฐ๊ฒฝ

YOLOv8์€ ๋น ๋ฅธ ์†๋„์™€ ๋†’์€ ์ •ํ™•๋„๋ฅผ ์ž๋ž‘ํ•˜๋Š” ๊ฐ์ฒด ํƒ์ง€ ๋ชจ๋ธ์ด์ง€๋งŒ, ๋ชจ๋“  ํŠน์ง•์„ ๋™๋“ฑํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. CBAM์€ ์ฑ„๋„ ์ฃผ์˜(Channel Attention)์™€ ๊ณต๊ฐ„ ์ฃผ์˜(Spatial Attention) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ, "๋ฌด์—‡์„" ๋ณผ์ง€(์ฑ„๋„)์™€ "์–ด๋””์—" ์ง‘์ค‘ํ• ์ง€(๊ณต๊ฐ„)๋ฅผ ๋ชจ๋ธ์ด ์Šค์Šค๋กœ ํ•™์Šตํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” YOLOv8 ๋ฐฑ๋ณธ์˜ ์ฃผ์š” ํŠน์ง• ์ถ”์ถœ ๋‹จ๊ณ„ ์ดํ›„์— CBAM์„ ์ ์šฉํ•˜์—ฌ ํŠน์ง• ํ‘œํ˜„๋ ฅ์„ ๊ฐ•ํ™”ํ•˜๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ ํƒ์ง€ ์ •ํ™•๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.


2๏ธโƒฃ ์„ค๊ณ„ ์ฒ ํ•™

  • Dynamic Module Injection: Ultralytics YOLOv8์˜ ์œ ์—ฐ์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ, CBAM_Universal์ด๋ผ๋Š” ์ปค์Šคํ…€ ๋ชจ๋“ˆ์„ ํŒŒ์ด์ฌ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ์ •์˜ํ•˜๊ณ  ์‹œ์Šคํ…œ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ YAML ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•ด ์›ํ•˜๋Š” ์œ„์น˜์— CBAM ๋ชจ๋“ˆ์„ ๋™์ ์œผ๋กœ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • Attention on Key Features: ๋ฐฑ๋ณธ(Backbone)์—์„œ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์ด ์ผ์–ด๋‚˜๋Š” ์„ธ ๊ตฐ๋ฐ์˜ C2f ๋ธ”๋ก ๋ฐ”๋กœ ๋‹ค์Œ์— CBAM ๋ชจ๋“ˆ์„ ๋ฐฐ์น˜ํ•˜์—ฌ, ํ•ด์ƒ๋„๊ฐ€ ๋ฐ”๋€Œ๊ธฐ ์ง์ „์˜ ํŠน์ง• ๋งต์„ ์ •์ œ(refine)ํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์Šค์ผ€์ผ์˜ ํŠน์ง•๋“ค์ด ์–ดํ…์…˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ํ˜œํƒ์„ ๋ฐ›๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • Multi-Stage Training: ์ฒ˜์Œ์—๋Š” ๋น„๊ต์  ์ž‘์€ ์ด๋ฏธ์ง€ ํฌ๊ธฐ(640x640)๋กœ ๋ชจ๋ธ์„ ์•ˆ์ •์ ์œผ๋กœ ํ•™์Šต์‹œํ‚จ ํ›„, ๋” ํฐ ์ด๋ฏธ์ง€ ํฌ๊ธฐ(800x800, 1280x1280)๋กœ ์ ์ง„์ ์œผ๋กœ ํ•™์Šต์„ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋ธ์ด ๋‹ค์–‘ํ•œ ์Šค์ผ€์ผ์˜ ๊ฐ์ฒด์— ๋” ์ž˜ ์ ์‘ํ•˜๋„๋ก ๋•๋Š” ํšจ๊ณผ์ ์ธ fine-tuning ์ „๋žต์ž…๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ „์ฒด ๊ตฌ์กฐ๋„

์ž…๋ ฅ ์ด๋ฏธ์ง€ (640, 800, 1280 ๋“ฑ)
   โ”‚
   โ–ผ
โ‘  YOLOv8m Backbone (CBAM ์‚ฝ์ž…)
   โ”œโ”€ ...
   โ”œโ”€ C2f ๋ธ”๋ก (idx 4)
   โ”œโ”€ CBAM ๋ชจ๋“ˆ 1 (์ฑ„๋„ 192)
   โ”œโ”€ ...
   โ”œโ”€ C2f ๋ธ”๋ก (idx 7)
   โ”œโ”€ CBAM ๋ชจ๋“ˆ 2 (์ฑ„๋„ 384)
   โ”œโ”€ ...
   โ”œโ”€ C2f ๋ธ”๋ก (idx 10)
   โ”œโ”€ CBAM ๋ชจ๋“ˆ 3 (์ฑ„๋„ 576)
   โ””โ”€ SPPF
   โ”‚
   โ–ผ
โ‘ก YOLOv8 PAN Head
   โ”œโ”€ Top-down & Bottom-up ํŠน์ง• ์œตํ•ฉ
   โ””โ”€ ๋‹ค์ค‘ ์Šค์ผ€์ผ ํŠน์ง•๋งต (P3, P4, P5) ์ƒ์„ฑ
   โ”‚
   โ–ผ
โ‘ข YOLOv8 Detect Head
   โ”œโ”€ ๊ฐ ์Šค์ผ€์ผ์—์„œ (ํด๋ž˜์Šค, ๋ฐ•์Šค) ์˜ˆ์ธก
   โ””โ”€ Ultralytics ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋‚ด์žฅ ์†์‹ค ํ•จ์ˆ˜ ์‚ฌ์šฉ

๋ชจ๋ธ ๊ตฌ์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ

  • base_model: YOLOv8m
  • custom_yaml: yolov8m_cbam_real_final.yaml
  • img_size: 640 -> 800 -> 1280 (๋‹จ๊ณ„์  ํ•™์Šต)
  • optimizer: AdamW

ํ™˜๊ฒฝ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ultralytics (YOLOv8 ํ”„๋ ˆ์ž„์›Œํฌ)
  • roboflow (๋ฐ์ดํ„ฐ์…‹)
  • pyyaml (YAML ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ)
  • torch, torchvision

ํ•™์Šต ๋ฐ ํ‰๊ฐ€

  • ์†์‹ค ํ•จ์ˆ˜: YOLOv8 ๊ธฐ๋ณธ ์†์‹ค ํ•จ์ˆ˜ (Box: CIoU Loss, Cls: VFL, DFL)
  • ์˜ตํ‹ฐ๋งˆ์ด์ €: AdamW
  • ํ•™์Šต ์ „๋žต: ์‚ฌ์ „ ํ•™์Šต๋œ yolov8m.pt ๊ฐ€์ค‘์น˜์—์„œ ์‹œ์ž‘. 640x640 ํฌ๊ธฐ๋กœ 1์ฐจ ํ•™์Šต ํ›„, 800x800, 1280x1280 ํฌ๊ธฐ๋กœ 2, 3์ฐจ ํ•™์Šต ์ง„ํ–‰.
  • ํ‰๊ฐ€ ์ง€ํ‘œ: mAP50-95, mAP50

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages