Je possède une bibliothèque de photos assez volumineuse d’environ 20000 photos. La votre est sans doute plus volumineuse et rechercher une photo particulière peut devenir une gageure. Devant faire un montage photos pour le mariage de mon fils, la recherche de photos le concernant s’est vite transformée en travail de bénédictin.
Et au bout de 2000 photos parcourues, … ça a fait tilt. Pourquoi ne pas essayer le service Amazon Rekognition !
Cela ne fait ni une ni deux, en avant la réalisation, un challenge d’informaticien vs un travail de galérien. C’est vrai qu’il me restait encore 18000 photos.
Amazon Rekognition Image est un service possédant de nombreuses possibilités, notamment celle de rechercher des visages particuliers sur des photos, mais aussi de détecter des situations sur des photos, sourire des personnages, présences d’objets, de paysages particuliers, images inappropriées, …
Principe
Le principe dans la fonctionnalité de détection de visages est de fournir une photo de référence afin de comparer les autres photos à cette référence. Je vais pour ma part réaliser deux passes avec des photos de référence différentes : une première avec mon fils enfant, une deuxième avec mon fils adolescent.
Je dépose la bibliothèque de photos familiale sur un bucket S3. Dans ce bucket, à la racine de l’arborescence, je dépose la photo de référence à utiliser, choisie bien sûr parmi les portraits les plus réalistes. Les images peuvent être situées sur un serveur on premise ou sur un poste de travail hors cloud. Dans ce cas, il y aura, en plus du temps de traitemen,t le temps de transfert des images.
Le script shell utilisé et donné ci-dessous liste récursivement les photos et les soumet au service Rekognition avec la photo de référence.
Réalisation
La réalisation consiste à mettre en place un script shell pour réaliser les appels à Amazon Rekognition avec AWS Cli. Des librairies sont disponibles dans les différents langages de programmation pour intégrer ce service dans vos applications. Le script shell ci-dessous est opérationnel, il suffit d’attribuer les bons droits (S3 et Rekognition) sur le user AWS qui l’exécute et de modifier les constantes qui se situent en haut du script.
Il y a trois appel à AWS Cli dans ce script : réalisation de la liste des photos se trouvant dans les répertoires du bucket dit « de base », appel du service Rekognition pour chaque photo de la liste, copie éventuelle de la photo dans un répertoire résultat en cas de réussite de la détection.
Deux aspects fonctionnels sont pris en compte dans le script shell : les noms de répertoires et photos comportent des espaces, des photos portent le même nom.
#------------------------------------------------------------------------------------------ # script pour lire des photos dans un bucket s3, les comparer avec # une photo de reference a l'aide du service Rekognition # # JPC 04/10/20 #------------------------------------------------------------------------------------------ #!/bin/bash BUCKET_BASE="reko-image" IMAGE_REF=eng_9ans.JPG BUCKET_RESULTAT="reko-image" REPERTOIRE_RESULTAT="resultat" FIC_TEMP="./list-fic.txt" POURCENT_REUSSITE=98 #----------------------------------------------- # listage des images sur bucket #----------------------------------------------- # il y a des noms de fic ou repertoire avec des spaces d'ou le "#" pour obtenir un fichier par ligne RETOUR="$(aws s3 ls s3://reko-image --recursive --human-readable --summarize | awk '{$1=$2=$3=$4=""; print $0}' | sed 's/^[ \t]*/#/')" echo "$RETOUR"|awk -F "#" '{print $0}'|tr -d "#" > $FIC_TEMP #----------------------------------------------- # boucle sur images listees #----------------------------------------------- while read ligne;do echo -e "\nImage traitee $ligne" #----------------------------------------------- # comparaison de chaque image avec l'image de reference #----------------------------------------------- commande="\ aws rekognition compare-faces \ --source-image '{\"S3Object\":{\"Bucket\":\""$BUCKET_BASE"\",\"Name\":\""$IMAGE_REF"\"}}' \ --target-image '{\"S3Object\":{\"Bucket\":\""$BUCKET_BASE"\",\"Name\":\""$ligne"\"}}' \ --similarity-threshold $POURCENT_REUSSITE \ --query 'FaceMatches[0].Similarity' 2>/dev/null" RETOUR_COMPARE=$(eval $commande) if [ "$RETOUR_COMPARE" != "" ];then # comparaison de float avec bc if (( $(echo "$RETOUR_COMPARE > $POURCENT_REUSSITE" |bc -l) )); then echo -e "retour comparaison OK a $RETOUR_COMPARE % fichier $ligne" # plusieurs fichiers peuvent porter le meme nom. On realise un nom unique a partir du nom du repertoire nom_fic_trouve=$(echo ${ligne}|tr "/" "_"|tr " " "_") comande_copie=" aws s3 cp \"s3://${BUCKET_BASE}/${ligne}\" \ s3://${BUCKET_RESULTAT}/${REPERTOIRE_RESULTAT}/${nom_fic_trouve}" eval $comande_copie fi fi done < $FIC_TEMP
Exemple de résultats
Voici la photo de référence
Et quelques photos remontées par Amazon Rekognition. Je n’ai pas mesuré précisément le temps de traitement, il est de moins d’une seconde.
La réussite est au rendez-vous, il s’agit d’un service professionnel de haute qualité !!!
Utilisation professionnelle
La facilité déconcertante d’utilisation de ce service ainsi que son taux de réussite laisse pantois. Lorsque l’on pense pendant quelques instants au travail de développement que demande une telle application, il y a beaucoup à gagner pour une entreprise à utiliser ce service dans le cadre d’un projet.
Coût du service
Reste le coût, qui est élevé dans le cadre d’une utilisation familiale (pour ma part je bénéficie de crédits AWS en tant que formateur 😉 ) : 1$ les 1000 photos traitées.
Mais le résultat est au rendez-vous !
Pour aller plus loin
Si vous souhaitez en savoir plus et vous former sur Amazon Web Services, découvrez notre offre de formations officielles AWS.