2010-08-17 5 views
5

Comme un projet pour animaux de compagnie/expérience d'apprentissage (non ce ne sont pas des devoirs) Je travaille sur un logiciel pour reconnaître les codes à barres d'une photographie. Je ne cherche pas de logiciel ou une bibliothèque qui le fait - au lieu de cela je l'utilise comme un exercice d'apprentissage que je blogue sur et publiera sur Codeplex.Reconnaissance des codes à barres avec AI

I have code that successfully recognizes EAN13 barcodes (which I published on CodePlex) et UPC version A/E devrait suivre sous peu. Cependant, j'ai deux domaines qui me préoccupent. La première consiste à décoder les codes à barres qui sont dans une image floue ou avec un faible contraste, etc. Deuxièmement, il suffit de trouver le code à barres réel dans une image plus grande (vous devez juste me donner une photo du code à barres). J'ai l'intuition qu'une forme d'IA va m'aider ici. J'ai joué un peu dans le passé avec des algorithmes génétiques et j'ai suivi un cours il y a longtemps sur l'IA, donc ce n'est pas totalement étranger à moi, mais je ne sais pas trop par où commencer.

Quel type d'algorithme est le mieux adapté à ce type de problème? Toute lecture recommandée ou code pour le travail de grunt AI? Oui, je veux comprendre ce qui se passe, mais je ne veux pas nécessairement descendre au niveau du codage des sortes, etc moi-même.

+3

Peut-être un réseau de neurones? Je ne sais pas. Peut-être que j'aime juste les réseaux de neurones. L'IA m'a dit de les aimer. Ou sinon. –

+0

@ fire.eagle: Des liens ou des pointeurs pour moi? Les recherches Web sur "Neural Networks" et "ANN" sont beaucoup trop larges. :) – ctacke

+0

Je suppose que vous avez vu l'application RedLaser pour iPhone? –

Répondre

8

Je suggère de rechercher les propriétés d'un code à barres. Certains que j'ai à l'esprit sont:

  1. Histogramme de couleurs montre deux couleurs distinctes dans environ une distribution uniforme
  2. Faire un hough transformation trouve de nombreuses lignes parallèles
  3. L'épaisseur des lignes ont deux dimensions distinctes.

Un autre? Ayant cela, je voudrais diviser l'image en morceaux et faire une classification avec ces caractéristiques puis cobine les résultats pour calculer un liklyhood si la pièce contient un code à barres ou non.

Pour votre deuxième problème (image floue), je suggère de calculer les 1st order derivative des valeurs de gris, puis de détecter les bords des lignes dans cet espace. Le maximum de la dérivée est plus faible si l'image est floue mais elle devrait être détectable à un certain facteur de flou.

Est-ce que cela vous aide?

0

Vous n'avez besoin d'aucune technique d'IA ou de calcul logiciel spécifique. Vous devez appliquer une technique de traitement d'image pour améliorer la qualité de l'image ou pour isoler le code à barres d'une image plus grande. Vous pouvez utiliser Matlab pour le prototypage et en savoir plus sur le traitement d'image.

+0

Quelle sorte de "technique de traitement d'image"? J'écris aussi du code ici. J'ai une photo prise avec mon téléphone portable, je veux récupérer une ficelle. Matlab n'est pas tout ce qui s'applique dans cette formule autant que je peux voir. – ctacke

+0

Matlab est un outil formidable pour le traitement d'images et pour explorer et trouver la solution qui correspond à vos besoins. Il y a des tonnes de filtres et de fonctions. L'état de l'art de la vision par ordinateur moderne est condensé dans la bibliothèque de traitement d'images Matlab. Une fois que vous avez trouvé la meilleure solution, traduisez-la dans le langage de programmation et la plateforme de votre choix. Je ne peux pas vous dire quelle est la meilleure approche pour résoudre votre problème. Vous devez expérimenter un peu. –

4

Comme mp déjà noté, vous n'avez pas besoin d'une vraie technique AI pour cela. Jetez un oeil au chapitre 12 de Real World Haskell. Il implémente un système de reconnaissance de codes à barres presque complet. L'exemple de code est dans Haskell, mais il y a beaucoup d'explications, donc vous pouvez probablement comprendre les idées et les astuces même sans expérience Haskell.

Si vous voulez le résoudre avec AI, le meilleur pari est probablement d'utiliser ANNs. Pour le problème donné, je recommanderais d'utiliser une technique assez avancée appelée HyperNEAT.Voir mon explication (et liens) comme la première réponse à la question SO Neural Network Size...

Je probablement utiliser deux ou trois réseaux différents,

  • Le premier à trouver le code à barres sur la grande image. Un neurone de sortie par pixel/ensemble de pixels, la valeur de sortie est la confiance si ce pixel semble faire partie d'un code à barres. En fonction du résultat, j'utiliserais une transformation d'image pour le convertir en un format "standard" (rectangle x * y)
  • Si vous avez des difficultés à trouver l'emplacement du code à barres, utilisez-en un second. Nourrissez le résultat du premier, et demandez-lui de donner les coordonnées de deux coins. Cependant, je ne suis pas sûr que ce sera très facile d'évoluer celui-ci. Le dernier travaillerait sur le format normalisé, les neurones de sortie pour chaque ligne (ou carré, si vous travaillez avec un code à barres éventuellement 2D), en disant si la zone donnée doit être considérée comme noir ou blanc.

Probablement, cela aiderait également à effectuer un pré-traitement de l'image, par ex. ceux qui sont décrits dans RWH.

+0

HyperNEAT sonne vraiment intéressant –

+0

Oui, c'est une technique très puissante. La recherche est assez intensive et ils proposent souvent des extensions/applications très créatives. –

Questions connexes