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:
- Pi'ye bir kamera karesi veya görüntü gelir.
- Edge TPU onu milisaniyeler içinde sınıflandırır.
- Pi, kompakt bir JSON sonucunu (etiketler, skorlar, gecikme, cihaz kimliği) bir MQTT topic'ine yayınlar.
- 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:
- 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.
- 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.
- Last Will ile retained durum kullanın. Retained
online/offlinetopic'i, gösterge panellerinin hangi hızlandırıcıların çalıştığını göstermesini sağlar. - Topic'leri hiyerarşik olarak yapılandırın.
site/area/line/camera/classificationgibi bir yapı düz bir ad alanından daha iyi ölçeklenir ve ISA-95 seviyelerine temiz bir şekilde eşlenir. - 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.



