Skip to content

cellaxon/vision_model_tester

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

14 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Vision Model Tester

๋‹ค์–‘ํ•œ ์ปดํ“จํ„ฐ ๋น„์ „ ๋ชจ๋ธ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ํ†ตํ•ฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ YOLOv9์™€ RF-DETR ๋ชจ๋ธ์„ ์ง€์›ํ•˜๋ฉฐ, ONNX Runtime์„ ํ†ตํ•ด ์ถ”๋ก ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  egui ๊ธฐ๋ฐ˜์˜ ์ง๊ด€์ ์ธ GUI ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ

๐Ÿ” ๊ฐ์ฒด ๊ฒ€์ถœ

  • ํ†ตํ•ฉ ๋ชจ๋ธ ์ง€์›: YOLOv9 (4๊ฐ€์ง€ ๋ณ€ํ˜•) + RF-DETR
    • YOLOv9: GELAN-C, GELAN-E, YOLOv9-C, YOLOv9-E
    • RF-DETR: Transformer ๊ธฐ๋ฐ˜ ์ •๋ฐ€ ๊ฒ€์ถœ ๋ชจ๋ธ
  • COCO ๋ฐ์ดํ„ฐ์…‹ ํด๋ž˜์Šค ์ง€์› (YOLOv9: 80๊ฐœ, RF-DETR: 90๊ฐœ)
  • ๋ชจ๋ธ๋ณ„ ์ตœ์ ํ™”๋œ ์ž…๋ ฅ ํฌ๊ธฐ (YOLOv9: 640x640, RF-DETR: 560x560)
  • ์‹ ๋ขฐ๋„ ์ž„๊ณ„๊ฐ’ ๋ฐ NMS ์ž„๊ณ„๊ฐ’ ์กฐ์ • ๊ฐ€๋Šฅ
  • Pre-NMS ๋ฐ์ดํ„ฐ ์บ์‹ฑ์œผ๋กœ ๋น ๋ฅธ ์žฌ์ฒ˜๋ฆฌ
  • ์‹ ๋ขฐ๋„ ๊ธฐ๋ฐ˜ ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค ์ƒ‰์ƒ ๋งคํ•‘
  • ์‹ค์‹œ๊ฐ„ ๋ชจ๋ธ ์ „ํ™˜ ๋ฐ ์žฌ์ถ”๋ก 

๐Ÿ–ฅ๏ธ GUI ์ธํ„ฐํŽ˜์ด์Šค

  • egui ๊ธฐ๋ฐ˜์˜ ํ˜„๋Œ€์ ์ธ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค
  • ์ž์—ฐ๋กœ๊ทธ ๊ธฐ๋ฐ˜ ์„ธ๋ฐ€ํ•œ ์คŒ ์ œ์–ด
  • ์‹ค์‹œ๊ฐ„ ์ด๋ฏธ์ง€ ์คŒ ๋ฐ ํŒจ๋‹
  • ๊ฒ€์ถœ ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ” ํ˜•ํƒœ ํ‘œ์‹œ (์ •๋ ฌ, ํ•„ํ„ฐ๋ง)
  • ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค ์ง€์›
  • ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค ์ƒ‰์ƒ ๋งคํ•‘ ๋ชจ๋“œ ์„ ํƒ
  • ์„ค์ • ํŒจ๋„ (์ž„๊ณ„๊ฐ’, ์คŒ, ์ƒ‰์ƒ ๋ชจ๋“œ)
  • ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ์ด๋ฏธ์ง€ ๋กœ๋“œ

๐Ÿ’พ ์บ์‹ฑ ์‹œ์Šคํ…œ

  • SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์ถ”๋ก  ๊ฒฐ๊ณผ ์บ์‹ฑ
  • ์ด๋ฏธ์ง€ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ค‘๋ณต ๊ฒ€์ถœ ๋ฐฉ์ง€
  • ์„ค์ • ๊ฐ€๋Šฅํ•œ ์บ์‹œ ์ •๋ฆฌ ์ •์ฑ… (30์ผ)
  • Pre-NMS ๋ฐ์ดํ„ฐ ์ €์žฅ์œผ๋กœ NMS ์žฌ์‹คํ–‰ ์ตœ์ ํ™”
  • ๊ฐ•์ œ ์žฌ์ถ”๋ก  ์˜ต์…˜

โš™๏ธ ์„ค์ • ๊ด€๋ฆฌ

  • ์ค‘์•™ํ™”๋œ ์„ค์ • ์‹œ์Šคํ…œ (CONFIG ์ •์  ์ธ์Šคํ„ด์Šค)
  • ๋Ÿฐํƒ€์ž„ ์„ค์ • ๋ณ€๊ฒฝ ์ง€์›
  • ๋ชจ๋“ˆํ™”๋œ ์„ค์ • ๊ตฌ์กฐ
  • ์ปดํŒŒ์ผ ํƒ€์ž„ ์ƒ์ˆ˜ ๊ด€๋ฆฌ

๐Ÿ—๏ธ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜

  • UnifiedInferenceEngine: ๋ฉ€ํ‹ฐ ๋ชจ๋ธ ์ถ”๋ก  ์—”์ง„
  • ObjectDetector Trait: ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค
  • Thread-safe ์ „์—ญ ์—”์ง„: OnceLock๊ณผ Mutex ์‚ฌ์šฉ
  • ๋ชจ๋“ˆํ™”๋œ ๊ตฌ์กฐ: models/yolov9, models/rf_detr
  • ๊ณตํ†ต ํƒ€์ž… ์‹œ์Šคํ…œ: Detection, DetectionResult, ModelType

๐ŸŽจ ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค ์ƒ‰์ƒ ์‹œ์Šคํ…œ

  • ๊ณ ์ • ์ƒ‰์ƒ ๋ชจ๋“œ: ๋ชจ๋“  ๋ฐ•์Šค๋ฅผ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ
  • ๋ฒ”์œ„๋ณ„ ์ƒ‰์ƒ ๋ชจ๋“œ: 5๋‹จ๊ณ„ ์ƒ‰์ƒ (ํŒŒ๋ž‘โ†’์ดˆ๋กโ†’๋…ธ๋ž‘โ†’์ฃผํ™ฉโ†’๋นจ๊ฐ•)
  • ๊ทธ๋ผ๋ฐ์ด์…˜ ๋ชจ๋“œ: ์„ ํ˜• ์ƒ‰์ƒ ์ „ํ™˜
  • HSV ๊ธฐ๋ฐ˜ ๋ชจ๋“œ: ์ž์—ฐ์Šค๋Ÿฌ์šด ์ƒ‰์ƒ ์ „ํ™˜ (๊ธฐ๋ณธ๊ฐ’)

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

yolov9_onnx_test/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ lib.rs          # ๋ฉ”์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ†ตํ•ฉ API
โ”‚   โ”œโ”€โ”€ main.rs         # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ง„์ž…์ 
โ”‚   โ”œโ”€โ”€ gui.rs          # egui ๊ธฐ๋ฐ˜ ํ†ตํ•ฉ GUI
โ”‚   โ”œโ”€โ”€ models/         # ๋ชจ๋ธ๋ณ„ ๊ตฌํ˜„
โ”‚   โ”‚   โ”œโ”€โ”€ mod.rs      # ํ†ตํ•ฉ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ๊ณตํ†ต ํƒ€์ž…
โ”‚   โ”‚   โ”œโ”€โ”€ yolov9.rs   # YOLOv9 ๋ชจ๋ธ ๊ตฌํ˜„
โ”‚   โ”‚   โ””โ”€โ”€ rf_detr.rs  # RF-DETR ๋ชจ๋ธ ๊ตฌํ˜„
โ”‚   โ”œโ”€โ”€ models.rs       # ์ž„๋ฒ ๋””๋“œ ๋ชจ๋ธ ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ config.rs       # ์„ค์ • ๊ด€๋ฆฌ ๋ฐ ๊ตฌ์กฐ์ฒด
โ”‚   โ”œโ”€โ”€ error.rs        # ์ปค์Šคํ…€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ (thiserror ์‚ฌ์šฉ)
โ”‚   โ””โ”€โ”€ utils.rs        # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค
โ”‚       โ”œโ”€โ”€ image_utils     # ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”‚       โ”œโ”€โ”€ math_utils      # ์ˆ˜ํ•™ ๊ณ„์‚ฐ ํ•จ์ˆ˜๋“ค (IoU, ๊ฑฐ๋ฆฌ ๋“ฑ)
โ”‚       โ”œโ”€โ”€ fs_utils        # ํŒŒ์ผ ์‹œ์Šคํ…œ ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”‚       โ”œโ”€โ”€ perf_utils      # ์„ฑ๋Šฅ ์ธก์ • ๋„๊ตฌ
โ”‚       โ””โ”€โ”€ color_utils     # ์ƒ‰์ƒ ์ฒ˜๋ฆฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”œโ”€โ”€ Cargo.toml          # ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ
โ”œโ”€โ”€ Cargo.lock          # ์˜์กด์„ฑ ์ž ๊ธˆ ํŒŒ์ผ
โ”œโ”€โ”€ check.sh            # Linux/macOS ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ
โ”œโ”€โ”€ check.bat           # Windows ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ
โ””โ”€โ”€ README.md           # ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ

์ค‘์š”: assets/models/ ํด๋”์˜ ONNX ํŒŒ์ผ์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— include_dir! ๋งคํฌ๋กœ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ž„๋ฒ ๋”ฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋นŒ๋“œ ์ „์— ๋ชจ๋ธ ํŒŒ์ผ์„ assets/models/์— ๋‚ด๋ ค๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ์„ค์น˜ ๋ฐ ์‹คํ–‰

์š”๊ตฌ์‚ฌํ•ญ

  • Rust 1.70+
  • Windows/macOS/Linux

๋ชจ๋ธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

๋ชจ๋ธ๋“ค์„ ํƒ€์ž…๋ณ„๋กœ ํ•˜์œ„ ํด๋”์— ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค:

assets/models/
โ”œโ”€โ”€ yolov9/
โ”‚   โ”œโ”€โ”€ gelan-c.onnx      # YOLOv9 GELAN-C
โ”‚   โ”œโ”€โ”€ gelan-e.onnx      # YOLOv9 GELAN-E
โ”‚   โ”œโ”€โ”€ yolov9-c.onnx     # YOLOv9-C
โ”‚   โ””โ”€โ”€ yolov9-e.onnx     # YOLOv9-E
โ””โ”€โ”€ rf-detr/
    โ””โ”€โ”€ rf-detr.onnx      # RF-DETR

๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ

YOLOv9 ๋ชจ๋ธ

  • ์ถœ์ฒ˜: Hugging Face: Xenova/yolov9-onnx
  • ์„ค๋ช…: COCO 80 ํด๋ž˜์Šค ๊ฐ์ฒด ๊ฒ€์ถœ, 640ร—640 ์ž…๋ ฅ

RF-DETR ๋ชจ๋ธ

# 1) ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
mkdir -p assets/models/yolov9 assets/models/rf-detr

# 2) YOLOv9 ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ
curl -L -o assets/models/yolov9/gelan-c.onnx https://huggingface.co/Xenova/yolov9-onnx/resolve/main/gelan-c.onnx
curl -L -o assets/models/yolov9/yolov9-c.onnx https://huggingface.co/Xenova/yolov9-onnx/resolve/main/yolov9-c.onnx
# ์„ ํƒ์ ์œผ๋กœ ์ถ”๊ฐ€ ๋‹ค์šด๋กœ๋“œ
curl -L -o assets/models/yolov9/gelan-e.onnx https://huggingface.co/Xenova/yolov9-onnx/resolve/main/gelan-e.onnx
curl -L -o assets/models/yolov9/yolov9-e.onnx https://huggingface.co/Xenova/yolov9-onnx/resolve/main/yolov9-e.onnx

# 3) RF-DETR ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ
curl -L -o assets/models/rf-detr/rf-detr.onnx https://huggingface.co/onnx-community/rfdetr_base-ONNX/resolve/main/onnx/model.onnx

๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ ๋ฐฉ๋ฒ•

  1. ์›น ๋ธŒ๋ผ์šฐ์ €: ์œ„ Hugging Face ๋งํฌ์—์„œ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ
  2. ๋ช…๋ น์ค„: ์œ„์˜ curl ๋ช…๋ น์–ด ์‚ฌ์šฉ
  3. Git LFS: Hugging Face ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ธฐ

์ฐธ๊ณ ์‚ฌํ•ญ

  • RF-DETR ๋ชจ๋ธ ํฌ๊ธฐ: ์•ฝ 103MB
  • YOLOv9 ๋ชจ๋ธ ํฌ๊ธฐ: 97MB (GELAN-C) ~ 265MB (YOLOv9-E)
  • ๋„คํŠธ์›Œํฌ: ๋‹ค์šด๋กœ๋“œ ์‹œ ์•ˆ์ •์ ์ธ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ ํ•„์š”

๋นŒ๋“œ ์‹œ ํ•ด๋‹น ํŒŒ์ผ๋“ค์ด ์กด์žฌํ•ด์•ผ ์ž„๋ฒ ๋”ฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ํŒŒ์ผ๋ช…์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ง๊ณ  ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿง  ํ†ตํ•ฉ ๋ชจ๋ธ ์ƒ์„ธ ์•ˆ๋‚ด

๐ŸŽฏ ๋ชจ๋ธ ์„ฑ๋Šฅ ๋น„๊ต

๋ชจ๋ธ ํŒŒ์ผ๋ช… ํฌ๊ธฐ ์ž…๋ ฅ ํฌ๊ธฐ ํด๋ž˜์Šค ์ˆ˜ ์†๋„ ์ •ํ™•๋„ ๋ฉ”๋ชจ๋ฆฌ ์ถ”๋ก ์‹œ๊ฐ„ (M4) ๊ถŒ์žฅ ์‚ฌ์šฉ ์‚ฌ๋ก€
YOLOv9-GELAN-C gelan-c.onnx 97MB 640ร—640 80 ๋งค์šฐ ๋น ๋ฆ„ ๋†’์Œ 102MB 150-200ms ์‹ค์‹œ๊ฐ„, ๋ชจ๋ฐ”์ผ, ์ž„๋ฒ ๋””๋“œ
YOLOv9-GELAN-E gelan-e.onnx 222MB 640ร—640 80 ๋น ๋ฆ„ ๋†’์Œ 233MB 300-400ms ์ผ๋ฐ˜ ์‹ค์‹œ๊ฐ„, ์›น์บ 
YOLOv9-C yolov9-c.onnx 195MB 640ร—640 80 ๋ณดํ†ต ๋งค์šฐ ๋†’์Œ 205MB 200-300ms ์ •ํ™•๋„-์†๋„ ๊ท ํ˜•, ๋ฒ”์šฉ
YOLOv9-E yolov9-e.onnx 265MB 640ร—640 80 ๋А๋ฆผ ์ตœ๊ณ  278MB 400-500ms ๊ณ ์ •๋ฐ€, ์—ฐ๊ตฌ, ๋ถ„์„
RF-DETR rf_detr_model.onnx 103MB 560ร—560 90 ๋ณดํ†ต ๋งค์šฐ ๋†’์Œ 108MB 350-450ms Transformer ์ •๋ฐ€ ๊ฒ€์ถœ

์ง€์› ๋ชจ๋ธ ๋ฐ ํŠน์ง•

  • YOLOv9 ๊ณ„์—ด: 640ร—640 ์ž…๋ ฅ, COCO 80 ํด๋ž˜์Šค, YOLOv9 ์ถœ๋ ฅ ํ˜•์‹
  • RF-DETR: 560ร—560 ์ž…๋ ฅ, COCO 90 ํด๋ž˜์Šค (1-90, background ์ œ์™ธ), Transformer ์ถœ๋ ฅ

๋ชจ๋ธ ์„ ํƒ ๊ฐ€์ด๋“œ

  • ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ (์†๋„ ์šฐ์„ ): GELAN-C > YOLOv9-C > GELAN-E
  • ์ •ํ™•๋„ ์šฐ์„ : YOLOv9-E > RF-DETR > YOLOv9-C > GELAN-E
  • ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ ํ™˜๊ฒฝ: GELAN-C > RF-DETR > YOLOv9-C
  • Transformer ๊ธฐ๋ฐ˜ ๊ณ ์ •๋ฐ€: RF-DETR (์—ฐ๊ตฌ, ๋ถ„์„์šฉ)
  • ๊ท ํ˜•/๊ธฐ๋ณธ ๊ถŒ์žฅ: YOLOv9-C (๋ฒ”์šฉ), RF-DETR (์ •๋ฐ€)

ํ”Œ๋žซํผ/๋Ÿฐํƒ€์ž„ ์ฐธ๊ณ 

  • macOS: CoreML + ANE ๊ฐ€์† ๊ฒฝ๋กœ ์‚ฌ์šฉ(๊ฐ€๋Šฅ ์‹œ), CPU fallback ์ž๋™
  • ๊ธฐํƒ€ OS: CPU Execution Provider ์‚ฌ์šฉ, ์Šค๋ ˆ๋“œ ์„ค์ •์œผ๋กœ ์ตœ์ ํ™”
  • ๋ชจ๋ธ ํŒŒ์ผ์€ ๋นŒ๋“œ ์‹œ ์ž„๋ฒ ๋”ฉ๋˜๋ฏ€๋กœ ํŒŒ์ผ ๊ฒฝ๋กœ ์˜์กด ์—†์ด ๋™์ž‘

๋นŒ๋“œ

cargo build --release

์‹คํ–‰

# Linux/macOS
./check.sh

# Windows
check.bat

# ๋˜๋Š” ์ง์ ‘ ์‹คํ–‰
cargo run

๐ŸŽฎ ์‚ฌ์šฉ๋ฒ•

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
  2. "Select Image" ๋ฒ„ํŠผ ํด๋ฆญํ•˜์—ฌ ์ด๋ฏธ์ง€ ์„ ํƒ
  3. ๋ชจ๋ธ ์„ ํƒ (์ž„๋ฒ ๋””๋“œ๋œ ONNX ํŒŒ์ผ)
  4. ์‹ ๋ขฐ๋„ ๋ฐ NMS ์ž„๊ณ„๊ฐ’ ์กฐ์ •
  5. ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค ์ƒ‰์ƒ ๋งคํ•‘ ๋ชจ๋“œ ์„ ํƒ
  6. ๊ฒ€์ถœ ๊ฒฐ๊ณผ ํ™•์ธ

์คŒ ์ปจํŠธ๋กค

  • ๋งˆ์šฐ์Šค ํœ : ์ž์—ฐ๋กœ๊ทธ ๊ธฐ๋ฐ˜ ์„ธ๋ฐ€ํ•œ ์คŒ ์กฐ์ • (0.02 ๋กœ๊ทธ ๋‹จ์œ„)
  • Ctrl + Plus/Minus: ํ‚ค๋ณด๋“œ ์คŒ (0.05 ๋กœ๊ทธ ๋‹จ์œ„)
  • 0: 100% ์คŒ์œผ๋กœ ๋ฆฌ์…‹
  • 1: 50% ์คŒ
  • 2: 200% ์คŒ
  • Fit: ํ™”๋ฉด์— ๋งž์ถค
  • ์คŒ ๋ฒ”์œ„: 0.1x - 20.0x (์ž์—ฐ๋กœ๊ทธ ๊ธฐ๋ฐ˜)

์„ค์ • ์กฐ์ •

  • Confidence Threshold: ๊ฒ€์ถœ ์‹ ๋ขฐ๋„ ์ž„๊ณ„๊ฐ’ (0.1-1.0)
  • NMS Threshold: ์ค‘๋ณต ์ œ๊ฑฐ ์ž„๊ณ„๊ฐ’ (0.05-0.8)
  • Image Zoom: ์ด๋ฏธ์ง€ ํ™•๋Œ€/์ถ•์†Œ (์ž์—ฐ๋กœ๊ทธ ๊ธฐ๋ฐ˜ ์Šฌ๋ผ์ด๋”)
  • Color Mapping Mode: ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค ์ƒ‰์ƒ ๋งคํ•‘ ๋ฐฉ์‹

๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

  • ๊ฐ•์ œ ์žฌ์ถ”๋ก : ์บ์‹œ ๋ฌด์‹œํ•˜๊ณ  ์ƒˆ๋กœ ์ถ”๋ก 
  • Pre-NMS ์บ์‹ฑ: NMS ์ž„๊ณ„๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ๋น ๋ฅธ ์žฌ์ฒ˜๋ฆฌ
  • ํ…Œ์ด๋ธ” ์ •๋ ฌ: ์ธ๋ฑ์Šค, ํด๋ž˜์Šค, ID, ์‹ ๋ขฐ๋„๋ณ„ ์ •๋ ฌ
  • ์„ ํƒ์  ํ‘œ์‹œ: ์‹ ๋ขฐ๋„ ๊ธฐ๋ฐ˜ ๊ฒ€์ถœ ๊ฒฐ๊ณผ ํ•„ํ„ฐ๋ง

โš™๏ธ ์„ค์ • ์‹œ์Šคํ…œ

์„ค์ • ๊ตฌ์กฐ

pub struct AppConfig {
    pub model: ModelConfig,        // ๋ชจ๋ธ ๊ด€๋ จ ์„ค์ •
    pub inference: InferenceConfig, // ์ถ”๋ก  ๊ด€๋ จ ์„ค์ •
    pub ui: UiConfig,              // UI ๊ด€๋ จ ์„ค์ •
    pub database: DatabaseConfig,   // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •
}

์ฃผ์š” ์„ค์ •๊ฐ’๋“ค

  • ๋ชจ๋ธ ์ž…๋ ฅ ํฌ๊ธฐ: 640x640
  • ๊ธฐ๋ณธ ์‹ ๋ขฐ๋„ ์ž„๊ณ„๊ฐ’: 0.6
  • ๊ธฐ๋ณธ NMS ์ž„๊ณ„๊ฐ’: 0.2
  • ์ตœ๋Œ€ ๊ฒ€์ถœ ๊ฐœ์ˆ˜: 50
  • ์คŒ ๋ฒ”์œ„: 0.1x - 20.0x (์ž์—ฐ๋กœ๊ทธ ๊ธฐ๋ฐ˜)
  • ๋งˆ์šฐ์Šค ํœ  ์คŒ ๋ณ€ํ™”๋Ÿ‰: 0.02 (๋กœ๊ทธ ๊ณต๊ฐ„)
  • ํ‚ค๋ณด๋“œ ์คŒ ๋ณ€ํ™”๋Ÿ‰: 0.05 (๋กœ๊ทธ ๊ณต๊ฐ„)
  • ๊ธฐ๋ณธ ์ƒ‰์ƒ ๋ชจ๋“œ: HSV ๊ธฐ๋ฐ˜
  • ํŒŒ์‹ฑ ์ตœ์†Œ ์‹ ๋ขฐ๋„: 0.05 (๊ณ ๊ธ‰)

๐Ÿ”„ ์บ์‹ฑ ์‹œ์Šคํ…œ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ

CREATE TABLE inference_cache (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    image_path TEXT NOT NULL,
    image_hash TEXT NOT NULL,
    model_file_name TEXT NOT NULL,
    model_name TEXT NOT NULL,
    image_width INTEGER NOT NULL,
    image_height INTEGER NOT NULL,
    detections_json TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    UNIQUE(image_path, model_file_name)
);

์บ์‹œ ๊ธฐ๋Šฅ

  • ์ด๋ฏธ์ง€ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ค‘๋ณต ๊ฒ€์ถœ
  • ๋ชจ๋ธ๋ณ„ ์บ์‹œ ๋ถ„๋ฆฌ
  • ์ž๋™ ์บ์‹œ ์ •๋ฆฌ (30์ผ)
  • ๊ฐ•์ œ ์žฌ์ถ”๋ก  ์˜ต์…˜
  • Pre-NMS ๋ฐ์ดํ„ฐ ์ €์žฅ์œผ๋กœ NMS ์žฌ์‹คํ–‰ ์ตœ์ ํ™”
  • ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ (์˜ˆ: idx_image_hash, idx_model_file)

๐ŸŽจ ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค ์ƒ‰์ƒ ์‹œ์Šคํ…œ

์ƒ‰์ƒ ๋งคํ•‘ ๋ชจ๋“œ

1. ๊ณ ์ • ์ƒ‰์ƒ ๋ชจ๋“œ (Fixed)

  • ๋ชจ๋“  ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค๋ฅผ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ
  • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ชจ๋“œ

2. ๋ฒ”์œ„๋ณ„ ์ƒ‰์ƒ ๋ชจ๋“œ (Range-Based)

  • 5๋‹จ๊ณ„ ์ƒ‰์ƒ ๊ตฌ๋ถ„:
    • 0.0-0.2: ํŒŒ๋ž‘ (๋‚ฎ์€ ์‹ ๋ขฐ๋„)
    • 0.2-0.4: ์ดˆ๋ก
    • 0.4-0.6: ๋…ธ๋ž‘
    • 0.6-0.8: ์ฃผํ™ฉ
    • 0.8-1.0: ๋นจ๊ฐ• (๋†’์€ ์‹ ๋ขฐ๋„)

3. ๊ทธ๋ผ๋ฐ์ด์…˜ ๋ชจ๋“œ (Gradient)

  • ์„ ํ˜• ์ƒ‰์ƒ ์ „ํ™˜
  • ์‹ ๋ขฐ๋„์— ๋”ฐ๋ฅธ ๋ถ€๋“œ๋Ÿฌ์šด ์ƒ‰์ƒ ๋ณ€ํ™”

4. HSV ๊ธฐ๋ฐ˜ ๋ชจ๋“œ (HSV-Based) - ๊ธฐ๋ณธ๊ฐ’

  • HSV ์ƒ‰์ƒ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ „ํ™˜
  • ๊ฐ€์žฅ ์‹œ๊ฐ์ ์œผ๋กœ ๋งค๋ ฅ์ ์ธ ๋ชจ๋“œ

์ƒ‰์ƒ ์ฒ˜๋ฆฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ

// ๋ฒ”์œ„๋ณ„ ์ƒ‰์ƒ
pub fn get_confidence_color(confidence: f32) -> Rgb<u8>

// ๊ทธ๋ผ๋ฐ์ด์…˜ ์ƒ‰์ƒ
pub fn get_confidence_color_gradient(confidence: f32) -> Rgb<u8>

// HSV ๊ธฐ๋ฐ˜ ์ƒ‰์ƒ
pub fn get_confidence_color_hsv(confidence: f32) -> Rgb<u8>

๐Ÿงญ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํ๋ฆ„ (Mermaid)

์ „์ฒด ํ๋ฆ„

flowchart TD
    A[ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘] --> B[GUI ์ดˆ๊ธฐํ™”]
    B --> C[๋ฉ”์ธ ์œˆ๋„์šฐ ์ƒ์„ฑ]
    C --> D[์ขŒ์ธก ํŒจ๋„: ๊ฒ€์ถœ ๊ฒฐ๊ณผ]
    C --> E[์šฐ์ธก ํŒจ๋„: ์ด๋ฏธ์ง€ ํ‘œ์‹œ]

    F[์ด๋ฏธ์ง€ ์„ ํƒ ๋ฐฉ๋ฒ•] --> G{์„ ํƒ ๋ฐฉ์‹}
    G -->|ํŒŒ์ผ ์„ ํƒ ๋ฒ„ํŠผ| H[ํŒŒ์ผ ๋‹ค์ด์–ผ๋กœ๊ทธ ์—ด๊ธฐ]
    G -->|๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ| I[์ด๋ฏธ์ง€ ํŒŒ์ผ ๋“œ๋กญ]

    H --> J[์ด๋ฏธ์ง€ ํŒŒ์ผ ์„ ํƒ]
    I --> J
    J --> K[์ด๋ฏธ์ง€ ํŒŒ์ผ ์ฝ๊ธฐ]
    K --> L{ํŒŒ์ผ ์ฝ๊ธฐ ์„ฑ๊ณต?}
    L -->|์‹คํŒจ| M[์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ]
    L -->|์„ฑ๊ณต| N[ModelCache ์ดˆ๊ธฐํ™”]

    N --> O{๋ชจ๋ธ ์บ์‹œ ์ƒ์„ฑ ์„ฑ๊ณต?}
    O -->|์‹คํŒจ| P[์บ์‹œ ์ดˆ๊ธฐํ™” ์—๋Ÿฌ ํ‘œ์‹œ]
    O -->|์„ฑ๊ณต| Q[Pre-NMS ์ถ”๋ก /๋กœ๋“œ]

    Q --> R{DB ์บ์‹œ ์กด์žฌ?}
    R -->|์žˆ์Œ| S[Pre-NMS ๊ฒฐ๊ณผ ๋กœ๋“œ]
    R -->|์—†์Œ| T[๋ชจ๋ธ ์ถ”๋ก  Pre-NMS ์ €์žฅ]

    S --> U[NMS ์ ์šฉ]
    T --> U[NMS ์ ์šฉ]
    U --> V[๋ฐ”์šด๋”ฉ ๋ฐ•์Šค ๊ทธ๋ฆฌ๊ธฐ]
    V --> W[๊ฒฐ๊ณผ ์ด๋ฏธ์ง€ ํ‘œ์‹œ]

    M --> X[์‚ฌ์šฉ์ž ์žฌ์‹œ๋„ ๋Œ€๊ธฐ]
    P --> X
    X --> F
Loading

์ด๋ฏธ์ง€ ์ „์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ

flowchart LR
    A[์›๋ณธ ์ด๋ฏธ์ง€] --> B[์ข…ํšก๋น„ ๊ณ„์‚ฐ]
    B --> C[๋ ˆํ„ฐ๋ฐ•์‹ฑ ๋ฆฌ์‚ฌ์ด์ง• 640x640]
    C --> D[ํŒจ๋”ฉ/์ •๊ทœํ™”]
    D --> E[HWC โ†’ CHW ๋ณ€ํ™˜]
    E --> F[ONNX ์ž…๋ ฅ ํ…์„œ]
Loading

์ถ”๋ก  ๋ฐ ํ›„์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ

flowchart LR
    A[ONNX ์ž…๋ ฅ] --> B[YOLOv9 GELAN ์ถ”๋ก ]
    B --> C[์ถœ๋ ฅ ํ…์„œ ํŒŒ์‹ฑ]
    C --> D[์‹ ๋ขฐ๋„ ํ•„ํ„ฐ๋ง]
    D --> E[NMS ์ ์šฉ]
    E --> F[๋ฐ”์šด๋”ฉ ๋ฐ•์Šค ์ƒ‰์ƒ ๋งคํ•‘]
    F --> G[๊ฒฐ๊ณผ ์ด๋ฏธ์ง€]
Loading

๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™”

์ถ”๋ก  ์ตœ์ ํ™”

  • ONNX Runtime ์ตœ์ ํ™” ๋ ˆ๋ฒจ ์„ค์ • (Level1)
  • ํ”Œ๋žซํผ๋ณ„ ์ตœ์ ํ™”:
    • macOS: CoreML + ANE (Apple Neural Engine) ํ™œ์šฉ
    • ๊ธฐํƒ€ ํ”Œ๋žซํผ: CPU ์ตœ์ ํ™” (16 intra-threads, 8 inter-threads)
  • ๋ฉ”๋ชจ๋ฆฌ ํŒจํ„ด ์ตœ์ ํ™”
  • Pre-NMS ๋ฐ์ดํ„ฐ ์บ์‹ฑ์œผ๋กœ NMS ์žฌ์‹คํ–‰ ์ตœ์ ํ™”

GUI ์ตœ์ ํ™”

  • ์ž์—ฐ๋กœ๊ทธ ๊ธฐ๋ฐ˜ ์คŒ ์ œ์–ด (๋งค์šฐ ์„ธ๋ฐ€ํ•œ ์กฐ์ •)
  • ํšจ์œจ์ ์ธ ์ด๋ฏธ์ง€ ๋ Œ๋”๋ง
  • ๊ฐ€์ƒํ™”๋œ ํ…Œ์ด๋ธ” ํ‘œ์‹œ
  • ๋น„๋™๊ธฐ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ
  • ์ƒ‰์ƒ ๋งคํ•‘ ์ตœ์ ํ™”

๐Ÿ› ์—๋Ÿฌ ์ฒ˜๋ฆฌ

์—๋Ÿฌ ํƒ€์ž… (thiserror ์‚ฌ์šฉ)

  • ImageError: ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์˜ค๋ฅ˜
  • OrtError: ONNX ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜
  • DatabaseError: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ฅ˜
  • ValidationError: ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜
  • ConfigError: ์„ค์ • ์˜ค๋ฅ˜
  • CacheError: ์บ์‹œ ์˜ค๋ฅ˜

์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ „๋žต

  • ํŒจ๋‹‰ ๋ฐฉ์ง€: ๋ชจ๋“  unwrap() ์ œ๊ฑฐ
  • Graceful degradation
  • ์‚ฌ์šฉ์ž ์นœํ™”์  ์—๋Ÿฌ ๋ฉ”์‹œ์ง€
  • ์ž๋™ ๋ณต๊ตฌ ์‹œ๋„
  • ์ƒ์„ธํ•œ ๋กœ๊น…
  • ์ปค์Šคํ…€ ์—๋Ÿฌ ํƒ€์ž…์œผ๋กœ ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•๋ณด

๐Ÿ“Š ์„ฑ๋Šฅ ์ธก์ •

์ธก์ • ํ•ญ๋ชฉ

  • ์ถ”๋ก  ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ์ดˆ)
  • ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„
  • GUI ๋ Œ๋”๋ง ์‹œ๊ฐ„
  • ์บ์‹œ ํžˆํŠธ์œจ
  • ์ƒ‰์ƒ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ

์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ

  • SSD ์‚ฌ์šฉ ๊ถŒ์žฅ
  • ์ถฉ๋ถ„ํ•œ RAM ํ™•๋ณด (8GB+)
  • macOS์—์„œ CoreML + ANE ํ™œ์šฉ
  • ์ •๊ธฐ์ ์ธ ์บ์‹œ ์ •๋ฆฌ
  • ์ž์—ฐ๋กœ๊ทธ ์คŒ์œผ๋กœ ๋ถ€๋“œ๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜

๐Ÿ”ง ๊ฐœ๋ฐœ ์ •๋ณด

์˜์กด์„ฑ

  • ort: ONNX Runtime
  • eframe/egui: GUI ํ”„๋ ˆ์ž„์›Œํฌ
  • image/imageproc: ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ
  • rusqlite: SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • serde: ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”
  • thiserror: ์ปค์Šคํ…€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
  • once_cell: ์ง€์—ฐ ์ •์  ์ดˆ๊ธฐํ™”
  • ndarray: ์ˆ˜์น˜ ๊ณ„์‚ฐ
  • sha2: ํ•ด์‹œ ๊ณ„์‚ฐ
  • include_dir: ์ปดํŒŒ์ผ ํƒ€์ž„ ํŒŒ์ผ ์ž„๋ฒ ๋”ฉ

๋นŒ๋“œ ์ตœ์ ํ™”

[profile.release]
opt-level = 3
lto = true
codegen-units = 1
panic = "abort"

์ฝ”๋“œ ๊ตฌ์กฐ ๊ฐœ์„ 

  • ๋ชจ๋“ˆํ™”: config, error, utils ๋ชจ๋“ˆ ๋ถ„๋ฆฌ
  • ์ค‘์•™ํ™”๋œ ์„ค์ •: CONFIG ์ •์  ์ธ์Šคํ„ด์Šค
  • ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ ๋ถ„๋ฆฌ: ๊ณตํ†ต ๊ธฐ๋Šฅ ๋ชจ๋“ˆํ™”
  • ํƒ€์ž… ์•ˆ์ „์„ฑ: ์ปค์Šคํ…€ ์—๋Ÿฌ ํƒ€์ž… ์‚ฌ์šฉ
  • ์ปดํŒŒ์ผ ํƒ€์ž„ ์ž„๋ฒ ๋”ฉ: ๋ชจ๋ธ ํŒŒ์ผ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ํฌํ•จ
  • ํ”Œ๋žซํผ๋ณ„ ์ตœ์ ํ™”: macOS CoreML, CPU ์ตœ์ ํ™”

๐Ÿ“ ๋ผ์ด์„ผ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ผ์Šค ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

๐Ÿค ๊ธฐ์—ฌ

๋ฒ„๊ทธ ๋ฆฌํฌํŠธ, ๊ธฐ๋Šฅ ์ œ์•ˆ, ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

๐Ÿ“ž ์ง€์›

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages