๋น ๋ฅธ ์์ ๊ฐ์ด๋: ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์ Ultralytics YOLOv8
์ด ์ข ํฉ ๊ฐ์ด๋๋ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ๋๋ฐ์ด์ค์ Ultralytics YOLOv8 ๋ฐฐํฌ์ ๋ํ ์์ธํ ์๋ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ํ ์ด ์๊ณ ๊ฐ๋ ฅํ ์ฅ์น์์ YOLOv8 ์ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ์ฑ๋ฅ ๋ฒค์น๋งํฌ๋ ์๊ฐํฉ๋๋ค.
Watch: ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 5 ์
๋ฐ์ดํธ ๋ฐ ๊ฐ์ ์ฌํญ.
์ฐธ๊ณ
์ด ๊ฐ์ด๋๋ ์ต์ Raspberry Pi OS Bookworm(๋ฐ๋น์ 12)์ ์คํํ๋ Raspberry Pi 4 ๋ฐ Raspberry Pi 5๋ก ํ ์คํธ๋์์ต๋๋ค. Raspberry Pi 3์ ๊ฐ์ ๊ตฌํ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ๊ธฐ๊ธฐ์์ ์ด ๊ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋์ผํ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด OS ๋ถ์์ด ์ค์น๋์ด ์๋ ํ ์ ์์ ์ผ๋ก ์๋ํ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด๋ ๋ฌด์์ธ๊ฐ์?
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด๋ ์๊ณ ์ ๋ ดํ ์ฑ๊ธ ๋ณด๋ ์ปดํจํฐ์ ๋๋ค. ์ทจ๋ฏธ์ฉ ํ ์คํ ๋ฉ์ด์ ๋ถํฐ ์ฐ์ ์ฉ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ํ๋ก์ ํธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ๋ณด๋๋ ๋ค์ํ ์ด์ ์ฒด์ ๋ฅผ ์คํํ ์ ์์ผ๋ฉฐ, ์ผ์, ์ก์ถ์์ดํฐ ๋ฐ ๊ธฐํ ํ๋์จ์ด ๊ตฌ์ฑ ์์์ ์ฝ๊ฒ ํตํฉํ ์ ์๋ GPIO(๋ฒ์ฉ ์ ๋ ฅ/์ถ๋ ฅ) ํ์ ์ ๊ณตํฉ๋๋ค. ๋ค์ํ ์ฌ์์ ๋ค์ํ ๋ชจ๋ธ๋ก ์ ๊ณต๋์ง๋ง, ๋ชจ๋ ์ ๋ ดํ๊ณ ์ปดํฉํธํ๋ฉฐ ๋ค์ฉ๋๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๊ธฐ๋ณธ ์ค๊ณ ์ฒ ํ์ ๋์ผํฉ๋๋ค.
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ์๋ฆฌ์ฆ ๋น๊ต
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 3 | ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 4 | ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 5 | |
---|---|---|---|
CPU | ๋ธ๋ก๋์ปด BCM2837, Cortex-A53 64๋นํธ SoC | ๋ธ๋ก๋์ปด BCM2711, Cortex-A72 64๋นํธ SoC | Broadcom BCM2712, Cortex-A76 64๋นํธ SoC |
CPU ์ต๋ ์ฃผํ์ | 1.4GHz | 1.8GHz | 2.4GHz |
GPU | ๋น๋์ค์ฝ์ด IV | ๋น๋์ค์ฝ์ด VI | ๋น๋์ค์ฝ์ด VII |
GPU ์ต๋ ์ฃผํ์ | 400Mhz | 500Mhz | 800Mhz |
๋ฉ๋ชจ๋ฆฌ | 1GB LPDDR2 SDRAM | 1GB, 2GB, 4GB, 8GB LPDDR4-3200 SDRAM | 4GB, 8GB LPDDR4X-4267 SDRAM |
PCIe | N/A | N/A | 1xPCIe 2.0 ์ธํฐํ์ด์ค |
์ต๋ ์ ๋ ฅ ์๋ชจ | 2.5A@5V | 3A@5V | 5A@5V(PD ์ฌ์ฉ) |
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด OS๋ ๋ฌด์์ธ๊ฐ์?
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด OS (์ด์ ์ ๋ผ์ฆ๋น์)๋ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์ฌ๋จ์์ ๋ฐฐํฌํ๋ ์ํ ์ฑ๊ธ ๋ณด๋ ์ปดํจํฐ์ธ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์ ํ๊ตฐ์ ์ํ ๋ฐ๋น์ GNU/Linux ๋ฐฐํฌํ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ ๋์ค ๊ณ์ด ์ด์์ฒด์ ์ ๋๋ค. ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด OS๋ ARM CPU๊ฐ ํ์ฌ๋ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ๊ณ ๋๋ก ์ต์ ํ๋์ด ์์ผ๋ฉฐ, Openbox ์คํํน ์๋์ฐ ๋งค๋์ ์ ํจ๊ป ์์ ๋ LXDE ๋ฐ์คํฌํฑ ํ๊ฒฝ์ ์ฌ์ฉํฉ๋๋ค. ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด OS๋ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ ๊ฐ๋ฅํ ํ ๋ง์ ๋ฐ๋น์ ํจํค์ง์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐ ์ค์ ์ ๋๊ณ ํ๋ฐํ ๊ฐ๋ฐ ์ค์ ๋๋ค.
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด OS๋ฅผ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด๋ก ํ๋์ํ๊ธฐ
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด๋ฅผ ์์ ๋ฃ์ ํ ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ๋ง์ดํฌ๋ก SD ์นด๋์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด OS๋ฅผ ํ๋์ํ๊ณ , ์ฅ์น์ ์ฝ์ ํ ํ OS๋ก ๋ถํ ํ๋ ๊ฒ์ ๋๋ค. ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ์์ธํ ์์ํ๊ธฐ ์ค๋ช ์๋ฅผ ๋ฐ๋ผ ์ฅ์น๋ฅผ ์ฒ์ ์ฌ์ฉํ ์ค๋น๋ฅผ ํ์ธ์.
์ค์ Ultralytics
๋ค์ ์ปดํจํฐ ๋น์ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ Ultralytics ํจํค์ง๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Docker๋ก ์์ํ๊ธฐ
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ Ultralytics YOLOv8 ๋ฅผ ์์ํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋ฏธ๋ฆฌ ๋น๋๋ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ฉ ๋์ปค ์ด๋ฏธ์ง๋ก ์คํํ๋ ๊ฒ์ ๋๋ค.
์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ Docker ์ปจํ ์ด๋๋ฅผ ๊ฐ์ ธ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ ์คํํฉ๋๋ค. ์ด ์์ ๋ ํ์ด์ฌ3 ํ๊ฒฝ์ ๋ฐ๋น์ 12(Bookworm)๊ฐ ํฌํจ๋ arm64v8/debian ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
์ด ์์ ์ด ์๋ฃ๋๋ฉด ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ NCNN ์ฌ์ฉ ์น์ ์ผ๋ก ๊ฑด๋๋๋๋ค.
Docker ์์ด ์์
Ultralytics ํจํค์ง ์ค์น
์ฌ๊ธฐ์๋ PyTorch ๋ชจ๋ธ์ ๋ค๋ฅธ ๋ค๋ฅธ ํ์์ผ๋ก ๋ด๋ณด๋ผ ์ ์๋๋ก ์ ํ์ ์ข ์์ฑ๊ณผ ํจ๊ป ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์ Ultralytics ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
-
ํจํค์ง ๋ชฉ๋ก ์ ๋ฐ์ดํธ, pip ์ค์น ๋ฐ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋
-
์ค์น
ultralytics
์ ํ์ ์ข ์์ฑ์ด ์๋ pip ํจํค์ง -
๋๋ฐ์ด์ค ์ฌ๋ถํ
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ NCNN ์ฌ์ฉ
์์ ์ง์ํ๋ ๋ชจ๋ ๋ชจ๋ธ ๋ด๋ณด๋ด๊ธฐ ํ์ ์ค Ultralytics, NCNNNCNN ์ ๋ชจ๋ฐ์ผ/์๋ฒ ๋๋ ํ๋ซํผ(์: ARM ์ํคํ ์ฒ)์ ๊ณ ๋๋ก ์ต์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ๋๋ฐ์ด์ค๋ก ์์ ํ ๋ ์ต๊ณ ์ ์ถ๋ก ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ผ์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์ ํจ๊ป NCNN ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
๋ชจ๋ธ์ NCNN ๋ก ๋ณํํ๊ณ ์ถ๋ก ์คํ
PyTorch ํ์์ YOLOv8n ๋ชจ๋ธ์ ๋ด๋ณด๋ธ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ถ๋ก ์ ์คํํ๊ธฐ ์ํด NCNN ๋ก ๋ณํ๋ฉ๋๋ค.
์
from ultralytics import YOLO
# Load a YOLOv8n PyTorch model
model = YOLO("yolov8n.pt")
# Export the model to NCNN format
model.export(format="ncnn") # creates 'yolov8n_ncnn_model'
# Load the exported NCNN model
ncnn_model = YOLO("yolov8n_ncnn_model")
# Run inference
results = ncnn_model("https://ultralytics.com/images/bus.jpg")
ํ
์ง์๋๋ ๋ด๋ณด๋ด๊ธฐ ์ต์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฐฐํฌ ์ต์ ์ ๋ํUltralytics ๋ฌธ์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 5 vs ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 4 YOLOv8 ๋ฒค์น๋งํฌ
YOLOv8 ๋ฒค์น๋งํฌ๋ Ultralytics ํ์์ ์๋์ ์ ํ๋๋ฅผ ์ธก์ ํ๋ 9๊ฐ์ง ๋ชจ๋ธ ํ์( PyTorch, TorchScript, ONNX, OpenVINO, TF SavedModel , TF GraphDef , TF Lite, PaddlePaddle, NCNN)์์ ์คํ๋์์ต๋๋ค. ๋ฒค์น๋งํฌ๋ ๊ธฐ๋ณธ ์ ๋ ฅ ์ด๋ฏธ์ง ํฌ๊ธฐ 640์ FP32 ์ ๋ฐ๋์์ Raspberry Pi 5์ Raspberry Pi 4 ๋ชจ๋์์ ์คํ๋์์ต๋๋ค.
์ฐธ๊ณ
๋ค๋ฅธ ๋ชจ๋ธ์ ํฌ๊ธฐ๊ฐ ๋๋ฌด ์ปค์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ ์คํํ๊ธฐ ์ด๋ ต๊ณ ์ ์ ํ ์ฑ๋ฅ์ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ YOLOv8n ๋ฐ YOLOv8s ๋ชจ๋ธ์ ๋ํ ๋ฒค์น๋งํฌ๋ง ํฌํจํ์ต๋๋ค.
๋น๊ต ์ฐจํธ
์ฑ๋ฅ
์์ธ ๋น๊ต ํ
์๋ ํ๋ ๋ ๊ฐ์ง ๋ชจ๋ธ(YOLOv8n, YOLOv8s)์ ๋ํ 9๊ฐ์ง ํ์(PyTorch, TorchScript, ONNX, OpenVINO, TF SavedModel , TF GraphDef , TF Lite, PaddlePaddle, NCNN)์ ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ๋ก, ๊ฐ ์กฐํฉ์ ์ํ, ํฌ๊ธฐ, mAP50-95(B) ๋ฉํธ๋ฆญ ๋ฐ ์ถ๋ก ์๊ฐ์ ์ ๊ณตํฉ๋๋ค.
์ฑ๋ฅ
ํ์ | ์ํ | ๋์คํฌ ํฌ๊ธฐ(MB) | mAP50-95(B) | ์ถ๋ก ์๊ฐ(ms/im) |
---|---|---|---|---|
PyTorch | โ | 6.2 | 0.6381 | 508.61 |
TorchScript | โ | 12.4 | 0.6092 | 558.38 |
ONNX | โ | 12.2 | 0.6092 | 198.69 |
OpenVINO | โ | 12.3 | 0.6092 | 704.70 |
TF SavedModel | โ | 30.6 | 0.6092 | 367.64 |
TF GraphDef | โ | 12.3 | 0.6092 | 473.22 |
TF Lite | โ | 12.3 | 0.6092 | 380.67 |
PaddlePaddle | โ | 24.4 | 0.6092 | 703.51 |
NCNN | โ | 12.2 | 0.6034 | 94.28 |
ํ์ | ์ํ | ๋์คํฌ ํฌ๊ธฐ(MB) | mAP50-95(B) | ์ถ๋ก ์๊ฐ(ms/im) |
---|---|---|---|---|
PyTorch | โ | 21.5 | 0.6967 | 969.49 |
TorchScript | โ | 43.0 | 0.7136 | 1110.04 |
ONNX | โ | 42.8 | 0.7136 | 451.37 |
OpenVINO | โ | 42.9 | 0.7136 | 873.51 |
TF SavedModel | โ | 107.0 | 0.7136 | 658.15 |
TF GraphDef | โ | 42.8 | 0.7136 | 946.01 |
TF Lite | โ | 42.8 | 0.7136 | 1013.27 |
PaddlePaddle | โ | 85.5 | 0.7136 | 1560.23 |
NCNN | โ | 42.7 | 0.7204 | 211.26 |
ํ์ | ์ํ | ๋์คํฌ ํฌ๊ธฐ(MB) | mAP50-95(B) | ์ถ๋ก ์๊ฐ(ms/im) |
---|---|---|---|---|
PyTorch | โ | 6.2 | 0.6381 | 1068.42 |
TorchScript | โ | 12.4 | 0.6092 | 1248.01 |
ONNX | โ | 12.2 | 0.6092 | 560.04 |
OpenVINO | โ | 12.3 | 0.6092 | 534.93 |
TF SavedModel | โ | 30.6 | 0.6092 | 816.50 |
TF GraphDef | โ | 12.3 | 0.6092 | 1007.57 |
TF Lite | โ | 12.3 | 0.6092 | 950.29 |
PaddlePaddle | โ | 24.4 | 0.6092 | 1507.75 |
NCNN | โ | 12.2 | 0.6092 | 414.73 |
ํ์ | ์ํ | ๋์คํฌ ํฌ๊ธฐ(MB) | mAP50-95(B) | ์ถ๋ก ์๊ฐ(ms/im) |
---|---|---|---|---|
PyTorch | โ | 21.5 | 0.6967 | 2589.58 |
TorchScript | โ | 43.0 | 0.7136 | 2901.33 |
ONNX | โ | 42.8 | 0.7136 | 1436.33 |
OpenVINO | โ | 42.9 | 0.7136 | 1225.19 |
TF SavedModel | โ | 107.0 | 0.7136 | 1770.95 |
TF GraphDef | โ | 42.8 | 0.7136 | 2146.66 |
TF Lite | โ | 42.8 | 0.7136 | 2945.03 |
PaddlePaddle | โ | 85.5 | 0.7136 | 3962.62 |
NCNN | โ | 42.7 | 0.7136 | 1042.39 |
๊ฒฐ๊ณผ ์ฌํ
๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ ํ์์์ ์์ Ultralytics ๋ฒค์น๋งํฌ๋ฅผ ์ฌํํ๋ ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์คํํ์ธ์:
์
๋ฒค์น๋งํน ๊ฒฐ๊ณผ๋ ์์คํ
์ ์ ํํ ํ๋์จ์ด ๋ฐ ์ํํธ์จ์ด ๊ตฌ์ฑ๊ณผ ๋ฒค์น๋งํฌ๋ฅผ ์คํํ ๋น์ ์์คํ
์ ํ์ฌ ์์
๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์. ๊ฐ์ฅ ์ ๋ขฐํ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ง์ ์์ ์ด๋ฏธ์ง๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฌ์ฉํ์ธ์. data='coco8.yaml' (4 val images), or
data='coco.yaml'` (5000๊ฐ val ์ด๋ฏธ์ง).
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ์นด๋ฉ๋ผ ์ฌ์ฉ
์ปดํจํฐ ๋น์ ํ๋ก์ ํธ์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด๋ฅผ ์ฌ์ฉํ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ถ๋ก ์ ์ํํ๊ธฐ ์ํด ์ค์๊ฐ ๋น๋์ค ํผ๋๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ์จ๋ณด๋ MIPI CSI ์ปค๋ฅํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณต์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์นด๋ฉ๋ผ ๋ชจ๋์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์๋ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ์นด๋ฉ๋ผ ๋ชจ๋ 3์ ์ฌ์ฉํด ๋น๋์ค ํผ๋๋ฅผ ์์งํ๊ณ YOLOv8 ๋ชจ๋ธ์ ์ฌ์ฉํด ์ถ๋ก ์ ์ํํ์ต๋๋ค.
ํ
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ ์ ๊ณตํ๋ ๋ค์ํ ์นด๋ฉ๋ผ ๋ชจ๋ ์ ๋ํด ์์ธํ ์์๋ณด๊ณ , ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์นด๋ฉ๋ผ ๋ชจ๋์ ์์ํ๋ ๋ฐฉ๋ฒ๋ ์์๋ณด์ธ์.
์ฐธ๊ณ
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5๋ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 4๋ณด๋ค ๋ ์์ CSI ์ปค๋ฅํฐ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก(15ํ ๋ 22ํ), ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์นด๋ฉ๋ผ์ ์ฐ๊ฒฐํ๋ ค๋ฉด 15ํ ๋ 22ํ ์ด๋ํฐ ์ผ์ด๋ธ์ด ํ์ํฉ๋๋ค.
์นด๋ฉ๋ผ ํ ์คํธ
์นด๋ฉ๋ผ๋ฅผ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ์ฐ๊ฒฐํ ํ ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค. ์ฝ 5์ด ๋์ ์นด๋ฉ๋ผ์ ์ค์๊ฐ ๋น๋์ค ํผ๋๊ฐ ํ์๋ฉ๋๋ค.
ํ
์์ธํ ์์๋ณด๊ธฐ rpicam-hello
๊ณต์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ๋ฌธ์์์ ์ฌ์ฉ ๋ฐฉ๋ฒ
์นด๋ฉ๋ผ๋ก ์ถ๋ก ํ๊ธฐ
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ์ฌ YOLOv8 ๋ชจ๋ธ์ ์ถ๋ก ํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
์ฌ์ฉ๋ฒ
๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. picamera2
์นด๋ฉ๋ผ ๋ฐ ์ถ๋ก YOLOv8 ๋ชจ๋ธ์ ์ก์ธ์คํ๊ธฐ ์ํด ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด OS๊ฐ ์ฌ์ ์ค์น๋์ด ์ ๊ณต๋ฉ๋๋ค.
์
import cv2
from picamera2 import Picamera2
from ultralytics import YOLO
# Initialize the Picamera2
picam2 = Picamera2()
picam2.preview_configuration.main.size = (1280, 720)
picam2.preview_configuration.main.format = "RGB888"
picam2.preview_configuration.align()
picam2.configure("preview")
picam2.start()
# Load the YOLOv8 model
model = YOLO("yolov8n.pt")
while True:
# Capture frame-by-frame
frame = picam2.capture_array()
# Run YOLOv8 inference on the frame
results = model(frame)
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the resulting frame
cv2.imshow("Camera", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) == ord("q"):
break
# Release resources and close windows
cv2.destroyAllWindows()
๋ค์์ ์ฌ์ฉํ์ฌ TCP ์คํธ๋ฆผ์ ์์ํด์ผ ํฉ๋๋ค. rpicam-vid
๋ฅผ ์ฐ๊ฒฐํ์ฌ ๋์ค์ ์ถ๋ก ํ ๋ ์ด ์คํธ๋ฆผ URL์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. ๋ค์ ๋ช
๋ น์ ์คํํ์ฌ TCP ์คํธ๋ฆผ์ ์์ํฉ๋๋ค.
์์ธํ ์์๋ณด๊ธฐ rpicam-vid
๊ณต์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ๋ฌธ์์์ ์ฌ์ฉ ๋ฐฉ๋ฒ
ํ
์ด๋ฏธ์ง/๋น๋์ค ์ ๋ ฅ ์ ํ์ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ถ๋ก ์์ค์ ๋ํ ๋ฌธ์๋ฅผ ํ์ธํ์ธ์.
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ์ฌ์ฉ ์ ๋ชจ๋ฒ ์ฌ๋ก
YOLOv8 ์ ์คํํ๋ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ ์ฑ๋ฅ์ ๊ทน๋ํํ๊ธฐ ์ํด ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ์์ต๋๋ค.
-
SSD ์ฌ์ฉ
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๋ฅผ 24์๊ฐ ๋ด๋ด ๊ณ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, SD ์นด๋๋ ์ง์์ ์ธ ์ฐ๊ธฐ๋ฅผ ๊ฒฌ๋์ง ๋ชปํ๊ณ ํ์๋ ์ ์์ผ๋ฏ๋ก ์์คํ ์ฉ์ผ๋ก SSD๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5์ ์จ๋ณด๋ PCIe ์ปค๋ฅํฐ๋ฅผ ํตํด ์ด์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5์ฉ NVMe ๋ฒ ์ด์ค์ ๊ฐ์ ์ด๋ํฐ๋ฅผ ์ฌ์ฉํด SSD๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
-
GUI ์๋ ํ๋์
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด OS๋ฅผ ํ๋์ํ ๋ ๋ฐ์คํฌํฑ ํ๊ฒฝ(๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด OS ๋ผ์ดํธ)์ ์ค์นํ์ง ์๋๋ก ์ ํํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ฒ ํ๋ฉด ์ฅ์น์ RAM์ ์ฝ๊ฐ ์ ์ฝํ์ฌ ์ปดํจํฐ ๋น์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ณต๊ฐ์ ๋ ๋ง์ด ํ๋ณดํ ์ ์์ต๋๋ค.
๋ค์ ๋จ๊ณ
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ YOLO ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ค์นํ์ ๊ฒ์ ์ถํ๋๋ฆฝ๋๋ค! ์ถ๊ฐ ํ์ต ๋ฐ ์ง์์ Ultralytics YOLOv8 ๋ฌธ์ ๋ฐ ์นด์๋ฏธ๋ฅด ์๋ ์ฌ๋จ์ ์ฐธ์กฐํ์ธ์.
๊ฐ์ฌ ๋ฐ ์ธ์ฉ
์ด ๊ฐ์ด๋๋ ๋ฉธ์ข ์๊ธฐ ์ข ๋ณด์กด์ ์ํด YOLO ์ ์ฌ์ฉํ๋ ๋จ์ฒด์ธ ์นด์๋ฏธ๋ฅด ์๋ ์ฌ๋จ์ ์ํด ๋ค์ ์ํ ํฌ๊ฐ ์ฒ์์ ๋ง๋ค์์ต๋๋ค. ๋ฌผ์ฒด ๊ฐ์ง ๊ธฐ์ ๋ถ์ผ์์ ์ ๊ตฌ์ ์ธ ์์ ๊ณผ ๊ต์ก์ ์ค์ ์ ๋ ์ด ๋จ์ฒด์ ๊ณต๋ก๋ฅผ ์ธ์ ํฉ๋๋ค.
์นด์๋ฏธ๋ฅด ์๋ ์ฌ๋จ์ ํ๋์ ๋ํ ์์ธํ ๋ด์ฉ์ ์น์ฌ์ดํธ์์ ํ์ธํ ์ ์์ต๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
๋์ปค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ Ultralytics YOLOv8 ์ค์ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
Docker๊ฐ ์๋ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ Ultralytics YOLOv8 ์ ์ค์ ํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์:
- ํจํค์ง ๋ชฉ๋ก ์
๋ฐ์ดํธ ๋ฐ ์ค์น
pip
: - ์ ํ์ ์ข ์์ฑ๊ณผ ํจ๊ป Ultralytics ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค:
- ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๋ ค๋ฉด ์ฅ์น๋ฅผ ์ฌ๋ถํ ํฉ๋๋ค:
์์ธํ ์ง์นจ์ ๋์ปค ์์ด ์์ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ธ์.
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ AI ์์ ์ ์ํด Ultralytics YOLOv8 ์ NCNN ํ์์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
Ultralytics YOLOv8์ NCNN ํ์์ ๋ชจ๋ฐ์ผ ๋ฐ ์๋ฒ ๋๋ ํ๋ซํผ์ ๊ณ ๋๋ก ์ต์ ํ๋์ด ์์ด ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ๊ธฐ๊ธฐ์์ AI ์์ ์ ์คํํ๋ ๋ฐ ์ด์์ ์ ๋๋ค. NCNN ํ์์ ARM ์ํคํ ์ฒ๋ฅผ ํ์ฉํ์ฌ ์ถ๋ก ์ฑ๋ฅ์ ๊ทน๋ํํ์ฌ ๋ค๋ฅธ ํ์์ ๋นํด ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ง์๋๋ ๋ด๋ณด๋ด๊ธฐ ์ต์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฐฐํฌ ์ต์ ์ ๋ํUltralytics ๋ฌธ์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
YOLOv8 ๋ชจ๋ธ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ ์ฌ์ฉํ ์ ์๋๋ก NCNN ํ์์ผ๋ก ๋ณํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
Python ๋๋ CLI ๋ช ๋ น์ ์ฌ์ฉํ์ฌ PyTorch YOLOv8 ๋ชจ๋ธ์ NCNN ํ์์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค:
์
from ultralytics import YOLO
# Load a YOLOv8n PyTorch model
model = YOLO("yolov8n.pt")
# Export the model to NCNN format
model.export(format="ncnn") # creates 'yolov8n_ncnn_model'
# Load the exported NCNN model
ncnn_model = YOLO("yolov8n_ncnn_model")
# Run inference
results = ncnn_model("https://ultralytics.com/images/bus.jpg")
์์ธํ ๋ด์ฉ์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ NCNN ์ฌ์ฉ ์น์ ์ ์ฐธ์กฐํ์ธ์.
YOLOv8 ์คํ๊ณผ ๊ด๋ จ๋ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 4์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 5์ ํ๋์จ์ด ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
์ฃผ์ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- CPU: ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 4๋ ๋ธ๋ก๋์ปด BCM2711, ์ฝ์ดํ ์ค-A72 64๋นํธ SoC๋ฅผ, ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5๋ ๋ธ๋ก๋์ปด BCM2712, ์ฝ์ดํ ์ค-A76 64๋นํธ SoC๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ต๋ CPU ์ฃผํ์: ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 4์ ์ต๋ ์ฃผํ์๋ 1.8GHz์ด๋ฉฐ, ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 5๋ 2.4GHz์ ๋ฌํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ: ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 4๋ ์ต๋ 8GB์ LPDDR4-3200 SDRAM์ ์ ๊ณตํ๋ฉฐ, ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 5๋ 4GB ๋ฐ 8GB ๋ฒ์ ์ผ๋ก ์ ๊ณต๋๋ LPDDR4X-4267 SDRAM์ ํ์ฌํ๊ณ ์์ต๋๋ค.
์ด๋ฌํ ๊ฐ์ ์ฌํญ ๋๋ถ์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 5์ YOLOv8 ๋ชจ๋ธ์ด ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด 4์ ๋นํด ๋ ๋์ ์ฑ๋ฅ ๋ฒค์น๋งํฌ๋ฅผ ๋ฌ์ฑํ ์ ์์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ์๋ฆฌ์ฆ ๋น๊ต ํ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ์นด๋ฉ๋ผ ๋ชจ๋์ด Ultralytics YOLOv8 ์์ ์๋ํ๋๋ก ์ค์ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
YOLOv8 ์ถ๋ก ์ ์ํด ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ์นด๋ฉ๋ผ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค:
-
์ฌ์ฉ
picamera2
:import cv2 from picamera2 import Picamera2 from ultralytics import YOLO picam2 = Picamera2() picam2.preview_configuration.main.size = (1280, 720) picam2.preview_configuration.main.format = "RGB888" picam2.preview_configuration.align() picam2.configure("preview") picam2.start() model = YOLO("yolov8n.pt") while True: frame = picam2.capture_array() results = model(frame) annotated_frame = results[0].plot() cv2.imshow("Camera", annotated_frame) if cv2.waitKey(1) == ord("q"): break cv2.destroyAllWindows()
-
TCP ์คํธ๋ฆผ ์ฌ์ฉ:
์์ธํ ์ค์ ์ง์นจ์ ์นด๋ฉ๋ผ๋ก ์ถ๋ก ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ธ์.