1629 votes

Algorithme d'amélioration de Coca-Cola en reconnaissance de formes

L'un des plus intéressants projets sur lesquels j'ai travaillé dans les deux dernières années que j'étais encore étudiant, a été un projet final sur le traitement des images. L'objectif était de développer un système pour être en mesure de reconnaître Coca-Cola canettes (notez que j'insiste sur le mot de conserve, 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.

Template matching

Certaines contraintes sur le projet:

  • L'arrière-plan peut être très bruyant.
  • Le peuvent pourraient avoir une échelle ou de rotation ou même l'orientation (dans la limite du raisonnable)
  • L'image pourrait avoir un certain degré de fuziness (contours est peut être pas très droites)
  • Il pourrait y avoir des bouteilles de Coca-Cola dans l'image, et l'algorithme ne doit détecter le pouvez !
  • La luminosité de l'image peut varier beaucoup (si vous ne pouvez pas compter "trop" sur la couleur de détection.
  • Le peut être en partie cachés sur les côtés ou au milieu (et peut-être en partie caché derrière la bouteille !)
  • Il n'y aurait pas de conserve à 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):

Total fail

Maintenant que j'ai fait ce projet, évidemment, comme il l'était 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 la bibliothèque OpenCV.

Pré-traitement: en ce qui Concerne le traitement d'images, je veux dire comment la transformer en une 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 à HSV (Teinte Saturation Valeur) et le filtrage basé 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). Binarized image
  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 pour obtenir les contours de tous les éléments après 2 précédent étapes. Contour detection

Algorithme: L'algorithme lui-même que j'ai choisi pour cette tâche a été prise à partir de ce (magnifique) livre 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 l'échelle et la rotation, il va tester votre image pour chaque combinaison de facteur d'échelle et le facteur de rotation.
  • 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 ci-dessous.

GHT

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, obvisouly 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.
  • L'Invariance 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 de l'algorithme, en utilisant exclusivement OpenCV fonctions, à résoudre les quatre questions mentionné?

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 devraient apprendre :)

661voto

stacker Points 34209

Une approche alternative serait d'extraire des caractéristiques (keypoints) à l'aide de la scale-invariant feature transform (EIPD) ou d'accélérer les Fonctionnalités Robustes (SURF).

Il est mis en œuvre dans OpenCV 2.3.1.

Vous pouvez trouver un bel exemple de code à l'aide de fonctionnalités dans Features2D + Homographie pour trouver un objet connu

Les deux algorithmes sont invariantes d'échelle et de rotation. Depuis ils travaillent avec des fonctionnalités, vous pouvez également gérer l'occlusion (aussi longtemps que suffisamment de keypoints sont visibles).

Enter image description here

Source de l'Image: exemple de tutoriel

Le traitement ne prend que quelques centaines de ms pour SIFT, SURF est un peu plus rapide, mais il ne convient pas pour les applications en temps réel. ORBE utilise RAPIDE qui est plus faible concernant la rotation de l'invariance.

L'origine des documents

375voto

kmote Points 3948

Pour accélérer les choses, je voudrais profiter du fait que vous n'êtes pas invité à trouver une image arbitraire/objet, mais en particulier d'un avec le logo de Coca-Cola. Ceci est important parce que ce logo est très distinctif, et il devrait avoir un caractère, scale-invariant de signature dans le domaine des fréquences, en particulier dans le canal rouge de RVB. C'est-à-dire l'alternance de rouge-blanc-rouge rencontrées par une horizontale de la ligne de balayage (formé sur une alignés horizontalement logo) ont un caractère distinctif "rythme" qui passe par l'axe central du logo. À ce rythme, va "accélérer" ou "ralentir" à différentes échelles et des orientations, mais restent proportionnellement équivalent. Vous pourriez identifier/définir quelques dizaines de ces lignes, à la fois horizontalement et verticalement à travers le logo, et plusieurs autres en diagonale, dans un starburst modèle. Les appeler les "signature lignes de balayage."

Signature scan line

La recherche de cette signature dans l'image cible est une simple question de la numérisation de l'image en bandes horizontales. Pour un Look à haute fréquence dans le rouge-canal (en indiquant le déplacement d'une région rouge blanc), et une fois trouvé, voir si elle est suivie d'une autre de la fréquence des rythmes identifiés dans la session de formation. Une fois qu'une correspondance est trouvée, vous saurez instantanément le scan-line de l'orientation et la position du logo (si vous gardez une trace de ces choses au cours de la formation), afin d'identifier les limites du logo à partir de là, est trivial.

Je serais surpris si ce n'était pas une façon linéaire-algorithme efficace, ou presque. Il n'est évidemment pas l'adresse de votre peut-bouteille de discrimination, mais au moins vous aurez votre logos.

(Mise à jour: pour bouteille de reconnaissance que j'allais le chercher pour le coke (le liquide brun) à côté du logo -- qui est, à l'intérieur de la bouteille. Ou, dans le cas d'une bouteille vide, je regarde pour une pac qui a toujours la même forme, la taille et la distance entre le logo et sera généralement, tout de blanc ou de rouge. Recherche pour un solide de couleur des vélos forme où ce plafond devrait être, par rapport à la logo. Pas infaillible bien sûr, mais votre objectif doit être de trouver les faciles ceux rapide.)

(Il a été quelques années depuis que mon image jours de traitement, j'ai donc gardé cette suggestion de haut niveau et conceptuel. Je pense qu'il pourrait légèrement approximative de la façon dont l'œil humain peut fonctionner -- ou au moins comment mon cerveau!)

159voto

Darren Cook Points 5743

Problème amusant: quand j'ai jeté un coup d'oeil à votre image de bouteille je pensais que c'était un peut trop. Mais, en tant qu'humain, ce que j'ai fait pour faire la différence, c'est que j'ai alors remarqué qu'il était aussi une bouteille...

Donc, pour dire les canettes et les bouteilles en outre, que diriez-vous simplement de numérisation pour les bouteilles en premier? Si vous en trouvez un, le masque de l'étiquette avant de chercher des canettes.

Pas trop difficile à mettre en œuvre si vous êtes déjà en train de le des boîtes. Le véritable inconvénient est qu'il double votre temps de traitement. (Mais penser à l'avenir à des applications du monde réel, vous allez finir par vouloir faire des bouteilles de toute façon ;-)

128voto

Abid Rahman K Points 18045

N'est-il pas difficile, même pour l'homme de distinguer entre une bouteille et un peut dans la deuxième image (à condition que la transparence de la région de la bouteille qui est caché)?

Ils sont presque les mêmes, sauf pour une très petite région (c'est la largeur en haut de la boîte est un peu petite, tandis que l'emballage de la bouteille est de la même largeur partout, mais un changement mineur à droite?).

La première chose qui vient à l'esprit est de vérifier pour le rouge, le dessus de la bouteille. Mais c'est toujours un problème, si ce n'est pas top pour la bouteille, ou si elle est partiellement caché (comme mentionné ci-dessus).

La deuxième chose que je pensais à propos de la transparence de la bouteille. OpenCV a quelques travaux sur la recherche de la transparence des objets dans une image. Vérifiez les liens ci-dessous.

En particulier de regarder cela de voir avec quelle précision ils détectent verre:

Voir leur execution résultat:

Enter image description here

Ils disent que c'est la mise en œuvre de la feuille de papier "A Geodesic Active Contour Framework for Finding Glass" by K. McHenry and J. Ponce, CVPR 2006.. (Télécharger le document).

Il pourrait être utile dans votre cas, un peu, mais le problème se pose de nouveau si la bouteille est remplie.

Donc, je pense qu'ici, vous pouvez rechercher le corps transparent de l'bouteilles de première ou pour une région rouge connecté à deux objets transparents latéralement ce qui est évidemment la bouteille. (Lorsque l'on travaille dans l'idéal, une image comme suit.)

Enter image description here

Maintenant, vous pouvez supprimer le jaune de sa région, l'étiquette de la bouteille et exécuter un algorithme pour trouver le pouvez.

De toute façon, cette solution a aussi des problèmes différents, comme dans les autres solutions.

  1. Il ne fonctionne que si votre bouteille est vide. Dans ce cas, vous devrez rechercher la zone rouge entre les deux couleurs noir (si le Coca Cola le liquide est noir).
  2. Un autre problème, si transparente partie est couverte.

Mais de toute façon, si il y a aucun des problèmes ci-dessus dans les images, ce qui semble être une meilleure manière.

51voto

MrGomez Points 20526

J'aime vraiment Darren Cook et bac de réception des réponses à ce problème. J'étais au milieu de jeter mes pensées dans un commentaire sur ceux-ci, mais je crois que mon approche est trop réponse en forme pour ne pas quitter ici.

En résumé, vous avez identifié un algorithme pour déterminer qu'un logo de Coca-Cola est présent à un endroit particulier dans l'espace. Vous êtes maintenant en essayant de déterminer, pour arbitraire des orientations et de l'arbitraire des facteurs d'échelle, une heuristique adaptée pour distinguer Coca-Cola canettes à partir d'autres objets, y compris: des bouteilles, des panneaux d'affichage, publicités, et Coca-Cola de l'attirail de tous les associés avec ce logo emblématique. Vous n'appelez pas la plupart de ces cas supplémentaires dans votre énoncé du problème, mais j'ai l'impression qu'ils sont essentiels à la réussite de votre algorithme.

Le secret ici est de déterminer quelles caractéristiques visuelles de l'un peut contient ou, par l'intermédiaire de l'espace négatif, quelles fonctionnalités sont présentes pour d'autres Coke de produits qui ne sont pas présents pour les boîtes de conserve. À cette fin, l'actuel haut de réponse esquisse une approche de base pour la sélection "peut" si et seulement si "bouteille" n'est pas identifié, soit par la présence d'un bouchon de la bouteille, de liquide ou autre visuel similaire heuristiques.

Le problème, c'est ce qu'il se décompose. Une bouteille peut, par exemple, être vide et l'absence, la présence d'un bouchon, menant à un faux positif. Ou, il pourrait être partielle d'une bouteille avec des fonctionnalités supplémentaires mutilé, conduisant de nouveau à la détection de faux. Inutile de dire que ce n'est pas élégant, ni est-il efficace pour nos fins.

À cette fin, la plus correcte des critères de sélection pour les boîtes semblent être les suivantes:

  • Est la forme de l'objet silhouette, que vous avez esquissé dans votre question, c'est exact? Si oui, +1.
  • Si nous supposons que la présence de la lumière naturelle ou artificielle, ne nous détectons un chrome contour de la bouteille qui signifie que si cela est fait d'aluminium? Si oui, +1.
  • Pouvons-nous déterminer que le spéculaire propriétés de l'objet sont corrects par rapport à nos sources de lumière (vidéo illustrative lien sur la source de lumière de détection)? Si oui, +1.
  • On peut déterminer toutes les autres propriétés de l'objet qui l'identifient comme un peut, y compris, mais non limité à, la topologie et l'inclinaison de l'image du logo, de l'orientation de l'objet, la juxtaposition de l'objet (par exemple, sur une surface plane comme une table ou dans le contexte d'autres boîtes de conserve), et la présence d'une languette? Si oui, pour chaque, +1.

Votre classification peut alors ressembler à la suivante:

  • Pour chaque candidat match, si la présence d'un Coca Cola logo a été détecté, dessiner une bordure grise.
  • Pour chaque match de plus de +2, dessiner une bordure rouge.

Cela visuellement les points saillants de l'utilisateur ce qui a été détecté, en soulignant la faiblesse positifs qui peuvent, à juste titre, être détecté comme mutilé canettes.

La détection de chaque propriété porte très différents temps et de l'espace de la complexité, et pour chaque approche, un passage rapide par le biais de http://dsp.stackexchange.com est plus que raisonnable pour déterminer la manière la plus correcte et la plus efficace de l'algorithme en fonction de vos objectifs. Mon intention est ici, purement et simplement, pour souligner l'importance de la détection, si quelque chose est un peut en invalidant une petite partie des candidats de la détection de l'espace n'est pas le plus solide ou efficace solution à ce problème, et, idéalement, vous devriez prendre les mesures appropriées en conséquence.

Et hey, bravo pour le Hacker News à poster! Sur l'ensemble, c'est assez terrible question digne de la publicité qu'elle a reçu. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X