Analyse d'image côté serveur

muqaddarmuqaddar Administrateur
août 2013 modifié dans Langages Web & serveurs #1

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.


«1

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.


  • muqaddarmuqaddar Administrateur
    août 2013 modifié #3

    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 ?


  • muqaddarmuqaddar Administrateur


    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 ?


  • muqaddarmuqaddar Administrateur
    août 2013 modifié #7


    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).


  • muqaddarmuqaddar Administrateur
    août 2013 modifié #8

    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."




  • 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).




     


    T'as pas essayé de faire un reverse sur leur application ? Voir s'ils ne passent pas par un service tiers par hasard.

  • muqaddarmuqaddar Administrateur


    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/


     


    Swiss company Kooaba provides the image recognition technology. Kooaba can match against an image-set of 2 million labels in less than a second. Wine labels shot from different angles or in different lighting conditions can be matched; an important feature when dealing with images taken in restaurants or low-lit rooms.

     



     


    Apparemment, ils passent par ce service:


    http://www.kooaba.com

  • Bah voilà  :-)


  • muqaddarmuqaddar Administrateur


    Bah voilà  :-)




     


    Je vais voir comment marche leur API.


    Les prix sont chauds... ;)

  • muqaddarmuqaddar Administrateur
    août 2013 modifié #13

    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.


  • muqaddarmuqaddar Administrateur
    août 2013 modifié #15


    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


  • FKDEVFKDEV Membre
    août 2013 modifié #17

    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... :p


  • AliGatorAliGator Membre, Modérateur
    août 2013 modifié #18
    J'ai lu je sais plus où sur le site de Kooaba qu'ils se vantaient de leur algo de matching en disant justement que c'était un algo de leur invention (du nom de "SURF" de mémoire) mais qui était tellement bien qu'il avait été intégré à  OpenCV...

    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
  • FKDEVFKDEV Membre
    août 2013 modifié #19

    Dans le code source que j'ai utilisé  :



    static void help()
    {
    printf(
    "This program demonstrated the use of the SURF Detector and Descriptor using\n"
    "either FLANN (fast approx nearst neighbor classification) or brute force matching\n"
    "on planar objects.\n"
    "Usage:\n"
    "./find_obj <object_filename> <scene_filename>, default is box.png and box_in_scene.png\n\n");
    return;
    }

  • muqaddarmuqaddar Administrateur
    août 2013 modifié #20

    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.


  • FKDEVFKDEV Membre
    août 2013 modifié #21

    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).


  • muqaddarmuqaddar Administrateur


    T'as les étiquettes pour tes 300.000 vins ?




     


    Je pense que 2/3 des vins ont  une étiquette mais la base grossit de 25.000 vins par mois environ...


     


     


     




    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.




     


    OK, je comprends le principe.


     


     




     


    Donc, sur un seul Mac/PC ça parait difficilement envisageable de descendre en-dessous des 5/10 secondes pour une requête.




     


    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.

  • FKDEVFKDEV Membre
    août 2013 modifié #23

    Je pense que 2/3 des vins ont  une étiquette mais la base grossit de 25.000 vins par mois environ...

     
    c'est ta base perso issues des apps ?
     

    En tout cas, je te remercie de ton implication.


    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.
     

    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. ;)


    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...
  • muqaddarmuqaddar Administrateur


     

    c'est ta base perso issues des apps ?

     




     


    oui


     


     




    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, 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.

  • chkdskschkdsks Membre
    août 2013 modifié #25

    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 ;-)


  • AliGatorAliGator Membre, Modérateur
    Rien capté à  ton message chkdsks


  • 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 ?



  • Rien capté à  ton message chkdsks




     


    y'a clairement des secteurs défectueux.

  • muqaddarmuqaddar Administrateur

    Bon, je viens de me renseigner sur la licence SURF.


    Accrochez-vos ceintures et dites un prix pour voir (prix par année) !


  • 1500e


  • 27.000 $ HT !
Connectez-vous ou Inscrivez-vous pour répondre.