Quantcast
Viewing all articles
Browse latest Browse all 1853

Intel RealSense SDK – Face Landmarks

In questo articolo daremo un’occhiata alle funzionalità di riconoscimento dei Face Landmarks fornite di serie dall’Intel RealSense SDK.
L’articolo si riferisce alla versione 6.0.x dell’SDK di Intel® RealSense™ attualmente scaricabile all’indirizzo https://software.intel.com/en-us/intel-realsense-sdk/download

Cosa sono i Face Landmarks

Intel RealSense SDK permette di riconoscere una serie di punti (esattamente 78) sulla superficie del volto umano. È possibile recuperare l’insieme completo dei punti, solo alcuni punti di una determinata regione (vedere immagine di seguito) o determinati punti singoli (individuati da una opportuna enumerazione).

Image may be NSFW.
Clik here to view.

 
Image may be NSFW.
Clik here to view.

 
La posizione di ogni singolo punto è fornita sia nelle coordinate dell’immagine che in quelle del “mondo” (cioè della scena in cui si trova il volto).
È possibile utilizzare questi punti per fornire funzionalità di avatering, di mimica facciale o animazione facciale. 
I landmarks vengono recuperati anche con soggetti con occhiali o capelli che coprono parzialmente il viso. Il miglior risultato si ottiene con un viso perfettamente parallelo al piano focale della camera.

Abilitare il modulo di Face

I face landmarks sono una funzionalità di face tracking 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:

Image may be NSFW.
Clik here to view.

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.

Image may be NSFW.
Clik here to view.

La classe di configurazione espone una serie di metodi che ci permettono di gestire gli alerts (che saranno presi in esame in un futuro articolo), gestire la tipologia di tracking (SetTrackingMode) e abilitare la funzionalità di face landmarks (proprietà landmarks).
Nel caso di face landmarks, argomento di questo articolo, possiamo configurare il modulo nel seguente modo:

var config = FaceModule.CreateActiveConfiguration();
config.detection.isEnabled = false;
config.landmarks.isEnabled = true;
config.pose.isEnabled = false;
config.strategy = PXCMFaceConfiguration.TrackingStrategyType. STRATEGY_CLOSEST_TO_FARTHEST;
if (config.ApplyChanges().IsSuccessful())
{
    if (SenseManager.Init().IsError())
    {
        MessageBox.Show("Errore nell'inizializzazione della camera");
        Close();
    }
}
config.Dispose();

Nella fattispecie, abilitiamo i face landmarks e disabilitiamo il face detection e le face pose (che vedremo in un altro articolo) e scegliamo come strategia di tracking quella che prevede un tracciamento dei volti dal più vicino al più lontano.
La classe LandmarksConfiguration (classe innestata nella PXCMFaceConfiguration) ha la seguente struttura:

Image may be NSFW.
Clik here to view.

 
L’attributo isEnabled permette di abilitare la funzionalità, maxTrackedFaces definisce il numero massimo di facce che possono essere tracciate (fino a 4), smoothingLevel definisce il livello di attenuazione del riconoscimento e numLandmarks definisce il numero massimo di landmarks tracciati.
Se la configurazione viene applicata con successo (metodo ApplyChanges) possiamo cominciare a recuperare i frame ed analizzarli alla scoperta di eventuali facce 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:
 
Image may be NSFW.
Clik here to view.

 
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:
 
Image may be NSFW.
Clik here to view.

 
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 QueryLandmarks:

PXCMFaceData.LandmarksData landmarkData = face.QueryLandmarks();

La classe PXCMFaceDetection.LandmarksData permette l’accesso alle informazioni relative ai face landmarks ed ha la seguente struttura: 

Image may be NSFW.
Clik here to view.

I metodi hanno il seguente utilizzo:

  • QueryNumPoints: retituisce il numero dei punti totali tracciati;
  • QueryNumPointsByGroup: restituisce il numero di punti tracciati per uno specifico gruppo;
  • QueryPoint: restituisce (parametro passato come reference) i dati di uno specifico punto individuato da un indice; 
  • QueryPointIndex: restituisce l’indice di un landmark con un determinato nome;
  • QueryPoints: restituisce i dati di tutti i landmarks tracciati;
  • QueryPointsByGroup: restituisce i landmark tracciati appartenenti ad un determinato gruppo.

I dati relativi ad un landmark sono contenuti in una istanza della classe PXCMFaceData.LandmarkPoint la cui struttura è la seguente:
 
Image may be NSFW.
Clik here to view.

 
 Osserviamo che tra i dati del landmark troviamo:

  • le coordinate del landmark all’interno dell’immagine a colori (proprieta’ image) con la relativa confidence (proprieta’ confidenceImage che contiene un valore tra 0 e 100)
  • le coordinate nello spazio tridimensionale (properieta’ world) con relativa confidence (proprieta’ confidenceWorld)
  • il riferimento ad un oggetto di classe LandmarkPointSource che contiene informazioni legate al nome del landmark ed al suo indice.

Se, quindi volessimo scorrere tutti i landmark tracciati, visualizzare solo quelli con confidence maggiore di 50 e disegnare in giallo quelli senza un nome e in bianco quelli con un nome, potremo scrivere:

PXCMFaceData.LandmarksData landmarkData = face.QueryLandmarks();
PXCMFaceData.LandmarkPoint[] landmarkPoints = null;
if (landmarkData.QueryPoints(out landmarkPoints))
{
    foreach (var point in landmarkPoints)
    {
        if (point.confidenceImage > 50)
            if (point.source.alias != PXCMFaceData.LandmarkType.LANDMARK_NOT_NAMED)
                imageRGB.FillEllipseCentered((int)point.image.x, (int)point.image.y, 4, 4, Colors.White);
            else
                imageRGB.FillEllipseCentered((int)point.image.x, (int)point.image.y, 4, 4, Colors.Yellow);
    }
}

Conclusioni

Il modulo di face detection 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
  • 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>