Akıllı ev ve güvenlik kameralarında nesne algılama (object detection) genellikle harici GPU sunucuları (Frigate, Coral TPU) veya bulut tabanlı yapay zeka abonelikleri gerektirir. Ancak Home Assistant topluluğunda paylaşılan ve açık kaynaklı s3_vision ESPHome dış bileşeni, hiçbir harici sunucuya ihtiyaç duymadan doğrudan ucuz bir ESP32-S3 kartı üzerinde YOLO11 (80 COCO sınıfı), yaya, el ve yüz algılama modellerini tamamen yerel (on-device Edge AI) olarak çalıştırmayı başarıyor.
ESP32-S3 Vektör Komut Seti ve ESP-DL Mimarisi
ESP32-S3, Tensilica Xtensa LX7 çekirdeğinde bulunan dahili Vektör Genişletmesi (Vector Instructions) sayesinde sinir ağı matris çarpımlarını donanımsal düzeyde hızlandırır. Espressif’in ESP-DL derin öğrenme kütüphanesi ile optimize edilen YOLO11 modelleri, 8-bit kuantizasyon (INT8/S8) ile sıkıştırılarak mikrodenetleyicinin PSRAM belleğinde saniyede birden fazla kare (FPS) hızında çıkarım (inference) gerçekleştirebilir.
Donanım Gereksinimleri ve Test Edilen Kartlar
YOLO11 gibi karmaşık bir yapay zeka modelini mikrodenetleyicide çalıştırmak için donanım spesifikasyonları kritik önem taşır:
| Donanım Bileşeni | Minimum Gereksinim | Önerilen Yapılandırma |
|---|---|---|
| Mikrodenetleyici | ESP32-S3 (S2 / C3 / C6 desteklenmez) | ESP32-S3 N16R8 (Octal PSRAM) |
| Flash / PSRAM | 8 MB Flash / 2 MB Quad PSRAM | 16 MB Flash / 8 MB Octal PSRAM |
| Kamera Sensörü | DVP Paralel OV2640 | OV2640 (320×240 RGB565 Modu) |
| Güç Kaynağı | 5V 2A Stabil USB Adaptör | 5V 2A DC Regüle Güç Kaynağı |
Doğrulanmış Geliştirme Kartları: Waveshare ESP32-S3-SIM7670G-4G, ESP32-S3-DevKitC-1 + OV2640 ve Freenove ESP32-S3 WROOM kamera modülleri.
Özel Bölüntü Tablosu (Custom Partition Table)
ESP-DL kütüphanesi ve kuantize edilmiş YOLO11 yapay zeka ağırlıkları firmware ile birlikte paketlendiğinde binary boyutu yaklaşık 7 MB civarına ulaşır. Standart 4MB/8MB fabrika bölüntüsü yetersiz kalacağından, proje dizininize `partitions.csv` adıyla 12 MB’lık uygulama alanı tanımlayan özel bölüntü tablosu eklenmelidir:
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0xC00000,
coredump, data, coredump,0xC10000,0x10000,
Adım Adım ESPHome Yapılandırma Kodu (YAML)
`s3_vision` bileşenini derleme aşamasında modele gömen ve tespit edilen nesneleri Home Assistant’a MQTT üzerinden JSON ve Base64 anlık görüntü (snapshot) olarak ileten tam konfigürasyon:
esphome:
name: s3-ai-kamera
friendly_name: "ESP32-S3 Edge AI Kamera"
esp32:
board: esp32-s3-devkitc-1
framework:
type: esp-idf
partitions: partitions.csv
external_components:
- source:
type: git
url: https://github.com/youkorr/s3_vision
ref: main
components: [ vision ]
# Kamera donanımı (RGB565 formatı zorunludur)
esp32_camera:
name: "AI Kamera Akışı"
id: my_camera
resolution: 320x240
pixel_format: RGB565
frame_buffer_count: 1
frame_buffer_location: PSRAM
# Kartınıza uygun pin tanımlamaları (Freenove / DevKitC):
data_pins: [GPIO15, GPIO17, GPIO18, GPIO16, GPIO14, GPIO12, GPIO11, GPIO48]
vsync_pin: GPIO38
href_pin: GPIO47
pixel_clock_pin: GPIO13
external_clock:
pin: GPIO10
frequency: 20MHz
i2c_pins:
sda: GPIO40
scl: GPIO39
# Edge AI Çıkarım Motoru
vision:
id: my_vision
esp32_camera_id: my_camera
model_family: coco_detect
model_path: ./coco_detect_yolo11n_320_s8_v3.espdl
score_threshold: 0.30
detection_interval_ms: 200
draw_boxes: true
on_detection_image:
- then:
- mqtt.publish:
topic: device/s3_ai_kamera/camera/snapshot
payload: !lambda 'return esphome::base64_encode(image.data, image.length);'
on_object_detected:
- then:
- mqtt.publish:
topic: device/s3_ai_kamera/detection/state
payload: !lambda |-
auto dets = id(my_vision).get_detections();
std::string out = "{\"count\":";
out += std::to_string(dets.size());
out += \",\"objects\":[\";
for (size_t i = 0; i < dets.size(); i++) {
if (i) out += \",\\";











