File size: 5,616 Bytes
96f110e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eed1467
96f110e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eed1467
96f110e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eed1467
96f110e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
---
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 μž…λ‹ˆλ‹€.