Um das zuvor erstelle KI Modell mit dem ESP32-CAM nutzen zu können, benötigen wir ein Arduino IDE Programm.

1. Erweiterung um eine Library

Das Programm verwendet bestimmte Programmteile einer externen Library, weshalb diese zu Anfang ergänzt werden muss. Um eine Library zu ergänzen, muss das Librarysymbol an der linken Seite angeklickt werden. Es öffnet sich der Library Manager. Hier ist eine Suchleiste zu sehen, mit welcher die passende Library ausgewählt werden kann. Nun kann nach der Library „EloquentEsp32Cam“ gesucht werden, welche anschließend mit <INSTALL> installiert werden kann.


Quelle: BBS2 Wolfsburg

2. Eigene Library ergänzen

Im vorherigen Artikel wurde mit Hilfe von Edge Impulse ein KI-Modell erstellt, welches in einer Arduino Library gespeichert wurde. Die daraus entstandene ZIP-Datei muss jetzt als Library in Arduino ergänzt werden. Dafür wird der Punkt <Sketch> ausgewählt. Hier befindet sich der Unterpunkt <Include Library> und dann <Add .ZIP Library…>.


Quelle: BBS2 Wolfsburg

Es öffnet sich der Explorer, in dem die passende ZIP-Datei ausgewählt werden kann. Nach der Auswahl wird die Datei automatisch installiert.


Quelle: BBS2 Wolfsburg

3. Programm

Das folgende Programm kann jetzt in Arduino IDE eingepflegt werden:


/**
 * Run Edge Impulse FOMO model.
 * It works on both PSRAM and non-PSRAM boards.
 * 
 * The difference from the PSRAM version
 * is that this sketch only runs on 96x96 frames,
 * while PSRAM version runs on higher resolutions too.
 * 
 * The PSRAM version can be found in my
 * "ESP32S3 Camera Mastery" course
 * at https://dub.sh/ufsDj93
 *
 * BE SURE TO SET "TOOLS > CORE DEBUG LEVEL = INFO"
 * to turn on debug messages
 */
#include <Werkstuecke_inferencing.h>
#include <eloquent_esp32cam.h>
#include <eloquent_esp32cam/edgeimpulse/fomo.h>

using eloq::camera;
using eloq::ei::fomo;

/**
 * 
 */
void setup() {
    delay(3000);
    Serial.begin(115200);
    Serial.println("__EDGE IMPULSE FOMO (NO-PSRAM)__");

    // camera settings
    // replace with your own model!
    camera.pinout.aithinker();
    camera.brownout.disable();
    // NON-PSRAM FOMO only works on 96x96 (yolo) RGB565 images
    camera.resolution.yolo();
    camera.pixformat.rgb565();

    // init camera
    while (!camera.begin().isOk())
        Serial.println(camera.exception.toString());

    Serial.println("Camera OK");
    Serial.println("Put object in front of camera");
}

void loop() {
    // capture picture
    if (!camera.capture().isOk()) {
        Serial.println(camera.exception.toString());
        return;
    }

    // run FOMO
    if (!fomo.run().isOk()) {
      Serial.println(fomo.exception.toString());
      return;
    }

    // how many objects were found?
    Serial.printf(
      "Found %d object(s) in %dms\n", 
      fomo.count(),
      fomo.benchmark.millis()
    );

    // if no object is detected, return
    if (!fomo.foundAnyObject())
      return;

    // if you expect to find a single object, use fomo.first
    Serial.printf(
      "Found %s at (x = %d, y = %d) (size %d x %d). "
      "Proba is %.2f\n",
      fomo.first.label,
      fomo.first.x,
      fomo.first.y,
      fomo.first.width,
      fomo.first.height,
      fomo.first.proba
    );

    // if you expect to find many objects, use fomo.forEach
    if (fomo.count() > 1) {
      fomo.forEach([](int i, bbox_t bbox) {
        Serial.printf(
          "#%d) Found %s at (x = %d, y = %d) (size %d x %d). "
          "Proba is %.2f\n",
          i + 1,
          bbox.label,
          bbox.x,
          bbox.y,
          bbox.width,
          bbox.height,
          bbox.proba
        );
      });
    }
}

Um das Programm für das eigene KI-Modell nutzen zu können, muss die passende Headerdatei eingefügt werden. Dies passiert in der Zeile 16.


Quelle: BBS2 Wolfsburg

Wenn der Name der Datei nicht bekannt ist, kann dieser leicht nachgeschaut werden. Hierzu wird der Punkt <File> geöffnet, worunter der Unterpunkt <Examples> zu finden ist. Am Ende der Liste befinden sich alle Namen der hinzugefügten Dateien. Beim Aufruf der include-Funktion muss nun bloß noch „.h“ als Dateiendung gesetzt werden.


Quelle: BBS2 Wolfsburg

Letztlich muss noch der Debug-Level auf „Info“ gesetzt werden. Dies ist über <Tools> möglich.


Quelle: BBS2 Wolfsburg

Das Programm ist nun vollständig und kann mit Hilfe des Upload Buttons auf den ESP32 hochgeladen werden.

Hinweis: Der Upload braucht viel Zeit.

4. Programm testen

Ist der Upload abgeschlossen, kann nun der Serial Monitor geöffnet werden. Nach einem Druck der Reset Taste auf dem ESP32 erscheint in dem Fenster des Serial Monitors jede drei Sekunden eine neue Auswertung. Je nachdem was für ein Bild die Kamera des ESP32 aufzeichnet, wird ausgegeben, welche Objekte das Programm finden konnte.

Achtung: Um die Ausgabe sehen zu können, muss der Serial begin auf „115200 baud“ stehen.


Quelle: BBS2 Wolfsburg

Unser Arduino IDE-Projekt findet ihr hier:

https://www.xplore-dna.net/mod/resource/view.php?id=11469&forceview=1