Analyse d'image côté serveur
Salut !
Je n'ai pas encore fait de recherche, mais je me demandais si l'analyse d'image sur un serveur pour comparer à une base existante demandait des algorithmes surpuissants...
Concrètement: scanner une image, l'envoyer sur le serveur, et comparer à disons 500.000 enregistrements. J'imagine que ça doit demander une puissance de dingue.
Mais il doit y avoir des astuces pour gagner du temps de traitement.
EDIT: en réfléchissant un peu, il ne s'agit pas de comparer à des milliers d'images. Pour mon cas, il s'agit plutôt de détecter toutes les chaà®nes de caractères présentes dans l'image (et donc côté serveur OU coté client) et de comparer à la base côté serveur qui contient 500.000 enregistrements (donc uniquement de la comparaison de chaà®nes avec de la fuzzy search par exemple).
Comparer l'image elle-même me paraà®t infaisable niveau puissance.
Réponses
Si tu cherche les images exactement identique, utilise des hash md5 ça sera plus simple.
Si tu cherche des images qui montrent la même chose mais sont différentes (en présentation, compression, format...) t'es bon pour faire un OCR et comparer le texte avec tout le coté approximatif que cela représente.
L'idée serait de comparer des étiquettes (de vin) donc oui, le même graphisme mais avec des axes de prises de vues et de qualités différentes et des arrière-plans éventuellement différents...
Donc, l'OCR paraà®t plus viable, mais bonjour la fiabilité.
Je viens de tester Tessaract, mais mes premiers tests sont très mauvais.
J'ai un concurrent qui fait de la comparaison d'étiquette et ça marche très bien. Je ne sais pas quelle techno il utilise (OCR ou comparaison d'images).
Perso je n'ai jamais vu d'OCR marcher correctement.
Quel est l'objectif de la photo ? Compléter ta base ou rechercher un élément dans la base ?
L'objectif est de scanner une étiquette et rappatrier toutes les infos du vin, donc rechercher un élément dans la base à partir de son étiquette. Considère que l'étiquette serait le code-barre de la bouteille.
Et est-ce que tu ne peux pas utiliser le vrai code barre de la bouteille pour ça ?
Non.
1) Plein de bouteilles n'ont pas de code-barre (2/3 ?)
2) Des bouteilles de millésimes différents ont le même code-barre.
3) Je n'ai pas de base de données avec code-barre et je n'en ai pas trouvé.
L'app de ce site http://www.vivino.com/app/ scanne les photos d'éqtiquette et fait de la reconnaissance à partir de l'image et je suis bleuffé par le résultat et la vitesse. Je ne sais pas quelle est leur techno.
Dans mon app, il faut actuellement saisir le nom du vin pour avoir les infos (ce n'est pas aussi rapide qu'un scan).
Donc ils feraient bien de l'OCR et pas de la comparaison d'images:
http://www.prnewswire.com/news-releases/mobile-tech-finds-wine-in-no-time-with-new-ocr-integration-into-vivino-app-208668491.html
Enfin un mix...
"The new solution combines optical character and image recognition that enables higher accuracy and better differentiates mixed fonts on colored backgrounds and curved surfaces, all of which are technical hurdles that we've been able to overcome."
T'as pas essayé de faire un reverse sur leur application ? Voir s'ils ne passent pas par un service tiers par hasard.
Si je suis en train de trouver des infos justement !
http://venturebeat.com/2011/07/29/vivino-helps-you-find-that-wine/
Apparemment, ils passent par ce service:
http://www.kooaba.com
Bah voilà :-)
Je vais voir comment marche leur API.
Les prix sont chauds...
Je viens de tester leur API avec une app démo.
Pour ceux que ça intéresse:
1) On envoit des items sur leur serveur. Un item = 1 id + x images associées + un bloc de json associé dans lequel on met ce qu'on veut. Ces items sont la base de données qui sert à la comparaison.
2) On envoie une image à comparer avec leur API (les clés).
3) On récupère l'ID + le json si un item est trouvé.
Je me suis amusé à uploader quelques étiquettes puis à comparer avec d'autres.
Je dois dire que ça marche bien.
C'est puissant.
Ils sont vraiment cher en effet. Par contre t'as déjà une database de vin dedans.
Oui, mais il faut payer un supplément conséquent.
C'est toujours pareil, il faudrait savoir combien d'utilisateurs supplémentaires ça peut rapporter.
Merci de tes réponses, ça m'a aider à fouiller.
Après tu peux toujours essayer de jouer avec openCV.
Par exemple, essayer de récupérer les points clés de l'étiquettes et mesurer leur distance par rapport à un coin de l'étiquette.
Puis combiner ça avec une comparaison d'histogrammes.
http://fr.wikipedia.org/wiki/Détection_de_zones_d%27intérêt
http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.html
Quelques essais avec OpenCV qui se compile facilement sur Mac.
Il y a même un sample pour trouver des objets dans une scène. Cf ci-joints.
En haut de chaque image il y a le nombre de keypoints qui correspondent.
L'image du haut c'est une photo iPhone (réduite!) et en bas une étiquette trouvée sur le web.
EDIT: oups... j'ai matché un muscat avec un riesling... C'est une bonne maison en tous cas, je suppose que les deux sont bons...
Donc si ça se trouve y'a de quoi faire dans OpenCV encore plus directement que ce qu'a proposé FKDEV, directement en demandant d'utiliser leur algo?
[EDIT]Voilà le lien : http://www.kooaba.com/en/plans_and_pricing/ip_licensing
Dans le code source que j'ai utilisé :
J'avais loupé vos derniers posts.
1) J'ai testé la base de données d'étiquette louée par Kooaba, mais ça coûte 600 euros par mois + 300 euros de forfait de requests.... Je dois dire que ça marche bien et que leur API est efficace. Hormis le prix, le problème est que je récupère des données sur le vin qui ne correspondront pas à ma base personnelle et qui sont parfois absentes (nom de région...).
2) Même si j'arrivais à faire de la reconnaissance d'étiquette à partir d'OpenCV et de SURF, je n'aurais jamais la puissance nécessaire pour comparer les résultats à mes 300.000 vins synchronisés. Je suppose qu'ils doivent stocker des données une fois l'image parsée, comme les "extractions de caractéristiques" ou des vecteurs.
T'as les étiquettes pour tes 300.000 vins ?
Pour réduire la puissance nécessaire il faut décomposer la comparaison et précalculer ce qui peut l'être pour les images de la base.
Sans décomposer, j'estime à 8 heures pour tester 300.000 étiquettes sur un macbook pro retina.
En calculant les keypoints à l'avance, on a que le temps de comparaison (18 ms), soit 1H30.
Donc il faut certainement faire un premier tri avec une autre méthode comme la comparaison d'histogramme qui est hyper rapide, si les histogrammes sont pré-calculés (0,01ms). Mais je ne sais pas combien d'étiquettes tu peux exclure avec cette méthode.
Donc, sur un seul Mac/PC ça parait difficilement envisageable de descendre en-dessous des 5/10 secondes pour une requête.
Après, il faudrait refaire les essais avec le prochain Mac Pro.
(Il y a un sample de SURF en openCL mais je n'ai pas réussi à le faire marcher).
Je pense que 2/3 des vins ont une étiquette mais la base grossit de 25.000 vins par mois environ...
OK, je comprends le principe.
J'imagine que Kooaba s'en sort en utilisant la puissance des serveurs amazon... et leur faible coût.
---
En tout cas, je te remercie de ton implication.
Je ne sais pas si je suis capable de mener à bien un tel projet.
Dans un premier temps, il faudrait que je trouve un moyen de purger la base de données (doublons, erreurs...). Bref, c'est un travail assez monstrueux.
Il reste que je trouve le principe de scanner une étiquette et d'avoir les infos sur le vin super cool.
Dommage que l'OCR ne sache pas reconnaà®tre les étiquettes de vins... il aurait suffit d'envoyer les chaà®nes au serveur.
c'est ta base perso issues des apps ?
C'est vrai que j'ai passé quelques heures, à qui j'envoie la facture ?
Je suis dans une semaine veille techno, donc ça va, c'est toujours plus intéressant d'étudier un sujet avec un vrai enjeu.
Tu n'as pas le choix si tu veux rester compétitif. Après il faut trouver le bon moment pour le faire.
Avec OpenCV + amazon, c'est peut-etre le moment, je ne sais pas...
oui
Oui, mais dans un premier temps, je dois me façonner la base de données (la purger comme je disais).
Bref, j'ai plein de projets... et d'idées.
Je pense que cela ne s'appelerai pas un serveur dans ce cas. [je complète]
Je pense que les ingénieurs Apples doivent ajouter la méthode :
uploadFTPAvecRedirection:(id)sender;
vide à la classe NSIMage. (avec ce nouveau nom), je pense qu'il va y avoir une interconnexion avec le langage Ruby et Java ;-)
Kamoulox ?
y'a clairement des secteurs défectueux.
Bon, je viens de me renseigner sur la licence SURF.
Accrochez-vos ceintures et dites un prix pour voir (prix par année) !
1500e