cosmos0311 commited on
Commit
8a86372
ยท
verified ยท
1 Parent(s): 68a7230

Create README.md

Browse files
Files changed (1) hide show
  1. README.md +138 -0
README.md ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: agpl-3.0
3
+ base_model: ultralytics/yolov8n
4
+ tags:
5
+ - yolov8
6
+ - object-detection
7
+ - onnx
8
+ - onnxruntime
9
+ - raspberry-pi5
10
+ - edge-ai
11
+ - fire-detection
12
+ pipeline_tag: object-detection
13
+ ---
14
+
15
+ # Edge Fire Detection AI (ํ™”์žฌ ๊ฐ์‹œ ์˜จ์  ์‹œ์Šคํ…œ)
16
+
17
+ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 5 ๋“ฑ ์ž„๋ฒ ๋””๋“œ ์—ฃ์ง€ ๋””๋ฐ”์ด์Šค ํ™˜๊ฒฝ์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ถˆ๊ฝƒ(Flame)๊ณผ ์—ฐ๊ธฐ(Smoke)๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ๊ฐ์ฒด ํƒ์ง€(Object Detection) ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. `YOLOv8n(Nano)` ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ์ธํŠœ๋‹๋˜์—ˆ์œผ๋ฉฐ, ์—ฃ์ง€ ํ™˜๊ฒฝ์—์„œ์˜ ์‹ค์‹œ๊ฐ„์„ฑ ํ™•๋ณด๋ฅผ ์œ„ํ•ด `ONNX` ํฌ๋งท ๊ณ ์† ์ตœ์ ํ™” ๋Ÿฐํƒ€์ž„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
18
+
19
+ ## 1. ํ•™์Šต ๋ฐ์ดํ„ฐ (Training Data)
20
+ * **๋ฐ์ดํ„ฐ ์ถœ์ฒ˜:** AI Hub ํ™”์žฌ ๊ฐ์ง€ ์˜์ƒ ๋ฐ์ดํ„ฐ์…‹ ๋ฐ ์ž์ฒด ์ˆ˜์ง‘ ํ™”์žฌ ์ „์ฒ˜๋ฆฌ ์ด๋ฏธ์ง€
21
+ * **ํด๋ž˜์Šค ๊ตฌ์„ฑ:** ์ด 2๊ฐœ ํด๋ž˜์Šค ์ •๋ ฌ (`flame`: ๋ถˆ๊ฝƒ / `smoke`: ์—ฐ๊ธฐ)
22
+ * **๋ฐ์ดํ„ฐ ์ •์ œ ๋ฐ ์ฆ๊ฐ• (Data Augmentation):** * ์ €์กฐ๋„ ๊ฐ€ํ˜น ํ™˜๊ฒฝ ๋ฐ ์นด๋ฉ”๋ผ ๋…ธ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ์˜ ์˜ค์ž‘๋™(False Positive)์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ๊ธฐ ๋ณ€ํ˜•, ํ๋ฆผ(Blur), ๋ชจ์ž์ดํฌ ์ฆ๊ฐ• ๊ธฐ๋ฒ• ์ ์šฉ
23
+ * ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 5 I/O ๋ฒ„์Šค ์ „์†ก๋Ÿ‰ ๊ณผ๋ถ€ํ•˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ž…๋ ฅ ํ•ด์ƒ๋„๋ฅผ 320x240 ๋ฐ 640x480 ์Šค์ผ€์ผ๋Ÿฌ๋กœ ๊ฐ€๊ณต ์ •๋ ฌ (v2)
24
+
25
+ ## 2. ๋ชจ๋ธ ์„ฑ๋Šฅ (Evaluation)
26
+
27
+ | ํ‰๊ฐ€ ์ง€ํ‘œ | ํŒŒ์ดํ† ์น˜ (.pt) ๊ทœ๊ฒฉ | ONNX ๊ฒฝ๋Ÿ‰ ๊ฐ€์† ๊ทœ๊ฒฉ | ๋น„๊ณ  (๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 5 CPU ๊ธฐ์ค€) |
28
+ | :--- | :---: | :---: | :--- |
29
+ | **mAP50 (์ „์ฒด ์ •ํ™•๋„)** | 84.5% | 83.9% | ํฌ๋งท ๋ณ€ํ™˜์— ๋”ฐ๋ฅธ ์ •ํ™•๋„ ์†์‹ค ์ตœ์†Œํ™” |
30
+ | **mAP50-95** | 0.521 | 0.518 | - |
31
+ | **์ถ”๋ก  ์†๋„ (Latency)** | ์•ฝ 350ms | **์•ฝ 45ms** | ONNX ๊ฐ€์† ์‹œ ์‹ค์‹œ๊ฐ„์„ฑ(20 FPS ์ด์ƒ) ๋‹ฌ์„ฑ |
32
+
33
+ ## 3. ํ•™์Šต ์„ค์ • (Hyperparameters)
34
+
35
+ | ํ•ญ๋ชฉ | ์„ค์ •๊ฐ’ | ๋น„๊ณ  |
36
+ | :--- | :---: | :--- |
37
+ | **๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ (Model)** | YOLOv8n | 3.2M ๊ฒฝ๋Ÿ‰ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ตฌ์กฐ |
38
+ | **์ž…๋ ฅ ํ•ด์ƒ๋„ (imgsz)** | 320 / 640 | ๊ฐ€๋ณ€ ํ•˜ํ–ฅ ๋ ˆ์ด์–ด ๋งคํ•‘ |
39
+ | **Epochs** | 50 | - |
40
+ | **Batch Size** | 32 | - |
41
+ | **Optimizer** | AdamW | - |
42
+ | **Augmentation** | Mosaic (1.0), Blur (0.2) | ์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ ์˜ค์ž‘๋™ ์ฐจ๋‹จ์šฉ |
43
+
44
+ ## 4. ์‚ฌ์šฉ ๋ฐฉ๋ฒ• (Inference Code)
45
+
46
+ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 5 ํ™˜๊ฒฝ์—์„œ `onnxruntime` ๋ฐฑ์—”๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•˜๋“œ์›จ์–ด ๋ณ‘๋ชฉ ์—†์ด ๊ณ ์† ์ถ”๋ก ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ ์ตœ์ ํ™” ๋งˆ์Šคํ„ฐ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.
47
+
48
+ ```python
49
+ import cv2
50
+ import numpy as np
51
+ from ultralytics import YOLO
52
+ from IPython.display import display
53
+ 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
+ # 2. V4L2 ๋ฆฌ๋ˆ…์Šค ํ‘œ์ค€ ๋น„๋””์˜ค ์ž…๋ ฅ ์†Œ์ผ“ ์—ฐ๊ฒฐ (๋ฌผ๋ฆฌ 0๋ฒˆ ์ฑ„๋„)
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
+
78
+ try:
79
+ while cap.isOpened():
80
+ success, frame = cap.read()
81
+ if not success or frame is None:
82
+ continue
83
+
84
+ # 4. YOLOv8 ONNX ๊ฐ€์† ์ถ”๋ก  ๊ตฌ๋™
85
+ results = model(frame, imgsz=320, stream=True)
86
+ for r in results:
87
+ annotated_frame = r.plot()
88
+
89
+ # 5. JPEG ์••์ถ• ์ธ์ฝ”๋”ฉ ํ›„ ์ฃผํ”ผํ„ฐ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ์ „์†ก
90
+ ret, jpeg = cv2.imencode('.jpg', annotated_frame)
91
+ if ret:
92
+ image_widget.value = jpeg.tobytes()
93
+
94
+ # ์ฃผํ”ผํ„ฐ ์›น ์†Œ์ผ“ ๊ณผ๋ถ€ํ•˜(ZMQ ์—๋Ÿฌ) ์ฐจ๋‹จ์šฉ ๋ฏธ์„ธ ์ง€์—ฐ
95
+ time.sleep(0.04)
96
+
97
+ except KeyboardInterrupt:
98
+ print("\n์‚ฌ์šฉ์ž์— ์˜ํ•ด ์‹œ์Šคํ…œ ๊ฐ€๋™์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
99
+ finally:
100
+ cap.release()
101
+ cv2.destroyAllWindows()
102
+ print("ํ•˜๋“œ์›จ์–ด ์ž์› ํšŒ์ˆ˜ ์™„๋ฃŒ.")
103
+
104
+ if __name__ == '__main__':
105
+ main()
106
+ ```
107
+
108
+
109
+ ## 5. ์ž…์ถœ๋ ฅ ํ˜•์‹ (Input / Output Format)
110
+ Plaintext
111
+
112
+ ์ž…๋ ฅ(Input): ์‹ค์‹œ๊ฐ„ ์นด๋ฉ”๋ผ ๋น„๋””์˜ค ํ”„๋ ˆ์ž„ (320x240 ๋˜๋Š” 640x480 RGB ์ด๋ฏธ์ง€)
113
+ ์ถœ๋ ฅ(Output):
114
+ - ์˜ˆ์ธก ๊ฐ์ฒด ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค ํˆฌ์‚ฌ (Bounding Box ์ขŒํ‘œ ์ •๋ณด)
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
+ huggingface-cli download Onjeom/fire_detection_yolov8n --local-dir ./model