Raspberry Pi Gesichtserkennung mit Microsoft Cognitive Services

Raspberry Pi Gesichtserkennung mit Microsoft Cognitive Services

 17.03.2017 -  Sebastian Pech -  ~3 Minuten

Microsoft stellt mit den Microsoft Cognitive Services eine Reihe von Services für Bilderkennungsverfahren zur Verfügung. Die Face API bildet eine gute Schnittstelle um dem Raspberry Pi die Gesichtserkennung zu ermöglichen. Mit Hilfe einer Webcam und etwas JavaScript und Node.js lassen sich Bilder aufnehmen und zur Analyse hochladen. Der Cloud-Dienst ist dabei bis zu einer gewissen Menge von Abfragen kostenlos nutzbar.

Pakete installieren

Project Oxford for Node.js ist eine einfach zu nutzende Bibliothek um die Schnittstelle nutzen zu können.

$ mkdir face
$ cd face
$ npm install project-oxford

Account erstellen und API Key generieren

Auf der Microsoft Cognitive Services Webseite ist ein Account zu erstellen. Nach einer kurzen E-Mail Verifikation kann dort ein API Key erstellt werden. Dazu den Punkt „Face Preview – 30,000 transactions per month, 20 per minute.“ anklicken und nach Bestätigung der Lizenz den Subscribe Button klicken. Der Key erscheint nun in der Übersicht.

Foto generieren

Ein nützliches Programm für die Aufnahmen mit einer Webcam ist fswebcam . Es lässt sich einfach über die Kommandozeile zum Erstellen von Snapshots nutzen. Die Installation erfolgt direkt über das Paket.

$ sudo apt-get install fswebcam

Um mit dem Programm ein Screenshot ohne Zeitstempel im Bild aufzunehmen erfolgt der Aufruf mit der entsprechenden Option.

$ fswebcam --no-banner 001.jpg

Gesichter erkennen

Der folgende Code ist von der oben genannten project-oxford package Webseite übernommen. Es wurden aber Fehler behoben (faceAttributes anstelle von attributes) und der Code ist um die Anzeige mehrerer Gesichter ergänzt.

$ nano face.js
# oder vi ;-)
var oxford = require('project-oxford'),
    client = new oxford.Client('xxx KEY HIER EINTRAGEN xxx');

client.face.detect({
    path: '001.jpg',
    analyzesAge: true,
    analyzesGender: true
}).then(function (response) {
    for(var i = 0; i < response.length; i++) {
        console.log('Gesicht ' + i);
        console.log('  Alter: ' + response[i].faceAttributes.age);
        console.log('  Geschlecht: ' + response[i].faceAttributes.gender);
        console.log('  Position: Oben ' + response[i].faceRectangle.top + ' - Links ' + response[i].faceRectangle.left);
        console.log('  Position: Breite ' + response[i].faceRectangle.width + ' - Hoehe ' + response[i].faceRectangle.height);
    }
});

Aufnehmen und verschicken

Für die Einbindung von fswebcam bietet das node-webcam Paket einen Wrapper. Die Installation erfolgt wieder über npm.

$ npm install node-webcam

Das neue Paket binden wir nun in den Code mit ein. Da Dateiausgaben asynchron durchgeführt werden muss die Gesichtserkennung im Function Callback des node-webcam Codes stehen (oder als eigene Funktion). Trotz des Ausgabetyps jpeg endet der Dateiname in jpg!

var NodeWebcam = require('node-webcam');

var opts = {
    quality: 100,
    output: "jpeg",
    verbose: true
}

var oxford = require('project-oxford'),
    client = new oxford.Client('xxx KEY HIER EINTRAGEN xxx');

NodeWebcam.capture('001', opts, function(err, data) {
    if(!err) {
        console.log('Image created!');
    }

    client.face.detect({
        path: '001.jpg',
        analyzesAge: true,
        analyzesGender: true
    }).then(function (response) {
        for(var i = 0; i < response.length; i++) {
            console.log('Gesicht ' + i);
            console.log('  Alter: ' + response[i].faceAttributes.age);
            console.log('  Geschlecht: ' + response[i].faceAttributes.gender);
            console.log('  Position: Oben ' + response[i].faceRectangle.top + ' - Links ' + response[i].faceRectangle.left);
            console.log('  Position: Breite ' + response[i].faceRectangle.width + ' - Hoehe ' + response[i].faceRectangle.height);
        }
    });
});

Emotionen erkennen

Das Erkennen von Emotionen ist ebenfalls einfach umzusetzen. Allerdings weißt das Paket nicht auf die Notwendigkeit eines zweiten Clientobjektes und eines weiteren API Keys hin. Auf der Microsoft Webseite muss ebenfalls das API „Emotion – Preview – 30,000 transactions per month, 20 per minute.“ aktiviert werden. Der API Key ist dann an einen weiteren client (hier emoclient (Haha, super Name, ist mir aber erst später nach dem Schreiben aufgefallen)) zu übergeben.

var oxford = require('project-oxford'),
    emoclient = new oxford.Client('xxx ANDEREN KEY HIER EINTRAGEN xxx');

emoclient.emotion.analyzeEmotion({
    path: '001.jpg',
}).then(function (response) {
    console.log(response);
});