NVIDIA Jetson Nano ve YOLOv8 ile Nesne Tanıma | Jetson Nano Object Detection

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 ModeliFPS
yolov8n.pt4
yolov8s.pt2
yolov8m.pt1
yolov8l.pt0-1
yolov8xl.pt0-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.

Oğuzhan Gürbüz

Oğuzhan Gürbüz

Merhabalar,
Görsel Analiz'in kurucusuyum.
İnsansız kara araçları üzerine çalışıyorum. Görüntü işleme, derin öğrenme ve ROS gibi alanlarda danışmanlıklar ve eğitimler veriyorum. Şirketlere ve araştırmacılara bu tip sistemleri geliştirmelerinde yardımcı oluyorum.

2 Comments

  1. Merhaba hocam yukarıdaki kodlar açıkladığınız model cpu üzerinden mi çalışıyor.? Teşekkürler emeğinize sağlık.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Ücretsiz Bilgisayarlı Görü eğitimlerini kaçırmamak için hemen abone ol !