object-detection-scratch / yolo_infer.py
YMmim's picture
Object detection from scratch: Faster R-CNN + YOLO comparison
017c046 verified
Raw
History Blame Contribute Delete
3.08 kB
"""
YOLOv8 ์ถ”๋ก  ์Šคํฌ๋ฆฝํŠธ (Ultralytics)
=====================================
COCO ์‚ฌ์ „ํ•™์Šต YOLOv8๋กœ ์ด๋ฏธ์ง€์—์„œ ๊ฐ์ฒด๋ฅผ ํƒ์ง€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•œ๋‹ค.
์•ž์„œ ๋งŒ๋“  ๋ฐ‘๋ฐ”๋‹ฅ Faster R-CNN(infer.py)๊ณผ ๊ฐ™์€ ์ด๋ฏธ์ง€๋กœ ๋น„๊ตํ•ด๋ณด๊ธฐ ์ข‹๋‹ค.
์„ค์น˜:
pip install ultralytics
์‹คํ–‰ ์˜ˆ:
# ์ด๋ฏธ์ง€ ํ•œ ์žฅ
python yolo_infer.py --image test.jpg
# ํด๋” ์ „์ฒด
python yolo_infer.py --image_dir ./samples --out_dir ./yolo_results
# ๋ชจ๋ธ ํฌ๊ธฐ ๋ณ€๊ฒฝ (n < s < m < l < x, ๋’ค๋กœ ๊ฐˆ์ˆ˜๋ก ์ •ํ™•ยท๋ฌด๊ฑฐ์›€)
python yolo_infer.py --image test.jpg --model yolov8s.pt
# ์ ์ˆ˜ ์ž„๊ณ„๊ฐ’ ์กฐ์ • (๊ธฐ๋ณธ 0.25)
python yolo_infer.py --image test.jpg --conf 0.4
๋ฉ”๋ชจ:
- ์ฒ˜์Œ ์‹คํ–‰ ์‹œ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜(yolov8n.pt ๋“ฑ)๊ฐ€ ์ž๋™ ๋‹ค์šด๋กœ๋“œ๋œ๋‹ค.
- Faster R-CNN(20 VOC ํด๋ž˜์Šค)๊ณผ ๋‹ฌ๋ฆฌ YOLOv8์€ COCO 80 ํด๋ž˜์Šค๋ฅผ ํƒ์ง€ํ•œ๋‹ค.
- ๋ผ์ด์„ ์Šค: Ultralytics YOLO๋Š” AGPL-3.0. ์ƒ์—…์  ํ์‡„์†Œ์Šค ์‚ฌ์šฉ ์‹œ ์ƒ์šฉ ๋ผ์ด์„ ์Šค ํ•„์š”.
"""
import os
import argparse
from ultralytics import YOLO
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--model", default="yolov8n.pt",
help="yolov8n/s/m/l/x.pt (์—†์œผ๋ฉด ์ž๋™ ๋‹ค์šด๋กœ๋“œ)")
ap.add_argument("--image", help="๋‹จ์ผ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ")
ap.add_argument("--image_dir", help="์ด๋ฏธ์ง€ ํด๋” ๊ฒฝ๋กœ")
ap.add_argument("--out_dir", default="./yolo_results", help="๊ฒฐ๊ณผ ์ €์žฅ ํด๋”")
ap.add_argument("--conf", type=float, default=0.25,
help="์ด ์‹ ๋ขฐ๋„ ์ด์ƒ๋งŒ ํ‘œ์‹œ (๊ธฐ๋ณธ 0.25)")
args = ap.parse_args()
# ๋ชจ๋ธ ๋กœ๋“œ (COCO ์‚ฌ์ „ํ•™์Šต, ์ฒซ ์‹คํ–‰ ์‹œ ์ž๋™ ๋‹ค์šด๋กœ๋“œ)
print(f"๋ชจ๋ธ ๋กœ๋“œ: {args.model}")
model = YOLO(args.model)
# ์ฒ˜๋ฆฌํ•  ์ด๋ฏธ์ง€ ๋ชฉ๋ก ๊ตฌ์„ฑ
targets = []
if args.image:
targets.append(args.image)
if args.image_dir:
for fn in os.listdir(args.image_dir):
if fn.lower().endswith((".jpg", ".jpeg", ".png", ".bmp")):
targets.append(os.path.join(args.image_dir, fn))
if not targets:
print("์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•˜์„ธ์š”: --image ๋˜๋Š” --image_dir")
return
os.makedirs(args.out_dir, exist_ok=True)
for path in targets:
# ์ถ”๋ก  ์‹คํ–‰
results = model(path, conf=args.conf, verbose=False)
r = results[0]
# ํƒ์ง€ ๊ฐœ์ˆ˜์™€ ํด๋ž˜์Šค๋ณ„ ์š”์•ฝ
n = len(r.boxes)
names = r.names # ํด๋ž˜์Šค ์ธ๋ฑ์Šค โ†’ ์ด๋ฆ„
detected = {}
for cls_id in r.boxes.cls.tolist():
name = names[int(cls_id)]
detected[name] = detected.get(name, 0) + 1
# ๋ฐ•์Šค ๊ทธ๋ ค์„œ ์ €์žฅ
out_path = os.path.join(args.out_dir, "yolo_" + os.path.basename(path))
r.save(filename=out_path)
summary = ", ".join(f"{k}ร—{v}" for k, v in detected.items()) or "์—†์Œ"
print(f" {os.path.basename(path)}: {n}๊ฐœ ํƒ์ง€ ({summary}) โ†’ {out_path}")
print(f"์™„๋ฃŒ. ๊ฒฐ๊ณผ๋Š” {args.out_dir} ํด๋”์— ์ €์žฅ๋จ.")
if __name__ == "__main__":
main()