IoT ve Yapay Zekâ

MQTT ile Google Coral Edge TPU: Raspberry Pi'de Görüntü Sınıflandırın ve Sonuçları Yayınlayın

Raspberry Pi üzerinde Google Coral Edge TPU kuran, nicemlenmiş bir MobileNet sınıflandırıcısı çalıştıran ve her tahmini JSON olarak bir MQTT broker'a yayınlayan uygulamalı bir eğitim.

Görüntü sınıflandırma sonuçlarını MQTT üzerinden buluta gönderen bir Raspberry Pi'ye takılı Coral Edge TPU USB hızlandırıcısı
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Google Coral Edge TPU, Raspberry Pi gibi küçük bir kartın sinir ağı çıkarımını yalnızca kendi CPU'suyla yapabileceğinden çok daha hızlı çalıştırmasını sağlar; bu da uçta gerçek zamanlı görüntü sınıflandırmayı pratik hale getirir. Bu eğitimde Coral Edge TPU çalışma zamanını kuracak, nicemlenmiş bir MobileNet sınıflandırıcısı çalıştıracak ve her tahmini yapılandırılmış JSON olarak MQTT üzerinden yayınlayacaksınız; böylece gösterge panelleri, uyarı araçları ve diğer hizmetler kameranın gördüklerine tepki verebilecek.

Neye İhtiyacınız Var

Kurulum, hızlandırıcıdan broker'a giden veri yoluna odaklanabilmeniz için bilerek basit tutuldu.

Öğe Amaç
Raspberry Pi 4 veya 5 (64 bit Raspberry Pi OS) Python'u ve MQTT istemcisini çalıştıran ana bilgisayar
Coral USB Accelerator USB 3 üzerinden bağlanan Edge TPU yardımcı işlemcisi
Bir kamera veya JPEG görüntülerden oluşan bir klasör Sınıflandırıcı için girdi
Python 3.9 ortamı Resmi Coral Python paketlerinin desteklediği Python sürüm aralığı
Bir MQTT broker Sonuçları alır; test için broker.connectmq.com kullanıyoruz

Hızlandırıcıyı mavi bir USB 3 portuna takın. USB 2 portu da çalışır, ancak Pi ile hızlandırıcı arasındaki aktarımları belirgin şekilde yavaşlatır ve faydanın büyük kısmını gizler.

Coral Edge TPU Bir IoT İşlem Hattına Nasıl Uyar

Edge TPU, yalnızca tamamen tam sayıya nicemlenmiş ve Edge TPU derleyicisiyle derlenmiş TensorFlow Lite modellerini çalıştıran bir ASIC'tir. Derleyicinin eşleyemediği işlemler CPU'da çalışır; bu yüzden iyi derlenmiş bir model neredeyse her şeyi hızlandırıcıda tutar.

Bir IoT mimarisinde hızlandırıcı bir döngünün aşamalarından biridir:

  1. Pi'ye bir kamera karesi veya görüntü gelir.
  2. Edge TPU onu milisaniyeler içinde sınıflandırır.
  3. Pi, kompakt bir JSON sonucunu (etiketler, skorlar, gecikme, cihaz kimliği) bir MQTT topic'ine yayınlar.
  4. Node-RED, bir veritabanı yazıcısı veya bir uyarı betiği gibi aboneler sonucu tüketir.

Cihazdan ham görüntü değil, yalnızca çıkarım sonucu çıkar. Bu, bant genişliğini düşük tutar, insanların veya tesislerin resimlerinin buluta gönderilmesini önler ve MQTT mesaj sınırlarının rahatça içinde kalır. Çıkarımın nerede çalışacağına hâlâ karar veriyorsanız, edge AI ve bulut yapay zeka karşılaştırmamız ödünleşimleri ayrıntılı olarak ele alıyor.

Adım 1: Edge TPU Çalışma Zamanını Kurun

Coral paket deposunu ekleyin ve standart frekanslı çalışma zamanını kurun:

echo "deb [signed-by=/usr/share/keyrings/coral-edgetpu.gpg] https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/coral-edgetpu.gpg
sudo apt-get update
sudo apt-get install -y libedgetpu1-std

udev kurallarının uygulanması için kurulumdan sonra hızlandırıcıyı çıkarıp yeniden takın. Cihazın göründüğünü kontrol edin:

lsusb | grep -Ei "global unichip|google"

İlk çıkarımdan önce hızlandırıcı kendini "Global Unichip Corp." olarak bildirir; çalışma zamanı firmware'i yükledikten sonra "Google Inc." olarak yeniden listelenir. İkisi de normaldir.

Çipi daha yüksek saat hızında çalıştıran bir libedgetpu1-max paketi de vardır. Daha hızlıdır ancak hızlandırıcı ısınır; bu yüzden standart çalışma zamanıyla başlayın ve yalnızca ihtiyaç duyduğunuzu ölçtüyseniz ve hava akışınız varsa geçiş yapın.

Adım 2: Uyumlu Bir Python Ortamı Oluşturun

En yaygın Coral sorunu Python, TensorFlow Lite çalışma zamanı ve Edge TPU kütüphanesi arasındaki sürüm uyuşmazlığıdır. Resmi Coral Python paketleri Python 3.6 ile 3.9'u hedeflerken, güncel Raspberry Pi OS daha yeni bir Python ile gelir. Güvenilir yol, örneğin pyenv ile ayrılmış bir Python 3.9 ortamıdır:

sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libffi-dev liblzma-dev
curl https://pyenv.run | bash
# yazdırdığı pyenv satırlarını ~/.bashrc dosyasına ekleyin, ardından yeni bir kabuk açın
pyenv install 3.9.19
pyenv virtualenv 3.9.19 coral
pyenv activate coral
pip install --extra-index-url https://google-coral.github.io/py-repo/ "pycoral~=2.0"
pip install "paho-mqtt>=2.0" pillow "numpy<2"

pycoral paketini Coral paket dizininden kurmak, betiğimizin içe aktardığı eşleşen tflite_runtime derlemesini de getirir. NumPy'yi 2'nin altına sabitlemek, bu eski wheel'lerle ikili uyumsuzluk hatalarını önler.

Coral test veri deposundan derlenmiş bir modeli ve etiketlerini indirin:

mkdir -p ~/coral-mqtt && cd ~/coral-mqtt
curl -LO https://github.com/google-coral/test_data/raw/master/mobilenet_v2_1.0_224_quant_edgetpu.tflite
curl -LO https://github.com/google-coral/test_data/raw/master/imagenet_labels.txt
curl -LO https://github.com/google-coral/test_data/raw/master/parrot.jpg

Adım 3: Görüntüleri Sınıflandırın ve MQTT'ye Yayınlayın

Aşağıdaki betik modeli Edge TPU delegate'i ile yükler, bir klasördeki her görüntüyü sınıflandırır ve ilk üç tahmini yayınlar. Sürüm 2 callback API'siyle paho-mqtt 2.x kullanır.

import json
import sys
import time
from pathlib import Path

import numpy as np
from PIL import Image
import paho.mqtt.client as mqtt
from tflite_runtime.interpreter import Interpreter, load_delegate

MODEL = "mobilenet_v2_1.0_224_quant_edgetpu.tflite"
LABELS = "imagenet_labels.txt"
BROKER = "broker.connectmq.com"
PORT = 1883
DEVICE_ID = "pi-coral-01"
# topic'lerinizin benzersiz olması için 7f3a9c değerini kendi rastgele dizenizle değiştirin
TOPIC = f"connectmq/demo/7f3a9c/coral/{DEVICE_ID}/classification"
STATUS_TOPIC = f"connectmq/demo/7f3a9c/coral/{DEVICE_ID}/status"


def load_labels(path):
    labels = {}
    with open(path, encoding="utf-8") as f:
        for i, line in enumerate(f):
            parts = line.strip().split(maxsplit=1)
            if len(parts) == 2 and parts[0].isdigit():
                labels[int(parts[0])] = parts[1]
            else:
                labels[i] = line.strip()
    return labels


labels = load_labels(LABELS)
interpreter = Interpreter(
    model_path=MODEL,
    experimental_delegates=[load_delegate("libedgetpu.so.1")],
)
interpreter.allocate_tensors()
inp = interpreter.get_input_details()[0]
out = interpreter.get_output_details()[0]
_, height, width, _ = inp["shape"]


def classify(image_path, top_k=3):
    img = Image.open(image_path).convert("RGB").resize((width, height), Image.LANCZOS)
    data = np.expand_dims(np.asarray(img, dtype=np.uint8), axis=0)
    interpreter.set_tensor(inp["index"], data)
    start = time.perf_counter()
    interpreter.invoke()
    latency_ms = (time.perf_counter() - start) * 1000
    raw = interpreter.get_tensor(out["index"])[0].astype(np.float32)
    scale, zero_point = out["quantization"]
    probs = (raw - zero_point) * scale if scale else raw
    top = np.argsort(probs)[::-1][:top_k]
    results = [
        {"label": labels.get(int(i), str(i)), "score": round(float(probs[i]), 4)}
        for i in top
    ]
    return results, latency_ms


def on_connect(client, userdata, flags, reason_code, properties):
    print(f"Connected: {reason_code}")
    client.publish(STATUS_TOPIC, "online", qos=1, retain=True)


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"{DEVICE_ID}-7f3a9c")
client.on_connect = on_connect
client.will_set(STATUS_TOPIC, "offline", qos=1, retain=True)
client.connect(BROKER, PORT, keepalive=60)
client.loop_start()

folder = Path(sys.argv[1] if len(sys.argv) > 1 else ".")
try:
    for image_path in sorted(folder.glob("*.jpg")):
        results, latency_ms = classify(image_path)
        payload = {
            "device": DEVICE_ID,
            "image": image_path.name,
            "top": results,
            "latencyMs": round(latency_ms, 2),
            "ts": int(time.time() * 1000),
        }
        info = client.publish(TOPIC, json.dumps(payload), qos=1)
        info.wait_for_publish()
        print(payload)
        time.sleep(1)  # herkese açık broker'ın hız sınırının epey altında kal
finally:
    client.publish(STATUS_TOPIC, "offline", qos=1, retain=True).wait_for_publish()
    client.loop_stop()
    client.disconnect()

Betiği indirilen papağan görüntüsüyle çalıştırın:

python classify_mqtt.py ~/coral-mqtt

Model hızlandırıcıya yüklendiği için ilk çıkarım daha yavaştır; sonrakiler kararlı durumdaki gecikmeyi gösterir.

Adım 4: Coral Edge TPU Sonuçlarının Gelişini İzleyin

İkinci bir terminal açın (herhangi bir makinede) ve Mosquitto istemcileriyle abone olun:

mosquitto_sub -h broker.connectmq.com -p 1883 -i viewer-7f3a9c -t "connectmq/demo/7f3a9c/coral/#" -v

Retained online durumunu ve ardından her görüntü için bir JSON mesajını görmelisiniz; örneğin papağan test resmi için en üst etiket olarak "macaw". broker.connectmq.com bir ücretsiz herkese açık MQTT broker olduğundan, topic'inizi tahmin eden herkes onu okuyabilir; bu yüzden oraya yalnızca demo verisi gönderin. Herkese açık broker mesaj başına 64 KB'a ve istemci başına saniyede 10 mesaja kadar izin verir; bu, sınıflandırma sonuçları için fazlasıyla yeterlidir ama ham kareleri akıtmamak için de bir nedendir.

Testten Üretime Geçmek

Prototip çalıştığında kimlik doğrulamalı, şifreli bağlantılara geçin. ConnectMQ portalında bir broker oluşturun, oluşturulan kimlik bilgilerini kopyalayın ve bağlantı bloğunu değiştirin:

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set()  # sistem CA deposunu kullanır; broker'ın Let's Encrypt sertifikası vardır
client.will_set(STATUS_TOPIC, "offline", qos=1, retain=True)
client.connect("YOUR_BROKER_HOST", 8883, keepalive=60)

Yönetilen bir MQTT broker, yama, sertifika ve kapasite planlama işini ortadan kaldırır; böylece Pi yalnızca çıkarımla ilgilenir. ConnectMQ'da client ID verilen kimlik bilgilerine bağlıdır; bu da başka bir cihazın kamera düğümünüzün kimliğine bürünmesini engeller.

Edge TPU Projeleri İçin Tasarım İpuçları

Birkaç karar, bir demo ile çalışır halde bırakabileceğiniz bir sistem arasındaki farkı yaratır:

  1. Her kareyi değil, olayları yayınlayın. Canlı bir kamera için yalnızca en üst etiket değiştiğinde veya bir güven eşiğini aştığında, artı periyodik bir kalp atışıyla yayınlayın. Bu, trafiği öngörülebilir tutar.
  2. Payload'a bağlam ekleyin. Cihaz kimliği, model adı ve sürümü, gecikme ve zaman damgası sonuçları aylar sonra bile hata ayıklanabilir kılar.
  3. Last Will ile retained durum kullanın. Retained online/offline topic'i, gösterge panellerinin hangi hızlandırıcıların çalıştığını göstermesini sağlar.
  4. Topic'leri hiyerarşik olarak yapılandırın. site/area/line/camera/classification gibi bir yapı düz bir ad alanından daha iyi ölçeklenir ve ISA-95 seviyelerine temiz bir şekilde eşlenir.
  5. Model güncellemelerini planlayın. Yeni bir model derlemek kolaydır; onu birçok cihaza güvenle dağıtmak değildir. ML modellerini edge cihazlara dağıtma rehberimiz, güncellemelerin MQTT üzerinden nasıl tetikleneceğini ve izleneceğini gösteriyor.

Sorun Giderme

Belirti Olası neden Çözüm
ValueError: Failed to load delegate from libedgetpu.so.1 Çalışma zamanı kurulu değil, cihaz algılanmadı veya izin sorunu libedgetpu1-std paketini yeniden kurun, cihazı yeniden takın, lsusb ile kontrol edin, kullanıcınızı plugdev grubuna ekleyin
invoke() sırasında segmentation fault Uyumsuz tflite_runtime ve libedgetpu sürümleri Python 3.9 ortamını kullanın ve pycoral paketini Coral paket dizininden kurun
Çıkarım yavaş Model Edge TPU için derlenmemiş veya USB 2 portu _edgetpu.tflite ile biten bir dosya kullanın, bir USB 3 portuna geçin
numpy.core.multiarray failed to import Eski ikili wheel'lerle NumPy 2 pip install "numpy<2"
Mesajlar abonede hiç görünmüyor Farklı topic dizesi veya boş client ID Topic'leri birebir karşılaştırın; her zaman boş olmayan, benzersiz bir client ID ayarlayın

Kendi modellerinizi derlemek isterseniz resmi Coral belgeleri desteklenen platformları ve Edge TPU derleyicisinin gereksinimlerini listeliyor.

Sonra Nereye

Görüntü sınıflandırma en basit iş yüküdür; aynı yayın deseni nesne algılama ve poz tahmini için de çalışır. Etiketler yerine sınırlayıcı kutulara ihtiyacınız varsa MQTT ile YOLO nesne algılama yazısına bakın. Coral hızlandırıcısını Jetson modülleri ve mikrodenetleyiciler gibi alternatiflerle karşılaştırmak için edge AI donanımı genel bakışını okuyun; modelleri bağlantılı cihazlarla birleştirmenin büyük resmi için ise yapay zeka ve IoT rehberimizle başlayın.

ConnectMQ ile Başlayın

Edge TPU sonuçlarınız güvenilir bir yuvayı hak ediyor. ConnectMQ, sınıflandırmaları geldikçe izlemeniz için TLS, WebSocket ve canlı bir topic gezgini içeren bir bulut MQTT broker sunar. Birkaç dakika içinde, kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun ve Raspberry Pi'nizi ona yönlendirin.

Sık Sorulan Sorular

Coral Edge TPU, Raspberry Pi 5 ile çalışır mı?

Evet, Coral USB Accelerator USB üzerinden bağlanır ve 64 bit işletim sistemli bir Raspberry Pi 5'te çalışır. Asıl engel Python sürümüdür; bu eğitimin ayrı bir Python 3.9 ortamı kullanmasının nedeni de budur.

Edge TPU'da herhangi bir TensorFlow modelini çalıştırabilir miyim?

Hayır. Modelin, Edge TPU derleyicisiyle derlenmiş, tamamen tam sayıya nicemlenmiş bir TensorFlow Lite modeli olması gerekir. Desteklenmeyen işlemler CPU'ya geri düşer ve hız avantajını azaltır.

Kamera görüntülerini MQTT üzerinden göndermeli miyim?

Genellikle hayır. Çıkarım sonuçlarını yayınlayın ve gerekirse yalnızca ara sıra anlık görüntü gönderin; görüntüler makul mesaj boyutlarını hızla aşar ve gizlilik kaygıları doğurur.

Sınıflandırma sonuçları için hangi QoS seviyesini kullanmalıyım?

QoS 1 iyi bir varsayılandır, çünkü QoS 2'nin ek yükü olmadan en az bir kez teslimi garanti eder. Abonelerin yinelenenleri yok sayabilmesi için bir zaman damgası ekleyin.

İlgili yazılar

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.