Mettiamoci la faccia: face detection, recognition e landmark per applicazioni interattive

Post on 01-Nov-2014

681 views 2 download

Tags:

description

Sessione su Face Detection, Face Recognition e Face Landmark con Intel Perceptual Computing SDK tenuta durante l'evento "Intel® Software Community Day" del 13/12/2013 a Roma.

Transcript of Mettiamoci la faccia: face detection, recognition e landmark per applicazioni interattive

@@Mettiamoci la faccia: face detection, recognition e landmark

per applicazioni interattive

Massimo Bonannicodetailor.blogspot.com

massimo.bonanni@tiscali.it

@massimobonanni

@La libreria libpxcclr.dllLa classe UtilMPipelineLa nostra classe PipelineRecuperare l’immagineFace detectionFace landmarkFace recognition

Agenda

@La libreria libpxcclr.dll

PXCUPipeline (C)

Core Framework I/O AlgorithmsPXCSession PXCCapture PXCGesturePXCImage PXCFaceAnalysisPXCAudio PXCVoiceRecognition

PXCVoiceTTS

UtilCapture (C++)

UtilPipeline (C++)

Processing* Port Unity* PortopenFrameworks* PortC# Port

Core FrameworkPXCMSessionPXCMImagePXCMAudioI/OPXCMCaptureAlgorithmsPXCMGesturePXCMFaceAnalysisPXCMVoiceRecognitionPXCMVoiceTTSPipelineUtilMCaptureUtilMPipeline

C++

Applications

@La classe UtilMPipeline (controparte .NET della UtilPipeline C++) permette l’accesso alle funzionalità esposte dalla piattaforma Intel© Perceptual Computing

La classe UtilMPipeline

@• LoopFrames: da «il via» al funzionamento della pipeline. E’ un metodo bloccante rilasciato quando la pipeline viene rilasciata;

• EnableXXX: abilita la pipeline all’utilizzo della funzionalità XXX, ad esempio EnableImage() abilita lo stream video;

• PauseXXX: sospende la funzionalità XXX, ad esempio PauseFaceLocation sospende la funzionalità di Face Detection.

La classe UtilMPipeline

@Uno dei metodi per utilizzare le funzionalità della piattaforma è implementare la nostra classe pipeline derivando dalla UtilMPipeline.

La nostra classe Pipeline

@Nel costruttore della nostra Pipeline possiamo abilitare le funzionalità che ci servono.

La nostra classe Pipeline

Private ColorFormat As PXCMImage.ColorFormat = PXCMImage.ColorFormat.COLOR_FORMAT_RGB24

Public Sub New() MyBase.New() EnableImage(ColorFormat)End Sub

@Per recuperare l’immagine fornita dalla cam, si può:• Eseguire l’override del metodo OnImage()

• Eseguire l’override del metodo OnNewFrame()

Il metodo OnNewFrame viene richiamato ogni volta che è disponibile un nuovo frame da elaborare (non solo imagine).

Recuperare l’immagine

Public Overrides Function OnNewFrame() As Boolean If Not MyBase.OnNewFrame Then Return False Dim image As PXCMImage = QueryImage(PXCMImage.ImageType.IMAGE_TYPE_COLOR) If image IsNot Nothing Then ElaborateImage(image) End If Return TrueEnd Function

Public Overrides Sub OnImage(image As PXCMImage) MyBase.OnImage(image) ElaborateImage(image)End Sub

@La classe PCXMImage (wrapper della PCXImage C++) definisce l’imagine Perceptual, contiene classi innestate per la gestione delle immagini e fornisce strumenti per la conversione in imagine del framework.

Recuperare l’immagine

Protected Sub ElaborateImage(ByVal image As PXCMImage) Dim data As PXCMImage.ImageData Dim pcmStatus = image.AcquireAccess(PXCMImage.Access.ACCESS_READ,

ColorFormat, data) If pcmStatus = pxcmStatus.PXCM_STATUS_NO_ERROR Then Dim bitmap As Bitmap = data.ToBitmap(640, 480) ' ' End IfEnd Sub

@Face detection, recognition e landmark per applicazioni interattive

DEMOImageCamPipeline

@Tecnologia informatica che determina le posizioni e le dimensioni di volti umani all'interno di immagini (o di video). Rileva le caratteristiche facciali e ignora tutto il resto, come edifici, alberi, corpi.Face Detection è un caso specifico della tecnologia che va sotto il nome di Object-Class Detection (dove la classe di oggetto è il volto umano).

Face detection – Cos’è

@Per utilizzare la funzionalità di Face Detection, è necessario abilitarla con il metodo EnableFaceLocation() della UtilMPipeline.

Il comando EnableFaceLocation() fa in modo che, nel momento in cui andremo a richiedere le funzionalità di face location, queste siano disponibili (e non si ottenga un errore).

Face detection

@Attivata la localizzazione facciale, l'algoritmo da seguire per verificare la presenza di una "faccia" è il seguente:

1. recuperare l'istanza della classe PXCMFaceAnalysis che si occupa dell'effettivo algoritmo di face detection;

2. per ogni indice dell'eventuale Face da recuperare, eseguire una query per capire quale è il suo identificativo;

3. tramite l'identificativo si recuperano (se ci sono) i dati veri e propri della posizione del viso.

Il posto più adatto dove eseguire il tutto è nel metodo OnNewFrame() della pipeline.

Face detection

@La struttura PXCMFaceAnalysis.Detection.Data contiene i dati relativi alla faccia rilevata:

• rectangle: struttura PXCRectU32 che individua fisicamente la faccia rilevata. La struttura è composta dalle coordinate x e y del punto in alto a sinistra, dall'altezza e dalla larghezza;

• fid: l'identificativo della faccia rilevata;

• confidence: indica la precisione con cui la faccia è stata rilevata. E' un valore intero da 0 a 100;

• viewAngle: contiene l'angolo che la faccia rilevata forma con la telecamera. Si tratta di un enumerazione a maschera di bit.

Face detection

@Face detection, recognition e landmark per applicazioni interattive

DEMOFace Detection

@I landmark sono i punti salienti di un volto. Intel Perceptual Computing consente di recuperare 6 o 7 punti.Per ogni punto vengono fornite le tre coordinate spaziali.

Face landmark

@Assieme ai Landmark possono essere recuperate anche le informazioni relative alla posizione del volto nello spazio (Pose).

Per poter recuperare i Face Landmark, è necessario richiamare il metodo EnableFaceLandmark() della UtilMPipeline.

Face landmark

@L’algoritmo per il recupero dei landmark è il seguente:

1. recuperare l'istanza della classe PXCMFaceAnalysis che si occupa dell'effettivo algoritmo di face detection e di face landmark;

2. per ogni indice della faccia di cui recuperare le informazioni, eseguire una query per ottenere l’identificativo;

3. se la faccia è disponibile, recuperare l'istanza della classe PXCMFaceAnalysis.Landmark da utilizzare per il recupero delle informazioni; 

4. abilitare il profilo della PXCMFaceAnalysis.Landmark per il recupero dei 7 (o dei 6) punti della faccia;

5. tramite l'identificativo si recuperano, se disponibili, le informazioni relative ai landmark.

Face landmark

@La struttura PXCMFaceAnalysis.Landmark.LandmarkData contiene i dati al singolo landmark:

• label: valore dell'enumerazione PXCMFaceAnalysis.Landmark.Label indicante il tipo di punto in esame. Ad esempio il valore LABEL_LEFT_EYE_OUTER_CORNER corrisponde all'angolo esterno dell'occhio sinistro;

• fid: l'identificativo della faccia rilevata;

• position: struttura PXCMPoint3DF32 in cui sono contenute le coordinate spaziali del punto rispetto alle coordinate dell'immagine recuperata dalla web cam. Le coordinate bidimensionali x e y sono disponibili anche utilizzando una normale web cam fornita di serie su un notebook, mentre la coordinata z è disponibile solo con la Creative Cam;

Face landmark

@La struttura dati PXCMFaceAnalysis.Landmark.PoseData contiene i valori di pose:

• fid: identificativo della faccia rilevata;

• pitch: valore del beccheggio cioè della rotazione della faccia lungo il proprio asse trasversale (quello, per intenderci, che passa per le orecchie);

• roll: valore del rollio cioè della rotazione della faccia lungo il proprio asse longitudinale (quello, che esce dal naso);

• yaw: valore dell'imbardata cioè della rotazione della faccia lungo il suo asse verticale (quello, che esce dalla parte superiore della testa).

Face landmark

@Face detection, recognition e landmark per applicazioni interattive

DEMOFace Landmark

@La parola d'ordine del face recognition secondo Perceptual Computing è face model.Una volta individuata la presenza di una faccia davanti allo schermo, possiamo utilizzare le funzionalità dell'SDK per generare un modello della faccia. Utilizzando il modello possiamo verificare se la faccia è o meno nota.

Face recognition

@Per poter "riconoscere" un volto dobbiamo individuare una faccia, generare il suo modello e confrontare tale modello con una serie di modelli noti.

Nel momento in cui abbiamo a disposizione l'identificativo della faccia, possiamo utilizzare il metodo CreateModel() della classe PXCMFaceAnalysis.Recognition per generare il modello (PXCMFaceAnalysis.Recognition.Model).

Il modello, infine, prevede il metodo Compare() in grado di dirci se il modello su cui stiamo agendo è presente in un array di modelli passati per argomento.

Face recognition

@La classe PXCMFaceAnalysis.Recognition.Model mette a disposizione il metodo Serialize() per ottenere la rappresentazione come array di byte del modello stesso. La funzione inversa, la deserializzazione, si può ottenere con il metodo DeserializeModel().

La dimensione del modello (in byte) è contenuta nel profilo attivo della classe PXCMFaceAnalysis.Recognition.

Face recognition

@Dato un modello, per ottenere la sua rappresentazione in byte:1. Recuperare l'istanza della classe PXCMFaceAnalysis;2. Ottenere, da quest'ultima, l'istanza della classe

PXCMFaceAnalysis.Recognition;3. Recuperare il profilo attivo della

PXCMFaceAnalysis.Recognition;4. Dimensionare opportunamente il buffer che conterrà la

rappresentazione binaria del modello;5. Recuperare la rappresentazione binaria tramite il metodo

serialize.

Face recognition

@Face detection, recognition e landmark per applicazioni interattive

DEMOFace Recognition

@Intel Development Zone – Perceptual Computinghttp://software.intel.com/it-it/vcsource/tools/perceptual-computing-sdk

Intel Development Zone – Forumhttp://software.intel.com/en-us/forums/intel-perceptual-computing-sdk

Articoli in italiano – CodeTailorhttp://codetailor.blogspot.it/p/intel-perceptual-computing.html

Riferimenti