Je suis en train d'implémenter un tracker de visage sur Android, et en tant qu'étude documentaire, j'aimerais identifier la technique sous-jacente du FaceDetector d'Android.
Pour faire simple : je veux comprendre comment le android.media.FaceDetector
Le classificateur fonctionne.
Une brève recherche sur Google n'a rien donné d'informatif, alors j'ai pensé jeter un coup d'œil au code.
En regardant le code source de Java, FaceDetector.java
il n'y a pas grand-chose à apprendre : FaceDetector
est simplement une classe qui reçoit les dimensions de l'image et le nombre de faces, puis renvoie un tableau de faces.
La source Android contient le code JNI de cette classe . J'ai suivi les appels de fonction, où, réduit à l'essentiel, j'ai appris :
- Le "FaceFinder" est créé dans
FaceFinder.c:75
- Sur la ligne 90,
bbs_MemSeg_alloc
renvoie unbtk_HFaceFinder
(qui contient la fonction permettant de trouver les faces), en lui copiant essentiellement l'objethsdkA->contextE.memTblE.espArrE
du tableau originalbtk_HSDK
objet initialisé dans initialize() (FaceDetector_jni.cpp:145
) parbtk_SDK_create()
- Il apparaît qu'un dédale de fonctions se fournissent mutuellement des pointeurs et des instances de
btk_HSDK
mais je ne trouve nulle part une instanciation concrète desdk->contextE.memTblE.espArrE[0]
qui est censé contenir la magie.
Ce que je ont découvert, est un petit indice : le code JNI fait référence à une bibliothèque FFTEm dont je ne trouve pas le code source. En apparence, cependant, FFT est Transformée de Fourier rapide qui est probablement utilisé avec un réseau neuronal pré-entraîné. La seule littérature que j'ai pu trouver qui va dans le sens de cette théorie est la suivante un article de Ben-Yacoub et al.
Je ne sais même pas vraiment si je suis sur la bonne voie, alors toute suggestion serait sans aucun doute utile.
Edit : J'ai ajouté une prime de 100 $ pour quiconque peut donner un aperçu.
0 votes
LibFFTEm n'est pas référencé dans la couche de détection des visages d'Android, il s'agit en fait de la sortie compilée de toutes les sources dans external/neven.
0 votes
Cela explique pourquoi je ne pouvais pas trouver le code source ! Merci ; cela suggère que s'il utilise effectivement les Transformations de Fourier Rapides, il devrait y avoir des traces de cela dans le code source.
neven
. Cependant, rien ne me saute vraiment aux yeux.2 votes
On dirait que le "Em" dans
libFFTEm
peut faire référence à l'"expectation-maximisation", une méthode statistique utilisée dans la détection de la peau basée sur la couleur.1 votes
Il existe un projet qui a extrait la bibliothèque du détecteur de visage neven d'Android : https://github.com/lqs/neven .