🐳 YOLOv8으둜 ν•΄μ–‘ μ“°λ ˆκΈ° 객체 탐지


🌊 ν”„λ‘œμ νŠΈ κ°œμš”

이번 ν”„λ‘œμ νŠΈλŠ” YOLOv8을 μ΄μš©ν•œ ν•΄μ–‘ μ“°λ ˆκΈ° 객체 탐지 λͺ¨λΈ 개발 과정을 λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.
Pascal VOC ν˜•μ‹μ˜ XML 라벨을 YOLO 포맷으둜 λ³€ν™˜ν•˜κ³ , 10개의 ν΄λž˜μŠ€μ— λŒ€ν•œ μ •λ°€ 탐지 λͺ¨λΈμ„ ν•™μŠ΅ν•œ λ’€,
μ‹€μ œ μ˜μƒ(.mp4)에 μ μš©ν•΄ λ°”μš΄λ”© λ°•μŠ€λ‘œ 탐지 κ²°κ³Όλ₯Ό μ‹œκ°ν™”ν•©λ‹ˆλ‹€.


🎯 λͺ©ν‘œ

  • ν•΄μ–‘ μ“°λ ˆκΈ°λ₯Ό κ΅¬μ„±ν•˜λŠ” 10개 클래슀λ₯Ό YOLOv8 기반으둜 탐지
  • mAP κΈ°μ€€ 90% 이상 μ„±λŠ₯ 달성
  • μ‹€μ œ μ˜μƒμ„ 탐지해 .mp4둜 μ €μž₯

🧱 데이터 ꡬ쑰

project/
β”œβ”€β”€ images/               # 원본 이미지 (.jpg)
β”œβ”€β”€ annotations/          # VOC ν˜•μ‹ 라벨 (.xml)
β”œβ”€β”€ labels_yolo/          # λ³€ν™˜λœ YOLO 라벨 (.txt)
β”œβ”€β”€ dataset/              # train/val 뢄리 ꡬ쑰
β”œβ”€β”€ data.yaml             # YOLO ν•™μŠ΅ μ„€μ •
β”œβ”€β”€ convert_voc_to_yolotxt.py
β”œβ”€β”€ split_testNval.py
β”œβ”€β”€ test01.py             # μΆ”λ‘  + μ˜μƒ μ €μž₯
└── best.pt               # ν›ˆλ ¨ μ™„λ£Œ λͺ¨λΈ

πŸ“¦ 클래슀 μ •μ˜ (10개)

class_map = {
    "tire": 0,
    "wood": 1,
    "rope": 2,
    "spring fish trap": 3,
    "bundle of ropes": 4,
    "circular fish trap": 5,
    "eel fish trap": 6,
    "fish net": 7,
    "rectangular fish trap": 8,
    "other objects": 9
}

πŸ” 라벨 λ³€ν™˜ (XML β†’ YOLO ν…μŠ€νŠΈ)

python convert_voc_to_yolotxt.py

β†’ labels_yolo/ 폴더에 YOLO 포맷 .txt 생성


πŸ§ͺ 데이터셋 λΆ„ν• 

python split_testNval.py

β†’ dataset/images/train, dataset/images/val ν˜•νƒœλ‘œ ꡬ성


βš™οΈ data.yaml μ„€μ •

path: ./dataset
train: images/train
val: images/val
names:
  0: tire
  1: wood
  ...
  9: other objects

🧠 YOLOv8 ν•™μŠ΅

yolo detect train \
  model=yolov8m.pt \
  data=data.yaml \
  epochs=100 \
  imgsz=640 \
  device=0

βœ… λͺ¨λΈ 크기: yolov8m.pt
βœ… ν™˜κ²½: Python 3.12, torch 2.6.0, NVIDIA H100 80GB


πŸ“ˆ μ΅œμ’… μ„±λŠ₯ κ²°κ³Ό

전체 μ„±λŠ₯κ°’
mAP@500.920
mAP@50–950.782
Precision0.91
Recall0.792

πŸ† ν΄λž˜μŠ€λ³„ μ„±λŠ₯ ν•˜μ΄λΌμ΄νŠΈ

클래슀λͺ…PrecisionRecallmAP@50mAP@50–95
tire0.9750.9890.9940.967
eel fish trap0.9620.9770.9920.926
circular fish trap0.9550.9690.9850.962
spring fish trap0.9720.9780.9780.951
fish net0.9220.8950.9300.738
rope0.6750.5060.5950.428
other objects1.0000.0000.9950.497

πŸŽ₯ μ˜μƒ μΆ”λ‘  및 μ €μž₯

python test01.py
  • μž…λ ₯: seetrash_val_01.mp4
  • 좜λ ₯: seetrash_val_01_detected.mp4
  • λͺ¨λΈμ˜ λ°”μš΄λ”© λ°•μŠ€λ§Œ 좜λ ₯ (라벨/점수 μ—†μŒ)
  • λ°•μŠ€ 색상: λΉ¨κ°•, κ΅΅κΈ°: 4

🧠 κ°œλ… 정리

μ§€ν‘œμ˜λ―Έ
Recallμ‹€μ œ μ“°λ ˆκΈ° 쀑 λͺ¨λΈμ΄ νƒμ§€ν•œ λΉ„μœ¨
Precisionνƒμ§€λœ 것 쀑 μ‹€μ œ μ“°λ ˆκΈ°μΈ λΉ„μœ¨
mAPν΄λž˜μŠ€λ³„ Precision-Recall μ‘°ν•©μ˜ 평균값
mAP@50IoU β‰₯ 0.5 κΈ°μ€€ μ„±λŠ₯
mAP@50–950.5 ~ 0.95 IoU κΈ°μ€€ 평균

βœ… κ²°κ³Ό 정리

  • 정확도·속도 λͺ¨λ‘ μš°μˆ˜ν•œ YOLOv8m λͺ¨λΈλ‘œ 10 클래슀 ν•™μŠ΅ 성곡
  • mAP@50 92%, mAP@50–95 78% β†’ μ‹€μ „ ν™œμš© μΆ©λΆ„
  • μΆ”λ‘  κ²°κ³Ό μ˜μƒ μƒμ„±κΉŒμ§€ μ™„λ£Œ

πŸ™‹β€β™€οΈ λˆ„κ΅¬λ‚˜ μ‹œμž‘ν•˜λ €λ©΄?

pip install ultralytics opencv-python torch torchvision typing_extensions pyyaml

λ˜λŠ”:

python3 -m venv venv
source venv/bin/activate
pip install ultralytics opencv-python torch

πŸ’¬ 마무리

YOLOv8은 μ„±λŠ₯κ³Ό μ‚¬μš©μ„± λͺ¨λ‘ ν›Œλ₯­ν•©λ‹ˆλ‹€.
직접 λΌλ²¨λ§ν•˜κ³  ν•™μŠ΅ν•œ 데이터셋을 κ°€μ§€κ³  수질 λͺ¨λ‹ˆν„°λ§, ν•΄μ–‘ μ •ν™” μžλ™ν™”, ν™˜κ²½ ꡐ윑 μ½˜ν…μΈ λ‘œλ„ ν™•μž₯ κ°€λŠ₯성이 맀우 ν½λ‹ˆλ‹€.

ν•„μš”ν•˜μ‹œλ©΄ 이 λͺ¨λΈμ„ FastAPI둜 λ°°ν¬ν•˜κ±°λ‚˜ μ›Ή μ„œλΉ„μŠ€λ‘œ κ΅¬μ„±ν•˜λŠ” μ˜ˆμ œλ„ λ„μ™€λ“œλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.
μ—¬κΈ°κΉŒμ§€ λ”°λΌμ˜€μ…¨λ‹€λ©΄, μ—¬λŸ¬λΆ„λ„ 객체 탐지 μ‹€μ „ 운영이 κ°€λŠ₯ν•©λ‹ˆλ‹€! πŸš€


ν•„μš”ν•˜μ‹œλ©΄ 이 ν¬μŠ€νŒ…μ„ .md, .pdf, Notion, λΈ”λ‘œκ·Έμš© HTMLλ‘œλ„ λ³€ν™˜ν•΄λ“œλ¦΄ 수 μžˆμ–΄μš”!

μ½”λ©˜νŠΈ

λ‹΅κΈ€ 남기기

이메일 μ£Όμ†ŒλŠ” κ³΅κ°œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•„μˆ˜ ν•„λ“œλŠ” *둜 ν‘œμ‹œλ©λ‹ˆλ‹€