Le Traitement de l'Image: Algorithme d'Amélioration pour "Coca-Cola" Reconnaissance

L'un des plus intéressants projets sur lesquels j'ai travaillé au cours des deux dernières années a été un projet sur le traitement de l'image. L'objectif était de développer un système pour être en mesure de reconnaître Coca-Cola 'boîtes' (notez que j'insiste sur le mot "boîtes", vous verrez pourquoi dans une minute). Vous pouvez voir un exemple ci-dessous, avec l'reconnues dans le rectangle vert avec l'échelle et la rotation.

Le Traitement de l'Image: Algorithme d'Amélioration pour

Certaines contraintes sur le projet:

  • L'arrière-plan peut être très bruyant.
  • La peut pourrait avoir une échelle ou rotation ou même l'orientation (dans des limites raisonnables).
  • L'image pourrait avoir un certain degré de flou de bougé (contours pourrait ne pas être entièrement droite).
  • Il pourrait y avoir des bouteilles de Coca-Cola dans l'image, et l'algorithme ne doit détecter le peut!
  • La luminosité de l'image peut varier beaucoup (si vous ne pouvez pas compter "trop" sur la couleur de détection).
  • La peut pourrait être en partie cachés sur les côtés ou au milieu et peut-être en partie caché derrière une bouteille.
  • Il n'y aurait pas peut du tout dans l'image, dans ce cas, vous devait ne trouver rien et d'écrire un message en le disant.

Donc, vous pourriez vous retrouver avec délicat ce genre de choses (qui dans ce cas a mon algorithme totalement échouer):

Le Traitement de l'Image: Algorithme d'Amélioration pour

J'ai fait ce projet il y a longtemps, et ont eu beaucoup de plaisir à le faire, et j'ai eu un décent mise en œuvre. Voici quelques détails sur ma mise en œuvre:

Langue: Fait en C++ à l'aide de OpenCV bibliothèque.

De pré-traitement: Pour l'image de pré-traitement, c'est à dire transformer l'image en plus de matières premières forme à donner à l'algorithme, j'ai utilisé 2 méthodes:

  1. La modification de la couleur de domaine de RVB à Le HSV et de filtrage basés sur le "rouge" de la teinte, de la saturation au-dessus d'un certain seuil pour éviter d'orange comme les couleurs, de filtrage et de peu de valeur, afin d'éviter des tons sombres. Le résultat final est un binaire image en noir et blanc, où tous les pixels blancs représentent les pixels qui correspondent à ce seuil. Il y a évidemment encore beaucoup de conneries dans l'image, mais cela réduit le nombre de dimensions que vous avez à travailler avec.
    Le Traitement de l'Image: Algorithme d'Amélioration pour
  2. Filtrage de bruit à l'aide de filtrage médian (en prenant la médiane des valeurs de pixel de tous les voisins et remplace le pixel par cette valeur) pour réduire le bruit.
  3. À l'aide de Savant Bord De Filtre De Détection D' pour obtenir les contours de tous les éléments après 2 précédent étapes.
    Le Traitement de l'Image: Algorithme d'Amélioration pour

Algorithme: L'algorithme lui-même que j'ai choisi pour cette tâche a été prise à partir de cette livre génial sur l'extraction de caractéristiques et appelé Généralisée De La Transformation De Hough (assez différent de l'ordinaire Transformation de Hough). Il dit en fait que peu de choses:

  • Vous pouvez décrire un objet dans l'espace sans connaître son équation analytique (ce qui est le cas ici).
  • Il est résistant à l'image des déformations telles que la mise à l'échelle et rotation, comme il va tester votre image pour chaque combinaison de facteur d'échelle et la rotation facteur.
  • Il utilise un modèle de base (un modèle) que l'algorithme va "apprendre".
  • Chaque pixel restant dans le contour de l'image voteront pour un autre pixel qui va soi-disant être le centre en termes de gravité d'un objet, en fonction de ce qu'il a appris à partir du modèle.

En fin de compte, vous vous retrouvez avec une carte de chaleur de la voix, par exemple ici, tous les pixels du contour de la possibilité de voter pour son centre de gravité, de sorte que vous aurez un grand nombre de votes dans le même pixel correspondant au centre, et va voir un pic dans la chaleur de la carte comme ci-dessous:

Le Traitement de l'Image: Algorithme d'Amélioration pour

Une fois que vous avez, un simple seuil de base heuristique peut vous donner l'emplacement du centre de pixel, à partir de laquelle vous pouvez tirer l'échelle et la rotation puis tracer votre petit rectangle autour d'elle (finale de l'échelle et la rotation facteur sera évidemment par rapport à votre modèle d'origine). Au moins, en théorie...

Résultats: Maintenant, bien que cette approche a travaillé dans la base de cas, il a été gravement défaut dans certains domaines:

  • Il est extrêmement lent! Je ne suis pas souligner assez. Presque une journée entière a été nécessaire pour traiter le 30 images de test, bien sûr, parce que j'avais un très haut facteur d'échelle de la rotation et de la traduction, puisque certains de ces boîtes étaient très petites.
  • Il était complètement perdu quand les bouteilles étaient dans l'image, et pour une raison presque toujours trouvé la bouteille au lieu de le peut (peut-être parce que les bouteilles étaient plus gros, il y avait donc plus de pixels, donc plus de votes)
  • Floue des images ont également été pas bon, depuis le vote est terminé en pixel à des emplacements aléatoires autour du centre, terminant ainsi avec une très bruyant carte de chaleur.
  • Dans la variance en translation et en rotation a été réalisée, mais pas dans l'orientation, ce qui signifie que un pouvez qui n'était pas directement en face de la caméra objectif n'a pas été reconnu.

Pouvez-vous m'aider à améliorer mon spécifiques algorithme, en utilisant exclusivement OpenCV fonctions, à résoudre le quatre questions mentionnées?

J'espère que certaines personnes vont aussi apprendre quelque chose de bien, après tout je ne pense pas que les gens qui posent des questions doit apprendre. 🙂

  • Il pourrait être dit que cette question est plus approprié dsp.stackexchange.com ou stats.stackexchange.com et vous avez certainement devraient envisager de re-poser des questions sur ces sites trop.
  • La première chose à faire ici est d'analyser pourquoi les différents cas qui se produisent. E. g., isoler les exemples d'endroits, où les bouteilles de gagner, où les images sont floues, etc., et d'effectuer une analyse statistique pour apprendre la différence entre leur Hough représentations et de celles que vous souhaitez qu'il permettrait de détecter. Quelques grands endroits pour découvrir d'autres approches sont ici et ici
  • Ne serait pas l'extraction de TAMISER ou de SURF des fonctionnalités beaucoup plus rapide que la hough-transformation ? Pourquoi ne détecter que les boîtes où l'on pouvait détecter plus d'objets inscrits?
  • fait un bon point. Pour la vitesse que vous voulez pour obtenir le bon marché-aux-calculer les caractéristiques, comme les histogrammes de gradients orientés. Un vraiment naïf première approche pourrait être manuellement étiquette un tas de rectangles dans la formation des images, et l'utilisation de ces plus aléatoire exemples négatifs pour former un SVM ou classifieur d'arbre de décision. La formation prendra plus de temps, mais l'exécution sur les nouvelles images seront beaucoup plus rapides. J'ai l'intention d'écrire cette méthode lorsque je obtenir plus de temps libre pour inclure le droit de références.
  • J'ai fait cela parce que la portée de la cession a été spécifiquement destiné à des canettes de coca-cola. Je ne sais pas beaucoup sur les EIPD ou du SURF, mais si cet algorithme s'adapte à ce problème, je serais ravi de voir une réponse sur le sujet.
  • Comment sur une approche similaire à reCAPTCHA? 😉
  • Pourquoi était-ce déplacé de dsp.stackexchange.com? Il semble que ce site serait un meilleur ajustement que stackoverflow o_O
  • reCAPTCHA pourrait être une idée, mais vous n'avez absolument aucune garantie que le Coca-Cola lettres seront visibles, ils peuvent être totalement caché, partiellement caché, ou peut être tourné autour de. Et ne résout pas le problème avec la bouteille depuis les lettres sont les mêmes.
  • Avez-Vous essayé de détecter le haut ou le bas sceau de la can? Il pourrait être possible de le détecter comme une arête parallèle au bord de la zone rouge.
  • Je ne veux pas dire pour la reconnaissance de caractères, je voulais dire en utilisant l'idée de l'utilisation des humains pour faire le constat. I. d. montrer alors 2 photos, l'une connue et on ne sait pas. Était juste une blague. 🙂
  • Pouvez-vous ajouter quelques plus d'images de test pour obtenir beaucoup plus d'idée?
  • Avez-vous essayé sans conversion RVB, HSV? Je pense que votre problème de bouteilles est dans votre conversion, en fait, vous avez supprimé vos canettes dans vos premiers pas.
  • Pas de la conversion de VHS fonctionne très bien, c'est juste pour que je puisse éliminer certaines des choses qui n'est clairement pas rouge comme. Peut et la bouteille sont toujours là, même après le passage à HSV, le problème est surtout comment faire la différence entre les 2, car le ont des caractéristiques communes.
  • Mais il semble que votre échantillon est dit quelque chose d'autre, je pense que dans ton premier échantillon après le prétraitement des images de peut enlevé? voulez-vous organiser vos échantillons étape par étape?
  • Oh, je vois ce que tu veux dire, les images 2 et 3 dans ma question ne sont pas de la même origine ! Sur l'image 3, il n'y avait qu'un peut. Je pourrais avoir posté plus, mais en essayant de garder la question à un strict minimum. Il suffit de supposer que le HSV traduction est correctement en gardant les deux peuvent et de bouteilles (+ un peu de bruit tout sur l'image)
  • J'ai une grande attirance pour ce genre de logiciel. Quelqu'un sait si il y a quelques mature et bien établie Bibliothèque Java pour faire ces la reconnaissance d'image?
  • openCV très récemment sorti leur java liaisons pour leur bibliothèque (comme des 2.4.4). Donc, fondamentalement, vous pouvez utiliser openCV en java (sans tous les tracas de faire JNI manuellement). Je l'ai essayé et il a bien fonctionné (mais c'est encore buggé depuis son très récent)
  • C'est tout le dessus de ma tête, mais je pensais: "pourquoi ne pas utiliser OpenCV processeur graphique module et profiter de votre GPU pour accélérer de manière spectaculaire?" OpenCV ont essentiellement d'un processeur graphique module d'algorithmes comme Hough Transforme et qu'est-ce-pas écrit dans CUDA et exécuter sur compatible CUDA GPU. La grande chose, c'est qu'il n'est pas besoin d'apprendre tout CUDA. Il suffit d'importer le module gpu et de commencer à l'utiliser. J'espère que cette aide (il devrait théoriquement augmenter les performances d'un ordre de grandeur ou plus)
  • C'est comme une application évidente d'un réseau de neurones à convolution avec échelle/rotation d'invariance.
  • Si vous utilisez un hough-transformation, vous devez utiliser une version plus rapide de l'algorithme original. Vous pouvez modifier le hough-transformer à se concentrer uniquement sur la forte probabilité des paramètres à l'aide de méthodes comme le RANSAC.
  • Seules les informations de couleurs rouge et blanc dans le coca-cola est assez reconnaissable.
  • C'est des mains en bas de l'un des projets les plus cools que j'ai jamais vu quelqu'un prendre sur StackOverflow.
  • 1337! S'il vous plaît, personne ne upvote de nouveau à cette question
  • est-ce un coca-cola annonce?
  • Cette question devrait être fermé pour 5 ou 6 différentes raisons, pls cliquez sur le bouton "Fermer".
  • La vraie question est de savoir si la can can can-can