ESP32-S3 ve ESPHome ile Yerel Edge AI: YOLO11 Nesne ve Yüz Algılama Rehberi

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şeniMinimum GereksinimÖnerilen Yapılandırma
MikrodenetleyiciESP32-S3 (S2 / C3 / C6 desteklenmez)ESP32-S3 N16R8 (Octal PSRAM)
Flash / PSRAM8 MB Flash / 2 MB Quad PSRAM16 MB Flash / 8 MB Octal PSRAM
Kamera SensörüDVP Paralel OV2640OV2640 (320×240 RGB565 Modu)
Güç Kaynağı5V 2A Stabil USB Adaptör5V 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 += \",\\";
		
		
			
Scroll to Top