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
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!!