Yapay zeka çalışmalarında en önemli konulardan biri de donanım seçimi ve seçilen donanımın etkili kullanımıdır. Özellikle bilgisayarlı görü (computer vision) alanında geliştirilen modellerin belirli bir hızın altına düşmenden çalışması oldukça kritik bir konudur. Bu blog yazımda, piyasada en çok kullanılan SBC (Single Board Computer) kartlarından olan NVIDIA Jetson Nano kartını kullanarak YOLOv8 ile nesne tanıma işleminin nasıl gerçekleştirilebileceğini göreceğiz.
Eğer Jetson Nano kartınıza henüz bir işletim sistemi kurulumu yapmadıysanız veya diğer bir deyişle kartınızı kutusunun yeni çıkardıysanız bu yazıdaki talimatları takip ederek hızlı bir şekilde kurulum gerçekleştirebilirsiniz. Kurulumu tamamladıktan sonra tekrar buraya dönerek YOLOv8 kurulumlarını yapmaya başlayabilirsiniz.
1. Kurulumlar
Blog yazımın başında paylaştığım bağlantıyı kullanarak yaptınız kurulumun ardından, Jetson Nano kartınıza Ubuntu 18.04 ve Jetpack 4.6 kurulmuş olacak. Nesne tanıma çalışması için gerekli kütüphaneleri indirmeye başlayabiliriz.
Terminali açıp aşağıdaki komutları sırasıyla çalıştırınız:
sudo apt update
sudo apt install -y python3.8 python3.8-venv python3.8-dev python3-pip \
libopenmpi-dev libomp-dev libopenblas-dev libblas-dev libeigen3-dev libcublas-dev
Ardından YOLOv8 Github deposunu klonlayalım:
git clone https://github.com/ultralytics/ultralytics
cd ultralytics
Şimdi Python 3.8 sürümünü sahip sanal bir ortam kuracağız:
python3.8 -m venv venv
source venv/bin/activate
pip install -U pip wheel gdown
PyTorch ve TorchVision paketlerini indirerek GPU aktif şekilde algoritmalarımızı çalıştıracağız:
# pytorch 1.11.0
gdown https://drive.google.com/uc?id=1hs9HM0XJ2LPFghcn7ZMOs5qu5HexPXwM
# torchvision 0.12.0
gdown https://drive.google.com/uc?id=1m0d8ruUY8RvCP9eVjZw4Nc8LAwM8yuGV
python3.8 -m pip install torch-*.whl torchvision-*.whl
Son olarak YOLOv8 için Python paketimizi indirelim:
pip install .
Artık hazırız 🔥🔥
2. Nesne Tanıma
Aşağıdaki komutlar kullanarak hem Jetson Nano’ya bağladığınız bir CSI kamera üzerinden hem de hazır bir video üzerinden nesne tanıma işlemini rahatlıkla yapabilirsiniz. Eğer hazır bir video kullanacaksanız video adresini düzenlemeyi unutmayın:
yolo task=detect mode=predict model=yolov8n.pt source=0 show=True
yolo task=detect mode=predict model=yolov8n.pt source=inference/video.mp4 show=True
Bunun yanında resimler üzerinden de nesne tanıma işlemi gerçekleştirebilirsiniz. Resim adresini düzenlemeyi unutmayın:
yolo task=detect mode=predict model=yolov8n.pt source=inference/image.jpg show=True
Yukarıdaki komutları kullanarak, modellerin “inference time” değerlerini terminalden takip edebiliriz. Fakat bizler FPS değerlerini canlı olarak video üzerinden görmek istiyoruz. Bunun için aşağıdaki kodu kullanacağız. Şimdi gelin bu kodu inceleyelim.
Öncelikle bazı değişkenlerimizi en başta tanımlayalım:
# Library
import cv2
import time
import random
import numpy as np
from ultralytics import YOLO
# Predefined variables
confidence_score = 0.5
# Colors & Font
text_color_b = (0,0,0) # black
text_color_w = (255,255,255) # white
background_color = (0,255,0)
font = cv2.FONT_HERSHEY_SIMPLEX
# FPS
total_fps = 0
average_fps = 0
num_of_frame = 0
# Load model
model = YOLO("yolov8n.pt")
labels = model.names
Ardından kameramıza bağlanarak nesne tanıma işlemini başlatalım:
# Load camera
cap = cv2.VideoCapture(0)
while True:
start = time.time()
ret, frame = cap.read()
if ret == False:
break
results = model(frame, verbose=False)[0]
boxes = np.array(results.boxes.data.tolist())
for box in boxes:
x1, y1, x2, y2, score, class_id = box
x1, y1, x2, y2, class_id = int(x1), int(y1), int(x2), int(y2), int(class_id)
if score > confidence_score:
cv2.rectangle(frame, (x1, y1), (x2, y2), (0,255,0), 2)
score = score * 100
class_name = results.names[class_id]
text = f"{class_name}: %{score:.2f}"
text_loc = (x1, y1-10)
labelSize, baseLine = cv2.getTextSize(text, font, 1, 1)
cv2.rectangle(frame,
(x1, y1 - 10 - labelSize[1]),
(x1 + labelSize[0], int(y1 + baseLine-10)),
(0,255,0),
cv2.FILLED)
cv2.putText(frame, text, (x1, y1-10), font, 1, text_color_w, thickness=1)
end = time.time()
num_of_frame += 1
fps = 1 / (end-start)
total_fps = total_fps + fps
average_fps = total_fps / num_of_frame
avg_fps = float("{:.2f}".format(average_fps))
cv2.rectangle(frame, (10,2), (280,50), background_color, -1)
cv2.putText(frame, "FPS: "+str(avg_fps), (20,40), font, 1.5, text_color_b, thickness=3)
cv2.imshow("Test", frame)
if cv2.waitKey(20) & 0xFF==ord("q"):
break
cap.release()
cv2.destroyAllWindows()
Yukarıdaki script Jetson Nano’nun kamerasından gelen görüntüyü işleyerek sizlere canlı çıktıyı verecek. Aynı zamanda ekranın sol üst köşesinde de kaç FPS aldığınız gözükecek. Yukarıdaki kodun tam halini, blog yazımın en başındaki düğmeyi kullanarak indirebilirsiniz. Yalnız burada dikkat etmeniz gereken bir nokta var. cap = cv2.VideoCapture(0)
kısmını Jetson’a bağladığınız kamera tipine göre düzenlemeniz gerekecektir. Bunu ayarladıktan sonra, model = YOLO("yolov8n.pt")
kısmına sırasıyla farklı modelleri girerek FPS değerlerini inceleyebilirsiniz.
Bildiğiniz üzere YOLOv8’in farklı modelleri bulunmaktadır. Modeller boyut ve doğruluklarını göre sıralanmaktadır. Doğruluğu yüksek modeller yavaş çalışırken; doğruluğu düşük modeller daha hızlı çalışırlar. Burada farkettiyseniz doğruluk ve hız arasında bir ticaret söz konusudur. Burada hangi tercihi yapacağınız tamamen size kalmış bir konudur.
Ben sizin için bir test gerçekleştirdim. Tek tek tüm YOLO modellerini Jetson Nano’da çalıştırıp FPS değerlerini kaydettim. Sonuçlarını da aşağıdaki tabloda paylaşıyorum:
YOLOv8 Modeli | FPS |
yolov8n.pt | 4 |
yolov8s.pt | 2 |
yolov8m.pt | 1 |
yolov8l.pt | 0-1 |
yolov8xl.pt | 0-1 |
Gördüğünüz gibi model boyutu arttıkça FPS düşmektedir. Burada görülen FPS değerleri donanımın gücüne bağlı olarak da değişecektir. Bizler bu çalışmada NVIDIA Jetson Nano B01 modelini kullanmıştık.
Eğer bu FPS değerlerini daha da arttırmak isterseniz sizlere güzel bir haberim var !
3. FPS Artırma
Bu blog yazımda, YOLOv8 ile nesne tanıma işleminin ve FPS takibinin Jetson Nano üzerinde nasıl yapıldığını anlattım. Sizlere gösterdiğim tekniklerle hızlı bir şekilde kendi nesne tanıma çalışmanızı Jetson Nano kartı üzerinde gerçekleştirebileceksiniz.
Bunun yanı sıra endüstriyel uygulamalarda veya ulusal/uluslararası yarışmalarda bu FPS değerlerinin artırılması gerekmektedir. FPS değerlerini yükseltmek için farklı optimizasyon çalışmaları bulunmaktadır. Doğru araç ve teknikleri kullanarak Jetson Nano‘dan aldığınız performansı artırabilir ve daha yüksek FPS değerlerine ulaşabilirsiniz. 🚀
Endüstriyel çalışmalara uygun yüksek performanslı YOLOv8 modelleri geliştirmek ve çeşitli optimizasyon araçları hakkından rehberlik almak için iletişim formu üzerinden benimle iletişime geçebilirsiniz.
Merhaba hocam yukarıdaki kodlar açıkladığınız model cpu üzerinden mi çalışıyor.? Teşekkürler emeğinize sağlık.
Merhabalar,
GPU üzerinden çalışmaktadır.