Suche Helfer für Gesichtserkennungsmodul

Grüss Euch

Da ich nun auch Besitzer einer Doorbird bin (ist aber nicht auf Doorbird limitiert), suche ich Leute, die Interesse an der Entwichlung einer Gesichtserkennung hätten.

Ich hab eine Webseite gefunden (Skybiometry Management), die kostenlos API-Aufrufe akzeptiert. Die AP-Doku ist hier (API Documentation | The SkyBiometry Knowledge Base).

Ablauf wäre: Bei Klingeln Screencapture an Service senden und bei Erkennung Türe öffnen.

Leider sind meine Programmierfähigkeiten beschränkt.

Falls jemand Interesse hat oder vielleicht eine andere Lösung kennt, dann würde ich mich über ein Feedback freuen.

Gruss Mike

Nachtrag: Gibt schon eine PHP-Api. Details hier: FCClientPHP/FCClientPHP.php at master · SkyBiometry/FCClientPHP · GitHub

Hallo Mike,

seit deinem Artikel habe ich mich auch mit der Gesichtserkennung beschäftigt. Das Intressante Thema hat mir keine Ruhe gelassen. Zuerst habe ich mich auch mit Skybiometrik beschäftigt, die Ergebnisse waren mir aber zu schlecht. Irgendwann bin ich dann auf Microsoft Azure gestoßen. Da bietet Microsoft für einen gewissen Umfang die Gesichtserkennungsapi ebenfalls kostenlos an ich glaube bis 30.000 Abfragen monatlich das reicht für mich locker.
Du meldest dich bei Azure an, kannst dann den Dienst Gesichtserkennung aktivieren und kannst dann per API alles nutzen. Dort erhälts du einen Key, anhand diesem wirst du bei einem API aufruf identifiziert. Die Dokumentation ist super und enthält auch eine Möglichkeit direkt per Web die API zu bedienen „Open API testing console“. Das ist sehr hilfreich, da man zuerst einmal Gesichter lernen muss, das habe ich alles über testing Console gemacht. Du mußst sozusagen eine „LargePersonGroup“ erstellen, die ID der Gruppe wird im Skript verwendet. Dann erhältst du für jede Person die personID, die dann im Skript vwendet werden kann. Wenn diese dann erstellt ist, kannst du die Haustürbilder an die API senden und erhältst das Ergebnis incl. Wahrscheinlichkeit zurück.

Diese Auswertung eines Bildes erstelle ich mit folgendem Skript… wie du das Ergebnis dann verwendest ist noch offen ich gebe eben bisher nur mal das als Log aus und teste noch eine Weile bevor ich das Türöffnen der API anvertraue :wink:

Alles wichtige zu der API unter:
https://azure.microsoft.com/de-de/services/cognitive-services/face/

https://docs.microsoft.com/de-de/azure/cognitive-services/face/

https://westus.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236

Hier das Skript welches in 2 Schritten (2 Api aufrufen) abläuft. Zuerst das Bild hochladen und erkennen „Face Detect“ und dann das Gesicht identifizieren „Face Identify“: (Auch hier der Hinweis: ich bin kein Programmierer, deshalb nur zusammengestückelt, aber es geht! Und alles auf eigene Gefahr!)


<?
//Gesichtserkennung der Familie: Erster Schritt "Face Detect" dann mit der erhaltenen ID ein "Face Identify" durchführen
//Infos: https://docs.microsoft.com/de-de/azure/cognitive-services/face/ 

//Allgemeine Parameter
$requesturl = "https://westeurope.api.cognitive.microsoft.com/face/v1.0/";
$key = 'xxxxxxxxxxxxxxxxxxxxxxx'; //wird im Header angegeben

//Schritt 1 "Face Detect" ausführen, das Bild wird übermittelt
$request = "detect";
$requestparameter = "?returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=";

//Bild aus dem Medienobjekt des ImageGrabbers auslesen dieser enthält das aktuelle Klingelbild
//IG_UpdateImage(33264);  //ggf. das Bild der kamera aktualisieren, das mache ich an anderer Stelle!
$body = IPS_GetMediaContent(56190);
$body = base64_decode($body);
//es kann auch ein gespeichertes Bild von der Platte verwendet werden
//$body = file_get_contents('C:\IP-Symcon\webfront\user	estgesichter\bild.jpg');

$header = array('Content-Type: application/octet-stream','Ocp-Apim-Subscription-Key: '.$key);

$url = $requesturl.$request.$requestparameter;  //URL zusammensetzen
$response = httpPost($url, $header, $body); //Api Aufruf
$ergebnis = json_decode($response, true); //Serverrückmeldung auswerten

//echo print_r($ergebnis);  //zum Testen
//echo $ergebnis[0]['faceId'];  //zum Testen



//Nur wenn im Klingelbild ein Gesicht gefunden wurde wird der 2. Schritt "Face identify" ausgeführt
if(array_key_exists(0, $ergebnis) == true)
    {
    if(array_key_exists('faceId', $ergebnis[0]) == true)
        {
        //2. Schritt "Face identify"
        $request = "identify";
        
        $body = '{"largePersonGroupId": "familie", "faceIds": ["'.$ergebnis[0]['faceId'].'"], "maxNumOfCandidatesReturned": 1, "confidenceThreshold": 0.5}';

        $header = array('Content-Type: application/json','Ocp-Apim-Subscription-Key: '.$key);

        $url = $requesturl.$request;  //URL zusammensetzen
        $response = httpPost($url, $header, $body); //Api Aufruf
        $ergebnis = json_decode($response, true); //Serverrückmeldung auswerten

        //echo print_r($ergebnis);
        //echo $ergebnis[0]['candidates'][0]['personId'];
        //echo $ergebnis[0]['candidates'][0]['confidence'];

        //Prüfen ob ein Gesicht erkannt wurde
        //Array der Personen in der familie Gruppe
        $familie = array(   	'xxxxxxxxxxxxpersonID1' => 'name1',
                                'xxxxxxxxxxxxpersonID2' => 'name2',
                                'xxxxxxxxxxxxpersonID3' => 'name3',
                                'xxxxxxxxxxxxpersonID4' => 'name4'
                                );


        if(array_key_exists('0', $ergebnis[0]['candidates']) == true)
            {
            $ausgabetext = "Es wurde erkannt: ".$familie[$ergebnis[0]['candidates'][0]['personId']]." mit einer Wahrscheinlichkeit von: ".$ergebnis[0]['candidates'][0]['confidence']; 
            }
            else 
            {
            $ausgabetext = "Das Erkannte Gesicht konnte nicht der Familie zugeordnet werden!";      
            }
        }
        else 
        {
        $ausgabetext =  "Im Klingelbild wurde kein Gesicht erkannt!";
        }
    }
    else 
    {
    $ausgabetext = "Im Klingelbild wurde kein Gesicht erkannt!";    
    }

//Div. Loggs ausgeben
    SMTP_SendMail(30757, "Gesichtserkennung beim Klingeln!", $ausgabetext);
    
    IPS_LogMessage("Gesichtserkennung beim Klingeln!", $ausgabetext);    

function httpPost($url, $header, $body)
    {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
    }

?>

Also dann viel Spaß beim experimentieren. Fragen gerne, soweit ich helfen kann.
Grüße Helmut

PS: übrigens es ist beängstigend, was man mit der API alles machen kann und wie gut die Ergebnisse davon sind. Das alter meiner Kinder haben die voll getroffen. Und ich wurde einiges jünger eingeschätzt… das ist doch schön!!

Ich habe das selber auch mal überlegt und dafür Kairos benutzt. Anbindung über Kairos SDK PHP. So eine richtige sinnvolle Anwendung ist mir dann aber im Alltag doch nicht eingefallen. Wenn man Gesichtserkennung nicht nur zum Spass macht, sondern in einem Bereich der Hausautomation vielleicht für so was wie eine Zutrittskontrolle benutzten sollte, ist mir das zu unsicher. Grundsätzlich funktioniert zwar die Gesichtserkennung aber basiert ja lediglich auf 2D Fotos. Das ist mir persönlich zu unsicher und lässt sich zu leicht aushebeln in sofern ist das aus meiner Sicht für z.B. Zutrittskontrolle völlig ungeeignet. Wenn man sieht was für ein Aufwand getrieben wird bei einem IPhone X mit Gesichtserkennung mit 2 Kameras für 3 Bild und zusätzlich IR Abtastung und dann noch der dahinterstehende Algorithmus, dann ist das eine ganz andere Hausnummer als die simplen Tools die lediglich ein Bild mit einem anderen vergleichen.

Hi einfache Anwendung,

Verwande Besuch steht vor der Tür und wird mit eine Ansage begrüßt :smiley: