🧪 Neue Tutorials in Arbeit — vom Roboterarm bis zum Sensor
Zum Inhalt springen

Kapitel 5: Katzengesichtsdetektion

Im Shop kaufen

Ziel dieses Kapitels: Den NanoCam die Gesichter von Katzen erkennen lassen und die Unterschiede zum Gesichtsdetektionsmodell verstehen.

Funktionsprinzip

Die Katzengesichtsdetektion verwendet das Modell CatFaceDetectMN03, das speziell auf Katzen-Gesichtsmerkmale (dreieckige Ohren / großer Augenabstand / Nase) optimiert trainiert wurde. Eingabe ist ein 320x240-RGB565-Bild; ausgegeben wird eine Liste von Katzengesichtsrahmen. Mit der Gesichtsdetektion aus Kapitel 4 teilt es sich dasselbe Ausgabeformat von print_detection_result.

Modellunterschiede: Katzen- vs. Gesichtsdetektion

MerkmalGesichtsdetektion (ai_mode:2)Katzengesichtsdetektion (ai_mode:1)
ModellMSR01 + MNP01 (zweistufige Kaskade)CatFaceDetectMN03 (einstufig)
Landmarken10 (Augen/Nasenspitze/Mundwinkel)Keine (Modell gibt keine aus)
KonfidenzschwelleMSR01=0.3, MNP01=0.40.4
RahmendarstellungGrünes hohles Rechteck + 5 LandmarkenGrünes hohles Rechteck (ohne Landmarken)

Schritte

5.1 Modus wechseln

Plain
ai_mode:1

Das Gerät startet automatisch neu und wechselt in den Katzengesichtsdetektionsmodus

Vollständige Befehle finden Sie im Handbuch zum seriellen Protokoll.

5.2 Ergebnis beobachten

Legen Sie eine Katze oder ein Katzenbild vor die Kamera; im Browser unter http://<IP> erscheint ein grüner Rahmen um das Katzengesicht.

5.3 Serielle Ausgabe

Bei erkannter Katze gibt die serielle Schnittstelle aus:

Plain
I (xxxxx) detection_result: [ 0]: ( 45,  30, 180, 210)
  • Format: [Nummer] (x, y, w, h) — Koordinaten der oberen linken Ecke des Katzengesichtsrahmens + Breite/Höhe

  • Das Katzenmodell gibt keine Landmarken aus (anders als die Gesichtsdetektion)

Code

Zentrale Detektionslogik

components/modules/ai/who_cat_face_detection.cpp:

C++
CatFaceDetectMN03 detector(0.4F, 0.3F, 10, 0.3F);
std::list<dl::detect::result_t> &detect_results = detector.infer(
    (uint16_t *)frame->buf, {(int)frame->height, (int)frame->width, 3});

if (detect_results.size() > 0) {
    draw_detection_result((uint16_t *)frame->buf, frame->height, frame->width, detect_results);
    print_detection_result(detect_results);  // Koordinaten über die serielle Schnittstelle ausgeben
}

Arduino: Koordinaten auslesen und Servo steuern

C++
// Format $face:x,y,w,h# parsen
if (nanoSerial.available()) {
    String line = nanoSerial.readStringUntil('\n');
    if (line.startsWith("$face:")) {
        int x = line.substring(6).toInt();
        int y = line.substring(line.indexOf(',')+1).toInt();
        servoX.write(map(x, 0, 320, 0, 180));
    }
}

Serielles Auslesen mit Python

Python
import serial
ser = serial.Serial("COM3", 115200)
while True:
    line = ser.readline().decode().strip()
    if "detection_result" in line:
        print(line)

Ergebnis

Die Katze erscheint → grüner Rahmen im Bild → Koordinaten werden seriell ausgegeben. Mit Arduino/Python können die Koordinaten ausgelesen und ein Servo zur Verfolgung angesteuert werden.

Nächstes Kapitel: Kapitel 6: Farberkennung