Libfacedetection, une bibliothèque C++ open source de détection de visages, permet en une seconde de gérer 1500 images
De 128 pixels par 96 pixels

Le , par Patrick Ruiz

395PARTAGES

Il s’agit des résultats de benchmark de la lib sur un Core i7-7700 cadencé à 3,6 Ghz et avec une version de Windows non précisée comme système d’exploitation. D’après les données chiffrées publiées par l’auteur Shiqi Yu, Libfacedetection permet de détecter jusqu’à 1562 images au format 128 pixels par 96 pixels, ce, en une seconde. Sur des formats plus imposants (640 pixels par 480 pixels), la vitesse de détection est de 60 images par seconde.

Le code de la lib peut générer un exécutable qui s’appuie sur des jeux d’instructions vectoriels. Pour le moment, l’auteur cite AVX2 pour les processeurs Intel et NEON pour les CPU ARM comme les choix disponibles pour les utilisateurs. C’est d’ailleurs dans ces conditions que la bibliothèque a permis d’atteindre ces performances qui, d’avis de certains internautes, « demeurent impressionnantes. »

Citation Envoyé par Shiqi Yu
Il s'agit d'une bibliothèque open source pour la détection des visages sur des images à partir de réseaux de neurones à convolution. On s'est appuyé sur des variables statiques pour la conversion du modèle de réseau de neurones au sein des fichiers source en langage C. Le code source ne dépend d'aucune autre bibliothèque. Tout ce dont vous avez besoin c’est un compilateur C++. Vous pouvez compiler le code source sous Windows, Linux, ARM et toute autre plateforme avec un compilateur C++.




La prise en main de la bibliothèque ne devrait pas poser de problème au lecteur à même d’exploiter l’exemple mis à disposition par l’auteur.

Code C++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/* 
By downloading, copying, installing or using the software you agree to this license. 
If you do not agree to this license, do not download, install, 
copy or use the software. 
  
  
License Agreement For libfacedetection 
(3-clause BSD License) 
  
Copyright (c) 2018-2019, Shiqi Yu, all rights reserved. 
shiqi.yu@gmail.com 
  
Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met: 
  
* Redistributions of source code must retain the above copyright notice, 
this list of conditions and the following disclaimer. 
  
* Redistributions in binary form must reproduce the above copyright notice, 
this list of conditions and the following disclaimer in the documentation 
and/or other materials provided with the distribution. 
  
* Neither the names of the copyright holders nor the names of the contributors 
may be used to endorse or promote products derived from this software 
without specific prior written permission. 
  
This software is provided by the copyright holders and contributors "as is" and 
any express or implied warranties, including, but not limited to, the implied 
warranties of merchantability and fitness for a particular purpose are disclaimed. 
In no event shall copyright holders or contributors be liable for any direct, 
indirect, incidental, special, exemplary, or consequential damages 
(including, but not limited to, procurement of substitute goods or services; 
loss of use, data, or profits; or business interruption) however caused 
and on any theory of liability, whether in contract, strict liability, 
or tort (including negligence or otherwise) arising in any way out of 
the use of this software, even if advised of the possibility of such damage. 
*/ 
  
#include <stdio.h> 
#include <opencv2/opencv.hpp> 
#include "facedetectcnn.h" 
  
//define the buffer size. Do not change the size! 
#define DETECT_BUFFER_SIZE 0x20000 
using namespace cv; 
  
int main(int argc, char* argv[]) 
{ 
    if(argc != 2) 
    { 
        printf("Usage: %s <image_file_name>\n", argv[0]); 
        return -1; 
    } 
  
    //load an image and convert it to gray (single-channel) 
    Mat image = imread(argv[1]);  
    if(image.empty()) 
    { 
        fprintf(stderr, "Can not load the image file %s.\n", argv[1]); 
        return -1; 
    } 
  
    int * pResults = NULL;  
    //pBuffer is used in the detection functions. 
    //If you call functions in multiple threads, please create one buffer for each thread! 
    unsigned char * pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE); 
    if(!pBuffer) 
    { 
        fprintf(stderr, "Can not alloc buffer.\n"); 
        return -1; 
    } 
  
  
    /////////////////////////////////////////// 
    // CNN face detection  
    // Best detection rate 
    ////////////////////////////////////////// 
    //!!! The input image must be a RGB one (three-channel) 
    //!!! DO NOT RELEASE pResults !!! 
    pResults = facedetect_cnn(pBuffer, (unsigned char*)(image.ptr(0)), image.cols, image.rows, (int)image.step); 
  
    printf("%d faces detected.\n", (pResults ? *pResults : 0)); 
    Mat result_cnn = image.clone(); 
    //print the detection results 
    for(int i = 0; i < (pResults ? *pResults : 0); i++) 
    { 
        short * p = ((short*)(pResults+1))+142*i; 
        int x = p[0]; 
        int y = p[1]; 
        int w = p[2]; 
        int h = p[3]; 
        int neighbors = p[4]; 
        int angle = p[5]; 
  
        printf("face_rect=[%d, %d, %d, %d], neighbors=%d, angle=%d\n", x,y,w,h,neighbors, angle); 
        rectangle(result_cnn, Rect(x, y, w, h), Scalar(0, 255, 0), 2); 
    } 
    imshow("result_cnn", result_cnn); 
  
    waitKey(); 
  
    //release the buffer 
    free(pBuffer); 
  
    return 0; 
}

Les travaux de développement de cette bibliothèque sont en partie financés par la Fondation chinoise pour la science basée à Shenzhen. Les alternatives à Libfacedetection sont nombreuses : Openface – une bibliothèque open source de reconnaissance faciale basée sur les réseaux de neurones profonds ; Facenet – une implémentation TensorFlow d’un dispositif de reconnaissance faciale décrit dans la publication de recherche "FaceNet: A Unified Embedding for Face Recognition and Clustering" ; etc. Facenet s’appuie également sur les réseaux de neurones à convolution pour la détection de visages. Les résultats de mtcnn 0.0.8 – une version dérivée de Facenet – sur un Intel i7-3612 cadencé à 2,1 Ghz révèlent que pour un format d’image comparable à 640 pixels par 480 pixels (561 pixels par 561 pixels), la lib est capable de détecter 8 images contenant un visage, ce, en une seconde. Comme on peut le voir, la différence en termes de nombre d'images prises en charge par seconde est grande, ce qui soulève la question de savoir lequel des benchmarks est le plus réaliste.

Sources : dépôt Libfacedetection, données mtcnn

Et vous ?

Sur quelle bibliothèque vous appuyez-vous pour le développement de vos applications de reconnaissance faciale ?
Qu’apporte-t-elle de plus que Libfacedetection ?
D’ailleurs que pensez-vous des résultats de benchmark publiés par l’auteur ? Sont-ils réalistes ?

Voir aussi :

Sortie de la version Alpha d'OpenCV 4.0, la bibliothèque graphique libre pour le traitement d'images et vidéos
Google rend Abseil, une collection de bibliothèques C++ et Python, open source : tour d'horizon

Une erreur dans cette actualité ? Signalez-le nous !

Contacter le responsable de la rubrique Accueil

Partenaire : Hébergement Web