Détection de visage sous facebook
Jeudi 31 mars 2011Après avoir appris que des personnes on réussit a récupéré 100 million de profile publique, je me suis intéressé au plus connu des sites sociaux.
En effet, c’est fichier contiennent une liste de nom récupéré sur facebook avec leurs identifiants. De la le pas est facile, si il est possible de récupérer les informations des comptes il est peut être possible de récupéré la photo du profil est d’appliquer une détection de visage. Cela pourrai être très intéressant la plus grand base de données mondial de visage disponible gratuitement, mais d’un autre coté cela est surtout fait pour montrer le danger que peut soulevé les sites sociaux.
La première étape est de récupérer l’identifiant correspondant à un compte généralement il suffit de regarder dans l’url correspondant à un compte. Par exemple :
id=68310606562
Maintenant l’url magique pour récupérer la photo :
wget https://graph.facebook.com/68310606562/picture?type=large -0 profil.jpg
display profil.jpg
Après avoir récupéré la photo, il nous faut un traitement d’image pour détecter un visage pour la photo, pour cela on va utilisé la bibliothèque de traitement d’image OpenCV. Cette bibliothèque possède une routine dite détection d’objet Haar. Voila une petit programme C++ permettant de la mettre en œuvre.
[sourcecode language="cpp"]
#include "cv.h"
#include "highgui.h"
CvHaarClassifierCascade* load_object_detector( const char* cascade_path )
{
return (CvHaarClassifierCascade*)cvLoad( cascade_path );
}
bool detect_and_draw_objects( IplImage* image,
CvHaarClassifierCascade* cascade,
int do_pyramids )
{
IplImage* small_image = image;
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* faces;
int i, scale = 1;
/* if the flag is specified, down-scale the input image to get a
performance boost w/o loosing quality (perhaps) */
if( do_pyramids )
{
small_image = cvCreateImage( cvSize(image->width/2,image->height/2), IPL_DEPTH_8U, 3 );
cvPyrDown( image, small_image, CV_GAUSSIAN_5x5 );
scale = 2;
}
/* use the fastest variant */
faces = cvHaarDetectObjects( small_image, cascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING );
if ( faces->total != 1 )
return false ;
/* draw all the rectangles */
for( i = 0; i < faces->total; i++ )
{
/* extract the rectanlges only */
CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i );
cvRectangle( image, cvPoint(face_rect.x*scale,face_rect.y*scale),
cvPoint((face_rect.x+face_rect.width)*scale,
(face_rect.y+face_rect.height)*scale),
CV_RGB(255,0,0), 1 );
}
if( small_image != image )
cvReleaseImage( &small_image );
cvReleaseMemStorage( &storage );
return true ;
}
int main( int argc, char** argv )
{
IplImage* image;
if( argc==4 && (image = cvLoadImage( argv[1], 1 )) != 0 )
{
CvHaarClassifierCascade* cascade = load_object_detector(argv[2]);
if ( detect_and_draw_objects( image, cascade, 1 ) )
cvSaveImage( argv[3], image );
cvReleaseHaarClassifierCascade( &cascade );
cvReleaseImage( &image );
}
return 0;
}
[/sourcecode]
Bon on compile le tout, on lance le programme avec une base xml contenant les informations pour une bonne détection de visage de face. Et on obtient de bon résultat sur quelques photos. Pour la suite il est possible, bien que le traitement utilisé ne si prete peu, de récupérer les informations spécifique du visage pour faire une recherche dans une base depuis une image source. Comme dans les films il serait donc possible de retrouve une liste de profile correspondant à une image source. Bien que la résolution des images des profiles est assez bases, et que l’on a pas tout le temps la tête bien centré, ou plusieurs visages, voir carrément une photo qui ne correspond pas à la personne. D’ailleurs je ne peux que vous conseiller de ne pas mettre une photo de vous sur votre profil.