Quantcast
Channel: C#
Viewing all articles
Browse latest Browse all 1853

Intel RealSense SDK – Face Expressions

$
0
0

In questo articolo daremo un’occhiata alle funzionalità di riconoscimento delle espressioni del viso dell’utente fornite da Intel RealSense SDK.
L’articolo si riferisce alla versione 6.0.x dell’SDK di Intel® RealSense™ attualmente scaricabile dal sito ufficiale di Intel RealSense SDK.

Cosa è Face Expressions

Intel RealSense SDK permette di riconoscere alcune espressioni del viso dell’utente identificato davanti alla camera. 
Grazie al riconoscimento delle espressioni possiamo capire, ad esempio, se il nostro utente sta sorridendo, ha uno degli occhi chiusi (o entrambi) o se sta guardando a destra o sinistra.

Abilitare il modulo di Face

La funzionalità di face expression rientra nell’elenco delle funzionalità di face tracking dell’SDK e, quindi, abbiamo la necessità di attivare il modulo stesso attraverso l’istanza di PXCMSenseManager ed in particolare utilizzando il metodo EnableFace:

SenseManager = PXCMSenseManager.CreateInstance();
SenseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR, 1280, 720);
SenseManager.EnableFace();

Una volta abilitato l’utilizzo del modulo di face tracking, è necessario recuperare l’istanza del modulo stesso e lo possiamo fare utilizzando il metodo QueryFace della PXCMSenseManager:

FaceModule = SenseManager.QueryFace();

Il valore di ritorno del metodo è un’istanza della classe PXCMFaceModule.

Il modulo PXCMFaceModule

La classe PXCMFaceModule incapsula tutte le funzionalità che riguardano il face tracking degli utenti.
La sua struttura è la seguente:
 

 
La classe espone due metodi il cui utilizzo è il seguente:

  • CreateActiveConfiguration: restituisce un oggetto di tipo che ci consente di configurare il modulo per decidere quali funzionalità vogliamo utilizzare (ad esempio il tracking o i landmarks);
  • CreateOutput: permette di ottenere un oggetto di tipo che è l’handler attraverso il quale recuperare effettivamente i dati del viso che ci interessano.

Configurare il modulo di face tracking

La configurazione del modulo di face tracking (una volta abilitato tramite la PXCMSenseManager) avviene attraverso l’istanza della classe PXCMFaceConfiguration recuperata grazie al metodo CreateActiveConfiguration della classe PXCMFaceModule.
 

 
La classe di configurazione espone il metodo QueryExpression che, a sua volta, permette di recuperare l’istanza della classe per la configurazione della parte relativa alle espressioni faciali. Si tratta di un’istanza di classe PXCMFaceConfiguration.ExpressionsConfiguration la cui struttura è la seguente:
 

 
La classe espone i seguenti metodi:

  • Enable: permette di abilitare il modulo di riconoscimento delle espressioni facciali;
  • Disable: disabilita il modulo di riconoscimento delle espressioni facciali;
  • IsEnabled: permette di sapere se il modulo di riconoscimento delle espressioni facciali è attivo o meno;
  • EnableExpression: permette di abilitare il riconoscimento di una specifica espressione facciale. Le possibili espressioni riconoscibili sono elencate nell’enumerazione PXCMFaceData.ExpressionsData.FaceExpression;
  • EnableAllExpressions: abilita il riconoscimento di tutte le espressioni riconoscibili dall’SDK;
  • DisableExpression: disabilita il riconoscimento di una espressione specifica;
  • DisableAllExpressions: disabilita il riconoscimento di tutte le espressioni riconoscibili dall’SDK;
  • IsExpressionEnabled: verifica se il riconoscimento una specifica espressione è abilitato o meno.

L’enumerazione PXCMFaceData.ExpressionsData.FaceExpression contiene i seguenti valori:
 

 
Tra le varie espressioni riconosciute troviamo:

  • EXPRESSION_SMILE: l’utente sta sorridendo;
  • EXPRESSION_KISS: l’utente sta inviando un bacio;
  • EXPRESSION_TONGUE_OUT: l’utente ha la lingua di fuori;
  • EXPRESSION_EYES_CLOSED_LEFT, EXPRESSION_EYES_CLOSED_RIGHT: l’utente ha, rispettivamente, l’occhio sinistro o l’occhio destro chiuso;
  • EXPRESSION_EYES_TURN_LEFT, EXPRESSION_EYES_TURN_RIGHT: l’utente sta guardando, rispettivamente, verso sinistra o verso destra.

Tra le espressioni troviamo anche alcune relative al movimento della testa dell’utente (EXPRESSION_HEAD_XXXX) che, però sono deprecate in quanto sostituite dalle funzionalità di Face Pose. 
Se vogliamo, quindi abilitare il rilevamento di tutte le espressioni supportate dall’SDK, la configurazione del modulo di face tracking sarà la seguente:

var config = FaceModule.CreateActiveConfiguration();
config.detection.isEnabled = false;
config.landmarks.isEnabled = false;
config.pose.isEnabled = false;
config.strategy = PXCMFaceConfiguration.TrackingStrategyType.STRATEGY_FARTHEST_TO_CLOSEST;

PXCMFaceConfiguration.ExpressionsConfiguration exprConfig = config.QueryExpressions();
exprConfig.Enable();
exprConfig.EnableAllExpressions();

if (config.ApplyChanges().IsSuccessful())
{
    if (SenseManager.Init().IsError())
    {
        MessageBox.Show("Errore nell'inizializzazione della camera");
        Close();
    }
}

config.Dispose();

Se la configurazione viene applicata con successo (metodo ApplyChanges) possiamo cominciare a recuperare i frame ed analizzarli alla scoperta delle espressioni facciali rilevate.

Gestire i frame

Come già visto in precedenti articoli, abbiamo due approcci possibili per gestire il recupero dei frame (in questo caso quelli del modulo di face tracking) e l’analisi degli stessi.
Data l’istanza di PXCMSenseManager, possiamo:

  1. Implementare un loop all’interno del quale eseguiamo le opportune query ed analizziamo i frame;
  2. Ci affidiamo agli “eventi” sollevati dalla PXCMSenseManager.

Nell’esempio di questo articolo useremo il primo dei due approcci.
Per prima cosa, dunque, è necessario creare un task al cui “interno” faremo girare il nostro loop:

private Task PollingTask;
private CancellationTokenSource TaskCancellationTokenSource;
private CancellationToken PollingTaskCancellationToken;

private void ConfigurePollingTask()
{
    TaskCancellationTokenSource = new CancellationTokenSource();
    PollingTaskCancellationToken = TaskCancellationTokenSource.Token;
    PollingTask = new Task(PollingCode);
    PollingTask.Start();
}

Il metodo PollingCode contiene l’effettivo codice di recupero dei frame (il loop) e utilizza il CancellationTokenSource per essere informato del momento in cui deve chiudersi (ad esempio perché l’applicazione si sta chiudendo).

private void PollingCode()
{
    PXCMFaceData faceData = FaceModule.CreateOutput();

    while (!PollingTaskCancellationToken.IsCancellationRequested)
    {
        if (SenseManager.AcquireFrame().IsSuccessful())
        {
            faceData.Update();
            var face = faceData.QueryFaceByIndex(0);
            var sample = SenseManager.QuerySample();
            ElaborateSample(sample, face);
            if (!PollingTaskCancellationToken.IsCancellationRequested) SenseManager.ReleaseFrame();
        }
    }
}

Il primo step fondamentale per poter recuperare i dati relativi al face tracking è quello di ottenere l’istanza di PXCMFaceData che ci occorre per effettuare le opportune query allo scopo di ottenere i dati del tracking:

PXCMFaceData faceData = FaceModule.CreateOutput();

La classe PXCMFaceData ha la seguente struttura:
 

 
I metodi che ci interessano in questo caso sono:

  • Update: permette di aggiornare l’handler PXCMFaceData con i dati correnti recuperati dalla camera relativamente ai volti tracciati;
  • QueryFaceByIndex: permette di recuperare i dati di tracciatura (contenuti in un oggetto di classe PXCMFaceData.Face) del viso i-esimo.

In particolare per prima cosa abbiamo la necessità di dire all’SDK di eseguire l’acquisizione del frame attraverso la PXCMSenseManager:

if (SenseManager.AcquireFrame().IsSuccessful())
{
    //
    // .....
    //
}

In caso di acquisizione avvenuta con successo, possiamo aggiornare i dati relativi ai volti tramite il metodo Update e recuperare i dati relativi al primo volto tracciato:

faceData.Update();
var face = faceData.QueryFaceByIndex(0);

Il metodo QueryFaceByIndex restituisce, come già detto, un oggetto di classe PXCMFaceData.Face la cui struttura è la seguente:
 

 
Come possiamo vedere dalla precedente figura, la classe espone solamente dei metodi che ci consentono di recuperare le più svariate informazioni per la singola faccia.
Nel nostro caso, utilizzeremo il metodo QueryExpressions:

PXCMFaceData.ExpressionsData expressionData = face.QueryExpressions();

La classe PXCMFaceData.ExpresionData, oltre a contenere alcune strutture dati innestate, espone il metodo QueryExpression che ci consente di recuperare le informazioni, per il frame corrente, relative ad una determinata espressione (individuata da un valore dell’enumerazione PXCMFaceData.ExpressionsData.FaceExpression): 
 

 
Il metodo restituisce un valore booleano che ci dice se l’operazione di recupero è andata a buon fine. Il contenuto informativo relativo all’espressione è restituito “by reference” tramite un oggetto di classe PXCMFaceData.ExpressionsData.FaceExpressionResult:


 
Il campo intensity restituisce un valore tra 0 e 100 che indica con quale “intensità” (assimilabile ad un valore di confidenza) l’espressione è stata rilevata. Il valore 0 indica che non è stata rilevata l’espressione, 100 significa che l’espressione è stata rilevata con estrema certezza.
Se volessimo controllare che l’espressione “occhio destro chiuso” sia stata rilevata e volessimo considerarla effettivamente rilevata se la sua intensità è maggiore di 80, potremmo scrivere:

PXCMFaceData.ExpressionsData.FaceExpressionResult exprResult;
if (expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_EYES_CLOSED_RIGHT,
                                    out exprResult))
{
    if (exprResult.intensity >= 80)
    {
        // Occhio Destro chiuso
    }
    else
    {
        // Occhio destro aperto
    }
}
else
{
    // l'espressione non è stata rilevata
}

Alcune espressioni hanno il valore intensità che assume solo due valori (0 o 100). Ad esempio l’espressione TONGUE_OUT o la KISS hanno il valore di intensity pari a 0 (espressione rilevata) o 100 (espressione rilevata)

Conclusioni

Il modulo di face tracking espone molte funzionalità interessanti e di pronto utilizzo nelle nostre applicazioni. Il modo con cui si approccia a ciascuna di esse è sempre simile, l’unica variazione è l’impostazione della configurazione (in modo da abilitare le funzionalità che ci servono) e l’utilizzo degli opportuni metodi della classe Face.
L’esempio riportato in questo articolo è disponibile all’indirizzo https://github.com/massimobonanni/RealSenseSamples in cui potete trovare tutte le demo presenti nei miei articoli su RealSense

  • Sviluppatori
  • Partner
  • Professori
  • Studenti
  • Microsoft Windows* 10
  • Microsoft Windows* 8.x
  • Tecnologia Intel® RealSense™
  • .NET*
  • C#
  • Principiante
  • SDK Intel® RealSense™
  • Tecnologia Intel® RealSense™
  • Videocamera anteriore F200
  • Videocamera R200
  • Laptop
  • Tablet
  • Desktop
  • URL
  • Esempio di codice
  • Per iniziare
  • Microsoft Visual Studio*

  • Viewing all articles
    Browse latest Browse all 1853

    Trending Articles



    <script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>