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. »
Envoyé par Shiqi Yu
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