Update README.md
Browse files
README.md
CHANGED
|
@@ -14,36 +14,57 @@ pipeline_tag: object-detection
|
|
| 14 |
|
| 15 |
# Edge Fire Detection AI (ํ์ฌ ๊ฐ์ ์จ์ ์์คํ
)
|
| 16 |
|
| 17 |
-
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5
|
| 18 |
|
| 19 |
## 1. ํ์ต ๋ฐ์ดํฐ (Training Data)
|
| 20 |
-
* **๋ฐ์ดํฐ ์ถ์ฒ:** AI Hub ํ์ฌ ๊ฐ์ง ์์ ๋ฐ์ดํฐ์
๋ฐ ์์ฒด ์์ง ํ์ฌ
|
| 21 |
-
* **ํด๋์ค
|
| 22 |
-
* **๋ฐ์ดํฐ ์ ์ ๋ฐ ์ฆ๊ฐ (Data Augmentation):**
|
| 23 |
-
*
|
|
|
|
| 24 |
|
| 25 |
-
## 2. ๋ชจ๋ธ ์ฑ๋ฅ (Evaluation)
|
| 26 |
|
| 27 |
-
| ํ๊ฐ ์งํ | ํ์ดํ ์น (.pt)
|
| 28 |
| :--- | :---: | :---: | :--- |
|
| 29 |
-
| **mAP50 (์ ์ฒด ์ ํ๋)** | 84.5% | 83.9% | ํฌ๋งท ๋ณํ์ ๋ฐ๋ฅธ ์ ํ๋ ์์ค
|
| 30 |
| **mAP50-95** | 0.521 | 0.518 | - |
|
| 31 |
-
| **์ถ๋ก ์๋ (Latency)** | ์ฝ 350ms | **์ฝ 45ms** | ONNX
|
| 32 |
|
| 33 |
-
## 3. ํ์ต
|
|
|
|
|
|
|
|
|
|
| 34 |
|
| 35 |
| ํญ๋ชฉ | ์ค์ ๊ฐ | ๋น๊ณ |
|
| 36 |
| :--- | :---: | :--- |
|
| 37 |
-
| **๊ธฐ๋ฐ ์ํคํ
์ฒ (Model)** | YOLOv8n | 3.2M ๊ฒฝ๋ ํ๋ผ๋ฏธํฐ ๊ตฌ์กฐ |
|
| 38 |
-
| **์
๋ ฅ ํด์๋ (imgsz)** | 320 / 640 | ๊ฐ๋ณ ํํฅ ๋ ์ด์ด ๋งคํ |
|
| 39 |
| **Epochs** | 50 | - |
|
| 40 |
-
| **Batch Size** | 32 |
|
| 41 |
| **Optimizer** | AdamW | - |
|
| 42 |
-
| **
|
|
|
|
| 43 |
|
| 44 |
-
## 4.
|
| 45 |
|
| 46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
|
| 48 |
```python
|
| 49 |
import cv2
|
|
@@ -54,24 +75,20 @@ import ipywidgets as widgets
|
|
| 54 |
import time
|
| 55 |
|
| 56 |
def main():
|
| 57 |
-
# 1. ๊ณ ์ ๊ฐ์ ONNX ๋ชจ๋ธ ๋ก๋ (task='detect' ๋ช
์ ํ์)
|
| 58 |
model_path = "best.onnx"
|
| 59 |
model = YOLO(model_path, task='detect')
|
| 60 |
|
| 61 |
-
#
|
| 62 |
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
|
| 63 |
-
|
| 64 |
-
# 3. ํ๋์จ์ด ๋์ญํญ ๊ณผ๋ถํ ๋ฐฉ์ง๋ฅผ ์ํ ํด์๋ ๋ฐ ๋ฒํผ ์ ์ด
|
| 65 |
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
|
| 66 |
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
|
| 67 |
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
|
| 68 |
|
| 69 |
-
time.sleep(1) #
|
| 70 |
if not cap.isOpened():
|
| 71 |
print("[์ค๋ฅ] ์นด๋ฉ๋ผ ์ฅ์น๋ฅผ ํ์ฑํํ ์ ์์ต๋๋ค.")
|
| 72 |
return
|
| 73 |
|
| 74 |
-
# ์ฃผํผํฐ ๋
ธํธ๋ถ ์ธ๋ผ์ธ ์ถ๋ ฅ์ ์ํ ์ด๋ฏธ์ง ์์ ฏ ์ ์ธ
|
| 75 |
image_widget = widgets.Image(format='jpeg', width=320, height=240)
|
| 76 |
display(image_widget)
|
| 77 |
|
|
@@ -81,17 +98,17 @@ def main():
|
|
| 81 |
if not success or frame is None:
|
| 82 |
continue
|
| 83 |
|
| 84 |
-
#
|
| 85 |
results = model(frame, imgsz=320, stream=True)
|
| 86 |
for r in results:
|
| 87 |
annotated_frame = r.plot()
|
| 88 |
|
| 89 |
-
#
|
| 90 |
ret, jpeg = cv2.imencode('.jpg', annotated_frame)
|
| 91 |
if ret:
|
| 92 |
image_widget.value = jpeg.tobytes()
|
| 93 |
|
| 94 |
-
#
|
| 95 |
time.sleep(0.04)
|
| 96 |
|
| 97 |
except KeyboardInterrupt:
|
|
@@ -105,34 +122,18 @@ if __name__ == '__main__':
|
|
| 105 |
main()
|
| 106 |
```
|
| 107 |
|
|
|
|
| 108 |
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
์
๋ ฅ(Input): ์ค์๊ฐ ์นด๋ฉ๋ผ ๋น๋์ค ํ๋ ์ (320x240 ๋๋ 640x480 RGB ์ด๋ฏธ์ง)
|
| 113 |
์ถ๋ ฅ(Output):
|
| 114 |
-
-
|
| 115 |
-
- ํด๋์ค ๋ ์ด๋ธ ๋งคํ: [flame, smoke]
|
| 116 |
-
- ์ ๋ขฐ๋ ์์น ์ถ๋ ฅ (Confidence Score: 0.0 ~ 1.0)
|
| 117 |
-
|
| 118 |
-
## 6. ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์๋ฒ ๋๋ ๋ฐฐํฌ ๊ฐ์ด๋
|
| 119 |
-
ํ๊ฒฝ ๊ตฌ์ถ ๋ฐ ์๋ฒ ๊ฐ๋
|
| 120 |
-
Bash
|
| 121 |
-
|
| 122 |
-
# ๊ฐ์ํ๊ฒฝ ์ง์
์ํ ํ์ธ ํ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฌ
|
| 123 |
-
conda activate myenv
|
| 124 |
-
pip install notebook ultralytics ipywidgets opencv-python onnxruntime
|
| 125 |
-
|
| 126 |
-
# ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5 ์ต์ OS์ ๋ฏธ๋์ด ์์ ๋
์ ์ ๊ธ(Lock) ์ฐํ ์ต์
์ ํ์ฌํ์ฌ ์ฃผํผํฐ ์คํ
|
| 127 |
-
LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libv4l/v4l1compat.so jupyter notebook --ip=0.0.0.0 --no-browser --port=8888
|
| 128 |
-
|
| 129 |
-
์น์บ ํ๋์จ์ด ์ค์๊ฐ ํธ๋ฌ๋ธ์ํ
์ธ์
|
| 130 |
-
|
| 131 |
-
select() timeout ๊ฒฝ๊ณ ๏ฟฝ๏ฟฝ์ ์: ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5์ ์ ๋ ฅ ๊ณต๊ธ ๋ฌธ์ ์ด๊ฑฐ๋ ์ปค๋ ๋ฝ ์ํ์
๋๋ค. ํฐ๋ฏธ๋์์ sudo reboot๋ฅผ ์ํํ์ฌ ์ฅ์น ๋ฝ์ ๊ฐ์ ์ด๊ธฐํํ ๋ค ์ฌ๊ฐ๋ํ์ญ์์ค.
|
| 132 |
-
|
| 133 |
-
ํ๋ฉด ๊นจ์ง ๋ฐ error dequeuing buf ๋ฐ์ ์: USB ๋ฒ์ค ์ ์ก ๋์ญํญ ํ๊ณ์น ์ด๊ณผ ํ์์
๋๋ค. ์นด๋ฉ๋ผ ์ฐ๊ฒฐ ์ ์ ๊ฒ์์ ํฌํธ์์ ์ ์ก ์ ๋ ฅ์ด ๋์ ํ๋์ USB 3.0 ํฌํธ๋ก ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ด๋ ์ ๋ ฌํ๊ณ ์ฝ๋ ๋ด ํด์๋๋ฅผ 320x240์ผ๋ก ์ ์งํ์ญ์์ค.
|
| 134 |
|
| 135 |
## 7. ๋ก์ปฌ ๋๊ธฐํ ๊ฐ์ค์น ๋ค์ด๋ก๋ CLI
|
| 136 |
-
Bash
|
| 137 |
|
| 138 |
-
|
|
|
|
|
|
|
|
|
| 14 |
|
| 15 |
# Edge Fire Detection AI (ํ์ฌ ๊ฐ์ ์จ์ ์์คํ
)
|
| 16 |
|
| 17 |
+
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5(Raspberry Pi 5) ์๋ฒ ๋๋ ์ฃ์ง ๋๋ฐ์ด์ค ํ๊ฒฝ์์ ์ค์๊ฐ์ผ๋ก ๋ถ๊ฝ(Flame)๊ณผ ์ฐ๊ธฐ(Smoke)๋ฅผ ๊ฐ์งํ๊ณ ๋ฐ์ด๋ฉ ๋ฐ์ค๋ฅผ ์ถ์ ํ๋ ๊ฒฝ๋ ๊ฐ์ฒด ํ์ง(Object Detection) ๋ชจ๋ธ์
๋๋ค. `YOLOv8n(Nano)` ์ํคํ
์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ด ํ์ต(Transfer Learning)์ ์งํํ์ผ๋ฉฐ, ํ๋์จ์ด ์ฐ์ฐ ๋ถํ๋ฅผ ์ต์ํํ๊ธฐ ์ํด `ONNX` ํฌ๋งท ๊ณ ์ ๋ฐํ์ ์ต์ ํ๋ฅผ ์ ์ฉํ์ต๋๋ค.
|
| 18 |
|
| 19 |
## 1. ํ์ต ๋ฐ์ดํฐ (Training Data)
|
| 20 |
+
* **๋ฐ์ดํฐ ์ถ์ฒ:** AI Hub ํ์ฌ ๊ฐ์ง ์์ ๋ฐ์ดํฐ์
๋ฐ ์์ฒด ์์ง ํ์ฌ ์ด๋ฏธ์ง ์
|
| 21 |
+
* **ํด๋์ค ์ ์:** ์ด 2๊ฐ ํด๋์ค (`flame`: ๋ถ๊ฝ / `smoke`: ์ฐ๊ธฐ)
|
| 22 |
+
* **๋ฐ์ดํฐ ์ ์ ๋ฐ ์ฆ๊ฐ (Data Augmentation):**
|
| 23 |
+
* ์ผ๊ฐ ๋ฐ ์ค์ง ๋ฑ ์ ์กฐ๋ ์ํฉ์์์ ์ค์๋(False Positive)์ ์ฐจ๋จํ๊ธฐ ์ํด ๋ฐ๊ธฐ ๋ณํ, ํ๋ฆผ(Blur), ๋ชจ์์ดํฌ(Mosaic) ์ฆ๊ฐ ๊ธฐ๋ฒ์ ์ ์ฉํ์ฌ ๋ชจ๋ธ์ ๊ฐ๊ฑด์ฑ(Robustness) ํ๋ณด
|
| 24 |
+
* ์ฃ์ง ๋๋ฐ์ด์ค์ I/O ๋ฒ์ค ๋์ญํญ ๋ถํ๋ฅผ ๊ฒฝ๊ฐํ๊ธฐ ์ํด ์
๋ ฅ ํด์๋๋ฅผ 320x240 ๋ฐ 640x480 ํฌ ํธ๋ ๊ท๊ฒฉ์ผ๋ก ์ค์ผ์ผ๋ง ์ ์ฒ๋ฆฌ ์ํ
|
| 25 |
|
| 26 |
+
## 2. ๋ชจ๋ธ ์ฑ๋ฅ (Evaluation Metrics)
|
| 27 |
|
| 28 |
+
| ํ๊ฐ ์งํ | ํ์ดํ ์น (.pt) ์๋ณธ | ONNX ๊ฒฝ๋ ๊ฐ์ ๊ท๊ฒฉ | ๋น๊ณ (๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5 CPU ๊ธฐ์ค) |
|
| 29 |
| :--- | :---: | :---: | :--- |
|
| 30 |
+
| **mAP50 (์ ์ฒด ์ ํ๋)** | 84.5% | 83.9% | ํฌ๋งท ๋ณํ์ ๋ฐ๋ฅธ ์ ํ๋ ์์ค 0.6% ๋ฏธ๋ง ๋ฐฉ์ด |
|
| 31 |
| **mAP50-95** | 0.521 | 0.518 | - |
|
| 32 |
+
| **์ถ๋ก ์๋ (Latency)** | ์ฝ 350ms | **์ฝ 45ms** | ONNX ๋ณํ ํ ์ค์๊ฐ์ฑ(20 FPS ์ด์) ์๋ ด |
|
| 33 |
|
| 34 |
+
## 3. ๋ชจ๋ธ ํ์ต ๊ณผ์ (Model Training Process)
|
| 35 |
+
* **ํ์ต ์ธํ๋ผ:** ๊ณ ์ฑ๋ฅ ์ธ์ฅ GPU(RTX 5070 Ti, 32GB RAM) ํ๊ฒฝ ๊ธฐ๋ฐ ๋ก์ปฌ ๊ฐ์ ๋น๋ ๊ตฌ๋
|
| 36 |
+
* **๊ธฐ๋ฐ ์ํคํ
์ฒ:** 3.2M ๊ฐ๋ฒผ์ด ํ๋ผ๋ฏธํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง `YOLOv8n`์ ๋ฐฑ๋ณธ(Backbone)์ผ๋ก ์ฑํํ์ฌ ์๋ฒ ๋๋ CPU ๊ฐ๋ ๋์ญํญ ์ฌ์ ํ๋ณด
|
| 37 |
+
* **ํ์ดํผํ๋ผ๋ฏธํฐ ์ค์ :**
|
| 38 |
|
| 39 |
| ํญ๋ชฉ | ์ค์ ๊ฐ | ๋น๊ณ |
|
| 40 |
| :--- | :---: | :--- |
|
|
|
|
|
|
|
| 41 |
| **Epochs** | 50 | - |
|
| 42 |
+
| **Batch Size** | 32 | ํ๋์จ์ด VRAM ์ต์ ํ ํฌ๊ธฐ |
|
| 43 |
| **Optimizer** | AdamW | - |
|
| 44 |
+
| **Learning Rate** | 1e-3 | ์ด๊ธฐ ํ์ต๋ฅ ์ง์ |
|
| 45 |
+
| **Augmentation** | Mosaic (1.0), Blur (0.2) | ๊ฐํน ํ๊ฒฝ ์ค์๋ ์ฐจ๋จ์ฉ |
|
| 46 |
|
| 47 |
+
## 4. ๊ฐ๋ฐ ์ํ์ฐฉ์ค ๋ฐ ํธ๋ฌ๋ธ์ํ
(Trials & Errors)
|
| 48 |
|
| 49 |
+
์๋ฒ ๋๋ ์ฃ์ง AI ์์คํ
๊ตฌํ ์ค ๋ฐ์ํ ๋ฌผ๋ฆฌ/์ํํธ์จ์ด ๋ ์ด์ด์ ๋ณ๋ชฉ ํ์๊ณผ ํด๊ฒฐ ๋ฆฌํฌํธ์
๋๋ค.
|
| 50 |
+
|
| 51 |
+
### โ PyTorch ์์ ๋ชจ๋ธ(.pt) ๊ตฌ๋ ์ ๋ ์ดํด์ ์ ํ
|
| 52 |
+
* **๋ฌธ์ ์ํฉ:** ํ์ต ์๋ฃ๋ `best.pt` ๊ฐ์ค์น๋ฅผ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5 CPU ๋จ๋
ํ๊ฒฝ์์ ์ถ๋ก ํ์ ๋ ํ๋ ์ ์ง์ฐ์ด ์ฝ 350ms(3 FPS ๋ฏธ๋ง)๊น์ง ๋์ด๋ ์ค์๊ฐ ํ์ฌ ํ์ง๊ฐ ๋ถ๊ฐ๋ฅํ ๋ณ๋ชฉ ์ง๋ฉด.
|
| 53 |
+
* **ํด๊ฒฐ ์กฐ์น:** ์ ์ ์ฐ์ฐ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง `ONNX` ํฌ๋งท์ผ๋ก ๋ชจ๋ธ์ ์ต์คํฌํธ(`format=onnx`, `imgsz=320`)ํ๊ณ , ํ์ด์ฌ ๋ฐฑ์๋์ `onnxruntime` ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ๊ฒฐํฉํ์ฌ ์ถ๋ก ๋ ์ดํด์๋ฅผ 45ms(22 FPS ์ด์) ์์ค์ผ๋ก ๋น์ฝ์ ์ผ๋ก ๋จ์ถํจ.
|
| 54 |
+
|
| 55 |
+
### โก Linux V4L2 ์ฅ์น ์ฑ๋ ํ์์์ (`select() timeout`)
|
| 56 |
+
* **๋ฌธ์ ์ํฉ:** ์ต์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด OS(Bookworm) ์ปค๋์์ OpenCV๋ก ์น์บ ์ ํธ์ถํ ๋ ๋ฏธ๋์ด ์ปจํธ๋กค๋ฌ ๊ฐ์ ์คํ์ด `/dev/video0` ์์์ ๋
์ ์ ์ (Lock)ํ์ฌ `select() timeout`๊ณผ ํจ๊ป ํ๋์จ์ด ์ข๋น ๋ฝ ํ์ ๋ฐ์.
|
| 57 |
+
* **ํด๊ฒฐ ์กฐ์น:** OpenCV ์นด๋ฉ๋ผ ๊ฐ์ ์ฝ๋๋จ์ V4L2 ๋ฐฑ์๋๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ (`cv2.VideoCapture(0, cv2.CAP_V4L2)`)ํ๊ณ , ์ฃผํผํฐ ์๋ฒ ๊ตฌ๋ ์ ๋ฆฌ๋
์ค ์๋ฎฌ๋ ์ด์
ํธํ ๋ ์ด์ด ํ๊ฒฝ ๋ณ์์ธ `LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libv4l/v4l1compat.so`๋ฅผ ํ๋ฆฌ๋ก๋ ๋ํํ์ฌ ์ปค๋ ์ ์ ์ถฉ๋์ ์ฐํํจ.
|
| 58 |
+
|
| 59 |
+
### โข USB ๋ฒ์ค ๋์ญํญ ์ด๊ณผ ๋ฐ ํฝ์
์ค์ผ (`error dequeuing buf`)
|
| 60 |
+
* **๋ฌธ์ ์ํฉ:** ์์ถ ์ฝ๋ฑ ๊ธฐ๋ฅ์ด ์๋ ์ผ๋ฐ ์น์บ ์ ์์ ๋ฐ์ดํฐ(Raw YUYV)๋ฅผ 640x480 ํด์๋๋ก ์์ ์, ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด USB ๋์ญํญ ํ๊ณ๋ก ํ๋ ์ ๋ฒํผ๊ฐ ๋์๋์ด ํ๋ฉด์ด ์ง์ง๊ฑฐ๋ฆฌ๊ฑฐ๋ ๊ฒ์์(Black Screen)์ผ๋ก ์ฃฝ๋ ํ์ ๋ฐ์.
|
| 61 |
+
* **ํด๊ฒฐ ์กฐ์น:** ์น์บ ์ ์ ๋ ฅ ๋ฐ ์ ์ก ํจ์จ์ด ๋์ **ํ๋์ USB 3.0 ํฌํธ**๋ก ๋ฌผ๋ฆฌ์ ์ด๋ ์ ๋ ฌ์ ์ํํ ํ, ์ฝ๋ ๋ ๋ฒจ์์ ์
๋ ฅ ํด์๋๋ฅผ `320x240`์ผ๋ก ๋ํญ ๋ฎ์ถ๊ณ ๊ณ ์ ์์ถ ์คํธ๋ฆฌ๋ฐ ํฌ๋งท(`MJPG`) ์ฝ๋ฑ ์ง์ ์ ๊ฐ์ ํํ์ฌ ๋ฐ์ดํฐ ๋ฒ์ค ํต๋ก๋ฅผ ๋ณต๊ตฌํจ.
|
| 62 |
+
|
| 63 |
+
### โฃ ์ฃผํผํฐ ๋คํธ์ํฌ ์น ์์ผ ๋ถ๊ดด ํฌ๋์ (`ZMQError`)
|
| 64 |
+
* **๋ฌธ์ ์ํฉ:** ์ถ๋ก `while` ๋ฃจํ๊ฐ ์ด๋น ์์ญ ์ฅ์ ์ด๋ฏธ์ง๋ฅผ ์ง์ฐ ์์ด ์ฃผํผํฐ ์ธ๋ผ์ธ ์์ ฏ(`ipywidgets`) ํ๋ฉด์ผ๋ก ๋ฐ์ด ๋ฃ์ผ๋ฉด์ ํต์ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ก ์ธํด ์ฃผํผํฐ ์ปค๋์ด ์ ์งํ๊ณ ์์ผ์ด ํฐ์ง๋ ํ์ ๋ฐ์.
|
| 65 |
+
* **ํด๊ฒฐ ์กฐ์น:** ์ด๋ฏธ์ง ๋ณํ ๋ฐ ์ ์ก ๋ฃจํด ์งํ ๋ฏธ์ธ ์ ํด ์ฐ์ฐ ํ์์ธ `time.sleep(0.04)` ์ง์ฐ ๋ฒํผ ๋ก์ง์ ์์ฐฉ์์ผ ์ด๋น ์ ์ก๋ฅ ์ 20~25ํ๋ ์ ์์ค์ผ๋ก ์์ ํํจ์ผ๋ก์จ ์ฐ์ ๊ตฌ๋ ์์ ์ฑ์ ํ๋ณดํจ.
|
| 66 |
+
|
| 67 |
+
## 5. ์ฌ์ฉ ๋ฐฉ๋ฒ (Inference Code)
|
| 68 |
|
| 69 |
```python
|
| 70 |
import cv2
|
|
|
|
| 75 |
import time
|
| 76 |
|
| 77 |
def main():
|
|
|
|
| 78 |
model_path = "best.onnx"
|
| 79 |
model = YOLO(model_path, task='detect')
|
| 80 |
|
| 81 |
+
# V4L2 ๊ฐ์ ๋ฐฑ์๋ ๋งคํ
|
| 82 |
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
|
|
|
|
|
|
|
| 83 |
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
|
| 84 |
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
|
| 85 |
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
|
| 86 |
|
| 87 |
+
time.sleep(1) # ํ๋์จ์ด ์์ ํ ๋๊ธฐ
|
| 88 |
if not cap.isOpened():
|
| 89 |
print("[์ค๋ฅ] ์นด๋ฉ๋ผ ์ฅ์น๋ฅผ ํ์ฑํํ ์ ์์ต๋๋ค.")
|
| 90 |
return
|
| 91 |
|
|
|
|
| 92 |
image_widget = widgets.Image(format='jpeg', width=320, height=240)
|
| 93 |
display(image_widget)
|
| 94 |
|
|
|
|
| 98 |
if not success or frame is None:
|
| 99 |
continue
|
| 100 |
|
| 101 |
+
# ONNX ๊ฐ์ ์ถ๋ก ๊ตฌ๋ (imgsz ์ผ์น)
|
| 102 |
results = model(frame, imgsz=320, stream=True)
|
| 103 |
for r in results:
|
| 104 |
annotated_frame = r.plot()
|
| 105 |
|
| 106 |
+
# JPEG ์์ถ ํ ์ฃผํผํฐ ๋ ๋๋ง ์์ญ ์
๋ฐ์ดํธ
|
| 107 |
ret, jpeg = cv2.imencode('.jpg', annotated_frame)
|
| 108 |
if ret:
|
| 109 |
image_widget.value = jpeg.tobytes()
|
| 110 |
|
| 111 |
+
# ZMQ ๊ณผ๋ถํ ๋ฐฉ์ง์ฉ micro-delay
|
| 112 |
time.sleep(0.04)
|
| 113 |
|
| 114 |
except KeyboardInterrupt:
|
|
|
|
| 122 |
main()
|
| 123 |
```
|
| 124 |
|
| 125 |
+
## 6. ์
์ถ๋ ฅ ํ์ (Input / Output Format)
|
| 126 |
|
| 127 |
+
``` Plaintext
|
| 128 |
+
์
๋ ฅ(Input): ์ค์๊ฐ ์๋ฒ ๋๋ ์นด๋ฉ๋ผ ๋น๋์ค ํ๋ ์ (320x240 RGB Image)
|
|
|
|
|
|
|
| 129 |
์ถ๋ ฅ(Output):
|
| 130 |
+
- ๋ถ๊ฝ ๋ฐ ์ฐ๊ธฐ ์์ญ ๋ฐ์ด๋ฉ ๋ฐ์ค(Bounding Box) ์๊ฐํ ํฌ์ฌ
|
| 131 |
+
- ํ์ง ํด๋์ค ๋ ์ด๋ธ ๋งคํ: [flame, smoke]
|
| 132 |
+
- ๊ฐ์ฒด๋ณ ์ถ๋ก ์ ๋ขฐ๋ ์์น ์ถ๋ ฅ (Confidence Score: 0.0 ~ 1.0)
|
| 133 |
+
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 134 |
|
| 135 |
## 7. ๋ก์ปฌ ๋๊ธฐํ ๊ฐ์ค์น ๋ค์ด๋ก๋ CLI
|
|
|
|
| 136 |
|
| 137 |
+
``` Bash
|
| 138 |
+
huggingface-cli download firedetection/fire_detection_yolov8n --local-dir ./model
|
| 139 |
+
```
|