phoenix_detection / README.md
albitro's picture
Update repo id after rename to phoenix_detection
eed1467 verified
|
Raw
History Blame Contribute Delete
5.62 kB
---
license: agpl-3.0
tags:
- object-detection
- ultralytics
- yolo
- yolo26
- fire-detection
- computer-vision
- pytorch
library_name: ultralytics
pipeline_tag: object-detection
base_model: Ultralytics/YOLO26
---
# Phoenix Detection β€” YOLO26s ν™”μž¬Β·μ‚¬λžŒ 탐지 (μ „μ²˜λ¦¬ 유무 비ꡐ)
ν™”μž¬ ν˜„μž₯μ—μ„œ **뢈(fire)** κ³Ό **μ‚¬λžŒ(person)** 을 νƒμ§€ν•˜λŠ” YOLO26s λͺ¨λΈ 두 κ°œμž…λ‹ˆλ‹€.
같은 데이터셋·같은 ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ‘œ ν•™μŠ΅ν–ˆκ³ , **μž…λ ₯ 이미지 μ „μ²˜λ¦¬ 유무만 λ‹€λ¦…λ‹ˆλ‹€.**
| | `baseline/` | `filtered/` |
|---|---|---|
| ν•™μŠ΅ 이미지 | Roboflow 원본 | λ””ν—€μ΄μ¦ˆ + CLAHE 적용본 |
| μΆ”λ‘  μ‹œ μ „μ²˜λ¦¬ | λΆˆν•„μš” | **ν•„μˆ˜** (μ•„λž˜ μ°Έμ‘°) |
| μš©λ„ | λŒ€μ‘°κ΅° | μ—°λ¬΄Β·μ €λŒ€λΉ„ ν™˜κ²½ λŒ€μ‘ |
## μ„±λŠ₯ (test split, 71 images / 94 instances)
| λͺ¨λΈ | P | R | mAP@50 | mAP@50-95 |
|---|---|---|---|---|
| baseline | 0.967 | 0.967 | 0.982 | 0.702 |
| **filtered** | **0.983** | **0.980** | **0.994** | **0.715** |
ν΄λž˜μŠ€λ³„ (mAP@50 / mAP@50-95):
| 클래슀 | baseline | filtered |
|---|---|---|
| fire | 0.971 / 0.616 | **0.995 / 0.634** |
| person | **0.994** / 0.788 | 0.992 / **0.796** |
μ „μ²˜λ¦¬λ³Έμ΄ λͺ¨λ“  μ’…ν•© μ§€ν‘œμ—μ„œ μ•žμ„œκ³ , 특히 `fire` 클래슀의 mAP@50 이 0.971 β†’ 0.995 둜 μ˜€λ¦…λ‹ˆλ‹€.
λ‹€λ§Œ **test 셋이 71μž₯뿐**이라 이 차이λ₯Ό ν†΅κ³„μ μœΌλ‘œ μœ μ˜ν•˜λ‹€κ³  λ‹¨μ •ν•˜κΈ°λŠ” μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
κ²½ν–₯의 근거둜만 λ³΄μ‹œκ³ , νŒλ‹¨μ΄ μ€‘μš”ν•œ μš©λ„λΌλ©΄ 더 큰 μ…‹μ—μ„œ μž¬ν™•μΈν•˜μ„Έμš”.
각 ν΄λ”μ˜ `results.csv`(에폭별 전체 곑선), `results.png`, `confusion_matrix_normalized.png`,
`BoxPR_curve.png` 둜 ν•™μŠ΅ 과정을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. ν‘œμ˜ μˆ˜μΉ˜λŠ” 각 λͺ¨λΈμ˜ best 체크포인트λ₯Ό
test split μ—μ„œ μž¬ν‰κ°€ν•œ κ°’μž…λ‹ˆλ‹€.
## μ‚¬μš©λ²•
### baseline
```python
from ultralytics import YOLO
from huggingface_hub import hf_hub_download
w = hf_hub_download("albitro/phoenix_detection", "baseline/best.pt")
model = YOLO(w)
results = model("frame.jpg")
results[0].show()
```
### filtered β€” μ „μ²˜λ¦¬λ₯Ό λ°˜λ“œμ‹œ 거쳐야 ν•©λ‹ˆλ‹€
이 κ°€μ€‘μΉ˜λŠ” μ „μ²˜λ¦¬λœ ν”½μ…€λ‘œ ν•™μŠ΅λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 원본 이미지λ₯Ό κ·ΈλŒ€λ‘œ λ„£μœΌλ©΄ ν•™μŠ΅/μΆ”λ‘  뢄포가
μ–΄κΈ‹λ‚˜ μ„±λŠ₯이 λ–¨μ–΄μ§‘λ‹ˆλ‹€. ν•™μŠ΅μ— μ“΄ 것과 **λ™μΌν•œ** νŒŒμ΄ν”„λΌμΈμ„ `filtered/preprocess/` 에
ν•¨κ»˜ μ˜¬λ €λ‘μ—ˆμŠ΅λ‹ˆλ‹€ (`opencv-python`, `numpy` 만 있으면 λ™μž‘ν•˜λ©° ROS μ˜μ‘΄μ„± μ—†μŒ).
```python
import cv2
from ultralytics import YOLO
from huggingface_hub import snapshot_download
repo = snapshot_download("albitro/phoenix_detection")
import sys; sys.path.insert(0, f"{repo}/filtered")
from preprocess import build_default_pipeline
pipe = build_default_pipeline() # filter_params.json 의 κ°’ κ·ΈλŒ€λ‘œ
model = YOLO(f"{repo}/filtered/best.pt")
bgr = cv2.imread("frame.jpg") # BGR, uint8
results = model(pipe.process(bgr))
results[0].show()
```
`pipe.process()` λŠ” BGR uint8 을 λ°›μ•„ BGR uint8 을 λŒλ €μ€λ‹ˆλ‹€. λΉ„λ””μ˜€ μŠ€νŠΈλ¦Όμ—μ„œλŠ”
`pipe` λ₯Ό ν•œ 번만 λ§Œλ“€μ–΄ μž¬μ‚¬μš©ν•˜μ„Έμš” (ν”„λ ˆμž„λ§ˆλ‹€ μƒˆλ‘œ λ§Œλ“€ ν•„μš” μ—†μŒ).
## μ „μ²˜λ¦¬ νŒŒμ΄ν”„λΌμΈ
`mode="full"` β€” 감마 보정 β†’ Dark Channel Prior λ””ν—€μ΄μ¦ˆ(guided filter refinement) β†’ CLAHE.
전체 νŒŒλΌλ―Έν„°λŠ” `filtered/filter_params.json` 에 있고 `preprocess.DEFAULTS` 와 μΌμΉ˜ν•©λ‹ˆλ‹€.
μ£Όμš” κ°’: `omega=0.95`, `t0=0.1`, `patch=15`, `scale=0.25`, `a_max=0.92`,
`clahe_clip=2.0`, `clahe_tile=8`, `gamma=1.0`.
## 데이터셋
[Roboflow Universe β€” `-ssifa/it-t82tu` v1](https://universe.roboflow.com/-ssifa/it-t82tu/dataset/1)
(CC BY 4.0). 640Γ—480, 2 클래슀, train 307 / valid 94 / test 71.
`filtered` 데이터셋은 원본에 μ „μ²˜λ¦¬λ₯Ό μ μš©ν•œ μ‚¬λ³Έμž…λ‹ˆλ‹€. **λΆ„ν•  λ©€λ²„μ‹­Β·νŒŒμΌλͺ…·라벨이 원본과
μ™„μ „νžˆ λ™μΌν•˜κ³  ν”½μ…€κ°’λ§Œ λ‹€λ¦…λ‹ˆλ‹€** β€” λ””ν—€μ΄μ¦ˆμ™€ CLAHE λŠ” ν™”μ†Œκ°’ λ³€ν™˜μ΄λΌ λ°”μš΄λ”©λ°•μŠ€κ°€
움직이지 μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 두 λͺ¨λΈμ˜ 차이가 μ „μ²˜λ¦¬ νš¨κ³ΌμΈμ§€ λΆ„ν•  μš΄μΈμ§€ ν—·κ°ˆλ¦¬μ§€ μ•Šλ„λ‘
μ˜λ„μ μœΌλ‘œ μ΄λ ‡κ²Œ λ§žμ·„μŠ΅λ‹ˆλ‹€. μž¬μ••μΆ• 손싀이 μ „μ²˜λ¦¬ μ‘°κ±΄μ—λ§Œ μ–ΉνžˆλŠ” 것을 ν”Όν•˜λ €κ³  사본은
PNG λ¬΄μ†μ‹€λ‘œ μ €μž₯ν–ˆμŠ΅λ‹ˆλ‹€.
데이터셋 μžμ²΄λŠ” 이 λ ˆν¬μ— 포함돼 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 클래슀 μ •μ˜λŠ” `data.yaml` μ°Έμ‘°.
## ν•™μŠ΅ μ„€μ •
두 λͺ¨λΈ κ³΅ν†΅μž…λ‹ˆλ‹€. μ „μ²΄λŠ” 각 ν΄λ”μ˜ `args.yaml` 에 μžˆμŠ΅λ‹ˆλ‹€.
| | |
|---|---|
| base | `yolo26s.pt` (COCO pretrained) |
| epochs | 100 (baseline best @79, filtered best @95) |
| imgsz | 640 |
| batch | 16 |
| optimizer | auto |
| seed | 0 |
| device | Intel Arc B580 (XPU), PyTorch 2.13.0+xpu |
| ultralytics | 8.4.117 |
## ν•œκ³„
- **μž‘μ€ 데이터셋** (총 472μž₯). 촬영 ν™˜κ²½μ΄ ν•™μŠ΅ 데이터와 λ‹€λ₯΄λ©΄ μΌλ°˜ν™”κ°€ λ–¨μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
- test μ…‹ 71μž₯ κΈ°μ€€μ˜ 비ꡐ라 두 λͺ¨λΈ κ°„ 차이의 신뒰ꡬ간이 λ„“μŠ΅λ‹ˆλ‹€.
- `fire` 의 mAP@50-95 κ°€ 0.63 μˆ˜μ€€μž…λ‹ˆλ‹€. 탐지 μ—¬λΆ€(mAP@50 0.995)λŠ” μ‹ λ’°ν•  λ§Œν•˜μ§€λ§Œ
λΆˆκ½ƒ κ²½κ³„μ˜ λ°•μŠ€ μ •λ°€λ„λŠ” 그만큼 λ†’μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ β€” λΆˆκ½ƒμ€ 경계가 λͺ¨ν˜Έν•œ λŒ€μƒμž…λ‹ˆλ‹€.
- μ•ˆμ „μ΄ κ±Έλ¦° μš©λ„μ— 단독 νŒλ‹¨ 근거둜 μ“°μ§€ λ§ˆμ„Έμš”. μ‚¬λžŒμ˜ 확인을 κ±°μΉ˜λŠ” 경보 보쑰둜만 μ“°μ„Έμš”.
## λΌμ΄μ„ μŠ€
κ°€μ€‘μΉ˜λŠ” Ultralytics YOLO μ—μ„œ νŒŒμƒλ˜μ–΄ **AGPL-3.0** 을 λ”°λ¦…λ‹ˆλ‹€. λ„€νŠΈμ›Œν¬ μ„œλΉ„μŠ€λ‘œ 배포할
경우 μ†ŒμŠ€ 곡개 μ˜λ¬΄κ°€ λ”°λΌμ˜΅λ‹ˆλ‹€. μƒμš© μš©λ„λΌλ©΄ Ultralytics μ—”ν„°ν”„λΌμ΄μ¦ˆ λΌμ΄μ„ μŠ€λ₯Ό ν™•μΈν•˜μ„Έμš”.
ν•™μŠ΅ 데이터셋은 CC BY 4.0 μž…λ‹ˆλ‹€.