Analyser des images pour en déduire des informations

Couleur d'yeux, de vêtements par exemple

a marqué ce sujet comme résolu.

Bonjour à tous,

Ma collection d'avatars est aujourd'hui constituée de plus de 800 photos. Le problème, c'est que je dois éviter les redondances et de mettre plusieurs fois le même modèle avec des noms différents. Mais faire ce travail de recherche et de comparaison avec les modèles existants devient de plus en plus lourd à la main.

J'ai donc pensé à une solution : associer à chaque image un JSON (par exemple) contenant quelques informations comme le nombre de personnes, la couleur des gants, des vêtements, des cheveux et des yeux de la personne. Comme ça, si j'ai une femme blonde avec des gants bleus à ajouter, je n'ai qu'à chercher dans les gants bleus et les femmes blondes si elle est déjà présente.

Mais faire les JSON pour les 800 photos à la main, c'est trop lourd, surtout pour la feignasse d'informaticien que je suis. J'aimerai donc faire un petit programme qui analyserait une photo et en tirerait ce genre d'informations. Mais je n'ai aucune idée de comment procéder.

Tout d'abord, est-ce possible ? Quels prérequis ? Vers quoi dois-je m'orienter ? J'ai mis Python parce que je pense qu'il est adapté pour ça, mais peut-être que d'autres langages peuvent faire l'affaire.

Merci à tous pour votre lecture,

Le modérateur fou

Salut.

Whoa c'est pas simple comme problème.

En Python, tu peux déjà utiliser OpenCV pour implémenter toutes les analyses d'image. Après, le nombre de personnes, de gants, etc., ça va sûrement te demander des traitements différents à chaque fois.

En fait, je me demande déjà s'il y a vraiment besoin de toute cette intelligence pour simplement éviter les redondances ?

Pour moi si tu indexes les images selon leur histogramme (utiliser l'histogramme, voire la décomposotion de l'histogramme rouge, vert et bleu, comme un vecteur qui sert à indexer les images), tu peux sûrement coder une requête pour récupérer toutes les images qui ont un histogramme proche pour récupérer une liste restreinte de candidats, puis utiliser un algorithme tout simple d'auto-corrélation pour trouver si tu as déjà l'image en doublon dans les candidats qui sont remontés.

Autre que l'histogramme (parce que ça peut être vite complexe et lent de faire des opérations sur des vecteurs à 256 dimensions…), tu peux aussi calculer certains autres indicateurs statistiques (khi2, etc.) sur ton image pour créer ton index.

Ça me semble une piste plus facile à mettre en oeuvre pour répondre à ton problème.

En fait, l'idée, c'est juste de créer un "index flou", que tu calcules rapidement sur l'image et qui te sorte une liste restreinte d'images "proches", avant d'utiliser des algos plus lourds en termes de perfs pour savoir si l'un des candidats est identique à ton image.

Sinon, si ce qui t'intéresse est plutôt de récupérer des données un peu haut niveau (nombre de personnes, couleurs dominantes), OpenCV peut là encore répondre à ton problème, notamment parce qu'elle intègre déjà pas mal d'outils qui le font pour toi (détecter les visages, etc.).

+3 -0

Merci de ta réponse. Si je comprend bien, l'histogramme consiste à connaître la distribution des 3 couleurs dans une image ?

Effectivement, ça peut être une première solution. Du coup, je calcule ça pour chaque image et je regarde celles qui ont le plus proche pour n'avoir qu'à analyser un faible nombre d'éventuelles ressemblances, c'est bien ça ?

D'ailleurs, qu'est-ce que l'auto-corrélation ?

Alors pour bien exprimer l'idée.

Pour moi, le but, c'est de créer un index sur ta base d'image : tu associes à chaque image une valeur. Lorsque tu veux ajouter une nouvelle image, tu vas calculer son index, et tu vas récupérer les N images dont l'index est le plus proche pour avoir une liste de candidats potentiels.

Le choix de cet index est libre : j'ai proposé un truc basé sur l'histogramme parce que c'est facile à calculer. C'est un tableau qui à chaque valeur possible des pixels (comprise entre 0 et 255 sur les images 8 bits), associe le nombre de pixels de l'image qui portent cette valeur (que tu peux normaliser pour avoir le pourcentage de pixels de l'image qui portent cette valeur).

Faire une mesure à partir de l'histogramme n'est pas très difficile. Par exemple si au lieu d'avoir 256 valeurs comprises entre 0 et 100, tu sous-échantillonnes l'histogramme pour n'en avoir que 8 ou 16 comprises entre 0 et 10 (ou entre 0 et 8 ou entre 0 et 16… pour faire tenir l'histogramme tout entier dans un gros int en t'alignant sur les puissances de 2), alors tu peux utiliser ce vecteur à 8 dimensions en te disant que si les deux histogrammes sous-échantillonnés sont égaux, alors les vrais histogrammes précis sont "assez proches" pour que ça te donne un candidat. Du coup tu peux te servir de ces histogrammes sous-échantillonnés pour les résumer en un seul nombre, et tu peux par exemple utiliser ce nombre comme clé d'une table de hashage dont les valeurs sont les listes d'images ayant cet histogramme.

Ensuite, tu compares ton image avec une à une avec les N candidats en utilisant un algo plus lourd pour déterminer si l'un des candidats est identique à l'image, j'ai peut-être parlé d'auto-corrélation un peu vite : l'idée c'est simplement d'appliquer un algo qui va tendre vers 1 si les images sont identiques et vers -1 sinon, comme la corrélation croisée normalisée entre les pixels des deux images, qui est en O(N) avec N le nombre de pixels de l'image.

+3 -0

Bonjour,

Si tu veux un service tout pret, facile a utiliser, et gratuit pour une utilisation personnelle (c'est du per-per-use, mais gratuit sous une limite tres raisonnable), tu peux utiliser IBM Watson Cloud Services et en particulier AlchemyVision ou eventuellement, plus simplement, Visual Insight.

Demonstration:

En complement, dans la documentation il y a souvent une partie 'Science' avec des references sur les articles de references pour les methodes implementees, ou d'autres details techniques.

Il s'agit d'un decoupage en services d'IBM Watson qui a gagne Jeopardy! il y a quelques annees.

+5 -0

Tu peux aussi demander à la communauté. Genre une image, doivent cocher des critères, et tu reprends les réponses qui sont les plus données (pour éviter les trolls)

+0 -0

Totalement libre je ne sais pas, par contre, il y a beaucoup de d'API et de SDK en surcouche aux services bruts qui sont open-source avec Watson:

En particulier, il y a des applications un peu plus evoluees qui sont forkable sur github, comme celle-ci.

Et sinon, des ressources utiles qui doivent aller un peu au dela du seul cadre de Watson: ici

Je ferais peut etre un article de presentation sur l'ensemble des services si j'ai le temps un de ces quatre.

+0 -0

Le probleme des solutions cloud c'est quand meme que t'envoies tes données chez ibm et que tu ne sais pas trop ce qu'ils en font.

Watson Cloud Service + Bluemix fonctionne selon deux modes differents:

  • Soit avec un proxy cote serveur, auquel cas les donnees de l'application cliente sont stockees sur Bluemix car tout doit transiter via Bluemix.
  • Soit en discutant directement avec les services, auquel cas les donnees clients ne transitent pas via Bluemix.

Les donnees des requetes ne sont pas bien folichonnes non-plus, et lorsques les services utilisent un apprentissage global (comme Speech-to-text ou Text-to-Speech) il est possible, via un parametre dans la requete, de desactiver l'utilisation de ces donnees pour l'apprentissage global du service.

Les seules reelles informations qui sont collectees sont evidemment celles relatives au compte Bluemix necessaire au deploiement des applications (donc pas de l'application client), des donnees sur le parcours sur le site web (donc pas de l'application client) et evidemment des donnees anonymes de charge normale et necessaires a la calibration et au monitoring des services.

Il y a un certificat de confidentialite accorde par une autorite tierce qui surveille.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte