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.
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Mettiamoci la faccia: face detection, recognition e landmark per applicazioni interattive
1. Mettiamoci la faccia:
face detection, recognition e landmark per
applicazioni interattive
Massimo Bonanni
codetailor.blogspot.com
massimo.bonanni@tiscali.it
@massimobonanni
2. Agenda
La libreria libpxcclr.dll
La classe UtilMPipeline
La nostra classe Pipeline
Recuperare l’immagine
Face detection
Face landmark
Face recognition
3. La libreria libpxcclr.dll
Applications
C# Port
Core Framework
PXCMSession
PXCMImage
PXCMAudio
I/O
PXCMCapture
Algorithms
PXCMGesture
PXCMFaceAnalysis
PXCMVoiceRecognition
PXCMVoiceTTS
Pipeline
UtilMCapture
UtilMPipeline
Processing* Port
openFrameworks* Port
Unity* Port
PXCUPipeline (C)
UtilPipeline (C++)
UtilCapture (C++)
C++
Core Framework
PXCSession
PXCImage
PXCAudio
I/O
PXCCapture
Algorithms
PXCGesture
PXCFaceAnalysis
PXCVoiceRecognition
PXCVoiceTTS
5. 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.
6. La nostra classe Pipeline
Uno dei metodi per utilizzare le funzionalità
della piattaforma è implementare la nostra
classe pipeline derivando dalla
UtilMPipeline.
7. La nostra classe Pipeline
Nel costruttore della nostra Pipeline
possiamo abilitare le funzionalità che ci
servono.
Private ColorFormat As PXCMImage.ColorFormat = PXCMImage.ColorFormat.COLOR_FORMAT_RGB24
Public Sub New()
MyBase.New()
EnableImage(ColorFormat)
End Sub
8. Recuperare l’immagine
Per recuperare l’immagine fornita dalla cam, si può:
• Eseguire l’override del metodo OnImage()
Public Overrides Sub OnImage(image As PXCMImage)
MyBase.OnImage(image)
ElaborateImage(image)
End Sub
•
Eseguire l’override del metodo OnNewFrame()
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 True
End Function
Il metodo OnNewFrame viene richiamato ogni volta che è disponibile
un nuovo frame da elaborare (non solo imagine).
9. Recuperare l’immagine
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.
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 If
End Sub
11. Face detection – Cos’è
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 ObjectClass Detection (dove la classe di oggetto
è il volto umano).
12. Face detection
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).
13. 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.
14. 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.
16. Face landmark
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.
17. 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.
18. 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.
19. 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;
20. 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).
22. Face recognition
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.
23. 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.
24. 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.
25. 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.
27. Riferimenti
Intel Development Zone – Perceptual
Computing
http://software.intel.com/it-it/vcsource/tools/perceptualcomputing-sdk
Intel Development Zone – Forum
http://software.intel.com/en-us/forums/intel-perceptualcomputing-sdk
Articoli in italiano – CodeTailor
http://codetailor.blogspot.it/p/intel-perceptual-computing.html