Bu yazıda, nesne tespiti için RAiV (içindeki EdgeTPU) ve Yolo v11'i nasıl kullanacağımızı göstereceğiz. Bu yazıyı, görsel yapay zeka modellerinin kullanımına yönelik bir hızlandırılmış kurs olarak düşünebilirsiniz.

Edge Yapay Zekaya Giriş

Yapay Zeka Modeli ve Uç Yapay Zeka Nedir?

En basit hali ile yapay zeka modeli, işlem katmanlarının (çarpma, toplama vb.) ve bu katmanlarla ilişkili ağırlıkların bir listesidir. İşlemciler, ağırlıklarla işlemleri baştan (giriş katmanı) başlayarak uygular ve çıktıyı hesaplar.

Yapay zeka modelleri genellikle PC'de veya bulut ortamında çalıştırılır. Bununla birlikte, bu modellerin bazıları daha küçük cihazlarda da çalıştırılabilir. Yapay zeka modellerinin bağımsız bir cihazda yerel olarak çalıştırılmasına Uç Yapay Zeka denir.

EdgeTPU Nedir?

Yapay zekâ modelinin çalıştırılması sırasında (bu işleme çıkarım denir), CPU hesaplama süreçlerini hızlandırmak için özel aygıtlar (donanım hızlandırıcılar) veya yardımcı kütüphaneler kullanabilir. Yardımcı aygıtlar veya kütüphanelerin kullanılmasına yetkilendirme (delegasyon) denir.

RAiV içinde kullanılan EdgeTPU bir delegasyon cihazıdır (donanım hızlandırıcı). CPU, uygun katmanları EdgeTPU'ya aktarır ve EdgeTPU bu katmanların hesaplamasını yapar. Ardından EdgeTPU sonuçları CPU'ya geri gönderir. Bu nedenle, EdgeTPU katmanları çalıştırmakla meşgulken, CPU diğer görevler üzerinde çalışabilir.

İş Akışı

Aşağıda RAiV ile yapay zeka modeli kullanımına ilişkin genel bir iş akışı bulabilirsiniz. Bu iş akışı sadece giriş niteliğindedir. Bu yazıda, eğitilmiş bir Yolo modeli kullanacağımız için iş akışının ilk adımını atlayacağız.

Yapay Zekayı Modeli Hazırlama

Geliştirme:
  • Eğitim ve doğrulama veri kümelerini oluşturun.
  • Yapay zeka modelini eğitin ve doğrulayın.
  • Yapay zeka modelini EdgeTPU için dışa aktarın veya edgetpu_compiler ile derleyin.

Yükleme ve Yayınlama

Konuşlandırma:
  • RAiV'in kullanıcı web arayüzünü kullanarak yapay zeka modelini yükleyin.
  • RAiV'in kullanıcı web arayüzünü kullanarak modeli yayınlayın.
  • RAiV, görüntü verilerini yapay zeka modeline besler ve çalıştırır, ardından çıktı katmanlarını veri hattına kaydeder.

Python Son İşleyicisini Hazırlama

Betikleme:
  • Veri işlem hattına erişmek için Python betiği kullanın.
  • Çıktı verilerini inceleyin (eşikleme, birleştirme, yeniden şekillendirme, vb.).

Betikleri Yükleme

Aktarım:
RAiV'in kullanıcı web arayüzünü kullanarak Python betiğini/betiklerini yükleyin.

Veri İşlem Hattını Tetikleme

Yürütme:
Veri işlem hattını şu şekilde tetikleyin:
  • Snapshot
  • Live Stream
  • Capture Frame
  • Collect Samples

Yapay Zekayı Kullanalım

Daha önce de belirttiğimiz gibi, bu yazı RAiV'in uç yapay zeka yeteneklerini kullanmaya yönelik hızlı bir kurs niteliğindedir. Yazıyı basit tutmak için, popüler bir yapay zeka modelinin önceden eğitilmiş bir sürümünü kullanacağız. Ardından, Python betiği kullanarak çıktılarına son-işlem (postprocessing) uygulayacağız.

EdgeTPU için Yolo v11'i Hazırlama

YOLO (You Only Look Once), popüler bir görsel nesne algılama yapay zeka modelidir. Farklı YOLO sürümleri arasından, bu yazı için en son YOLO modelini (geliştirme tarihi itibariyle), Yolo-v11'i seçtik: coco_yolo11n_full_integer_quant_edgetpu.tflite. Model dosyasını Github Depomuzdan indirebilirsiniz. Yolo-v11 hakkında daha fazla bilgiyi resmi Yolo-v11 Web Sayfasında bulabilirsiniz.

Seçilen önceden eğitilmiş Yolo-v11 yapay zeka modeli, nesne tespiti için bilinen COCO veri kümesi üzerinde eğitilmiştir. Bu nedenle, hazır haliyle, çeşitli günlük nesneleri (kişi, dizüstü bilgisayar, portakal, kupa, otobüs vb.) tespit edebilir.

Modeli Yükle ve Yayınla

RAiV'in web arayüzünün kullanıcı hesabına giriş yapın. Yapay zeka ayarları parametre panelini açmak için sağdaki "AI Settings" düğmesine tıklayın. Açılan panelde, dosya seçim iletişim kutusunu açmak için "Upload AI Model" ipucu bulunan beyin simgesine tıklayın. İndirilen modeli seçin ve yükleyin.

YOLOv11n Yükleniyor RAiV

Model başarıyla yüklendikten sonra, RAiV, modelin kullanılabilirliğini kontrol eder. Model kullanılabilir ise, yapay zeka parametreleri panelinde "READY" durumu gösterilir. Bu durumda, modelin kullanımını etkinleştirmek için sağda "Release AI" ipucu bulunan roket simgesine tıklayın. Yapay zeka modeli serbest bırakıldıktan sonra, veri hattı yüklenen yapay zeka modeline görüntüleri besleyecektir. Modeli yayından kaldırmak için, "Unrelease AI" ipucu bulunan paraşüt simgesine tıklayın.

Python ile Son Dokunuşlar

Veri Hattı - Yine

Yapay zeka modeli yüklendikten ve kullanıma sunulduktan sonra, veri işlem hattı görüntüleri yapay zeka modeline besler ve modelin çıktısını kullanıcının Python koduna aktarır. Görüntü alma örneğinde olduğu gibi, kullanıcının Python betiği yalnızca yapay zekadan gelen kullanılabilir verileri kontrol etmelidir.

Basitlik açısından, yapay zeka modelinin çıktısından gelen veriler, modelin giriş görüntüsünü de içerir. Bu nedenle, veri hattına tek bir çağrı ile kullanıcı, yapay zeka modelinin hem giriş hem de çıkış verilerini alabilir.

Robotic Ai Vision Data Routing Pipeline Diagram
Robotik Yapay Zeka Görüşü Veri Yönlendirme Hattı Diyagramı.

Yolo Son İşlemcisi - Neden Birine İhtiyacımız Var?

Yapay zeka modelleri genellikle kullanıma hazır çıktılar üretmez. Bu modellerin çoğunlukla yeniden şekillendirilmesi ve filtrelenmesi gerekir. Github depomuzda Yolo modelinin son işlenmesi için örnek bir kod bulunmaktadır.

Kodu Hazırlayın ve Yükleyin

Aşağıdaki kodda kısaca, getDataAi() çağrısı yaparak veri hattından yapay zeka modeli çıktısını alıyoruz ve nesne algılama ihtiyaçlarımıza göre son işleme tabi tutuyoruz.

Bu örneği, gerekli tüm modüllerle birlikte Github Depomuzda bulabilirsiniz. Lütfen örnek kodu github deposundan indirin ve web arayüzü üzerinden RAiV'e yükleyin.

# For accessing data pipeline
from qCU_Data import qCUData

# For Yolo Helper Functions
from YOLOv8ObjectDetector import YOLOv8ObjectDetector


def main():

# Create interface
    theQCUData = qCUData()

    # Initialize shared memory
    if not theQCUData.init():
        print("Failed to initialize shared memory")
        return

    # Initialize COCO classes
    COCO_CLASSES = [
        "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train",
        "truck", "boat", "traffic light", "fire hydrant", "stop sign",
        "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep",
        "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella",
        "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard",
        "sports ball", "kite", "baseball bat", "baseball glove", "skateboard",
        "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork",
        "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange",
        "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair",
        "couch", "potted plant", "bed", "dining table", "toilet", "tv",
        "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave",
        "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase",
        "scissors", "teddy bear", "hair drier", "toothbrush"
    ]

    # Initialize Yolo detector post processor
    objDetector = YOLOv8ObjectDetector(ai_classes=COCO_CLASSES, confidence_threshold=0.25, iou_threshold=0.45)

    # Enter object detection loop
    try:
        while True:
            # Get Ai data
            ai_data = theQCUData.getDataAi()
            if ai_data:
                if 'error' in ai_data:
                    print(f"Error occurred: {ai_data['error']}")
                else:
                    # Postprocess the ai_data
                    detected_objects = objDetector.detect_objects(ai_data)
                    
                    # Get the ai preprocessing parameters
                    aiHeader = ai_data['header']
                    aiPrepro = aiHeader.imPreproPrms

                    detected_objs_image = []
                    for obj in detected_objects:

                        # Convert yolo coordinates to image coordinates
                        bbox_img_float = objDetector.yolo_to_coords_float(aiPrepro, obj['bbox'])
                        bbox_img_int = [int(coord) for coord in bbox_img_float]

                        detected_objs_image.append({
                            'class_id': obj['class_id'],
                            'class_name': obj['class_name'],
                            'confidence': obj['confidence'],
                            'bbox': bbox_img_int,
                        })

                    # Print the detected objects
                    print(detected_objs_image)

                    # Do not forget to delete the ai data key references and the ai data
                    del ai_data['data'], ai_data['input_frame_right'], ai_data['input_frame_left'], ai_data['header']
                    del ai_data
            else:
                # Wait to avoid high CPU utilization
                time.sleep(0.1)   
    finally:
        print("Cleanup completed")

if __name__ == "__main__":
    main()

Canlı Sunum: Veri Hattını Besleyin

Şimdi veri hattını tetiklemek için lütfen "Snapshot" düğmesine basın. Görüntü web arayüzünde görüntülendikten sonra, Console Output veya PC uygulamasını kontrol edin.

RAiV ile EdgeTPU'da YOLOv11 Çalıştırma

Sırada Ne Var?

Derinlik haritası tahminine başlamak için:

Stereo'dan Derinliğe: OpenCV ile İlk Derinlik Haritanızı Oluşturma

Python'ımızı inceleyin SDK:

RAiV Python SDK

Örnek Kodlar İçin Github Depomuzu Kontrol Edin:

Github Depomuz