
De 128 pixels par 96 pixels
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. »

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 ?



Voir aussi :


Vous avez lu gratuitement 571 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.