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.
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):
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:
- 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.
- 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.
- À 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.
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:
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
Vous devez vous connecter pour publier un commentaire.
Une approche alternative serait d'extraire des caractéristiques (keypoints) à l'aide de la scale-invariant feature transform (EIPD) ou 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).
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
à partir de l'Échelle de l'Invariant de Keypoints
minHessian
paramètre (Étape 1).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) aura 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."
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 -- c'est, à l'intérieur de la bouteille. Ou, dans le cas d'une bouteille vide, je chercherais une cap 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ù un cap devrait être, par rapport à la logo. Pas infaillible bien sûr, mais votre objectif doit être de trouver le facile 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 n'!)
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 😉
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.
OpenCV Notes De Réunion Minutes 2012-03-19
OpenCV Notes De Réunion Minutes 2012-02-28
Particulièrement de regarder cela de voir avec quelle précision ils détectent verre:
Voir leur mise en œuvre résultat:
Ils disent que c'est la mise en œuvre de la feuille de papier "Une Géodésique de contours Actifs-Cadre pour la recherche de Verre" par K. McHenry et J. Ponce, CVPR 2006.
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.)
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.
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.
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 boîtes à partir d'autres objets, y compris de: bouteilles, panneaux d'affichage, annonces, et Coca-Cola attirail toutes associées à 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 d'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 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:
Votre classement pourrait alors ressembler à la suivante:
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 à travers 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 que détecter 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. 🙂
En regardant la forme
Prendre un coup d'œil à la forme de la partie rouge de la boîte/bouteille. Remarquez comment le peut s'estompe légèrement au très haut alors que l'étiquette de la bouteille est de droite. Vous pouvez faire la distinction entre ces deux par la comparaison de la largeur de la portion rouge à travers la longueur de celui-ci.
De regarder les faits saillants
Une façon de distinguer entre les bouteilles et les canettes qui est le matériau. Une bouteille est en plastique, alors qu'une boîte est faite de métal d'aluminium. Suffisamment bien éclairé situations, en regardant la spécularité serait une façon de raconter une étiquette de bouteille à partir d'une étiquette.
Aussi loin que je peux dire, c'est comment un homme devrait faire la différence entre les deux types d'étiquettes. Si les conditions d'éclairage sont mauvaises, il est lié à une certaine incertitude dans la distinction entre les deux de toute façon. Dans ce cas, vous devez être en mesure de détecter la présence de l'transparent/translucide bouteille elle-même.
Veuillez jeter un oeil à Zdenek Kalal de Predator tracker. Il exige une certaine formation, mais il peut activement apprendre comment l'objet suivi s'intéresse aux différentes orientations et d'écailles, et il le fait en temps réel!
Le code source est disponible sur son site. C'est dans MATLAB, mais peut-être il est une implémentation de Java est déjà fait par un membre de la communauté. J'ai réussi à re-mise en œuvre le suivi de la partie de TLD en C#. Si je me souviens bien, TLD est à l'aide de Fougères comme le point-clé du détecteur. J'utilise soit de SURF ou de TAMISER la place (déjà suggéré par @bac de réception) pour acquérir l'objet, si elle a été perdue par le tracker. Le suivi des commentaires de la rend facile à construire avec le temps une liste dynamique de sift/surf modèles de avec le temps de permettre à réacquérir l'objet avec une très grande précision.
Si vous êtes intéressés par mon C# de la mise en œuvre du dispositif de suivi, n'hésitez pas à demander.
Si vous n'êtes pas limité à un appareil photo qui n'était pas dans un de vos contraintes peut-être que vous pouvez déplacer à l'aide d'un capteur gamme comme la Xbox Kinect. Avec cela, vous pouvez effectuer la profondeur et de la couleur appariés en fonction de la segmentation de l'image. Cela permet d'accélérer la séparation des objets dans l'image. Vous pouvez ensuite utiliser ICP correspondance ou des techniques similaires à même de correspondre à la forme de la boîte, plutôt que de simplement son contour ou de la couleur, et étant donné qu'il est de forme cylindrique cela peut être une option valable pour n'importe quelle orientation si vous avez un scan 3D de la cible. Ces techniques sont souvent assez rapide surtout quand il est utilisé pour un but spécifique qui devrait résoudre votre problème de vitesse.
Aussi, je pourrais suggérer, pas nécessairement pour plus de précision ou la vitesse, mais pour le plaisir, vous pourriez utiliser un réseau neuronal formé sur votre teinte image segmentée pour identifier la forme de la boîte. Ces sont très rapides et peuvent souvent être jusqu'à 80/90% de précision. La formation serait un peu d'un long processus, même si, comme vous le feriez manuellement identifier le pouvez dans chaque image.
Je voudrais détecter les rectangles rouges: RGB -> HSV, filtre rouge -> image binaire, fermer (dilater puis éroder, connu comme
imclose
dans matlab)Puis regarder à travers des rectangles de la plus grande à la plus petite. Les Rectangles qui ont de plus petits rectangles dans une position connue/mise à l'échelle peut à la fois être éliminées (en supposant que la bouteille proportions sont constantes, le plus petit rectangle serait un bouchon de bouteille).
Ce serait de vous laisser avec des rectangles rouges, alors vous aurez besoin de quelque façon détecter les logos pour savoir si elles sont un rectangle rouge ou une canette de coca. Comme le ROC, mais avec un logo?
C'est peut-être une idée naïve (ou peut ne pas fonctionner du tout), mais les dimensions de toutes les canettes de coke sont fixes. Donc peut-être si la même image contient à la fois une boîte et une bouteille, alors vous peut les distinguer par des considérations relatives à la taille (les bouteilles vont être de plus). Maintenant, à cause de manque de profondeur (c'est à dire de cartographie 3D de cartographie 2D) il est possible qu'une bouteille peut apparaître rétréci et il n'y a pas une différence de taille. Vous pouvez récupérer de l'information de profondeur à l'aide de image stéréo et ensuite récupérer la taille d'origine.
Hmm, en fait, je pense que je suis sur la quelque chose (c'est comme la question la plus intéressante jamais - de sorte qu'il serait dommage de ne pas continuer à essayer de trouver la réponse "parfaite", même si une solution acceptable a été trouvé)...
Une fois que vous trouvez le logo, vos ennuis sont à moitié fait. Vous n'avez plus qu'à comprendre les différences entre ce qui est autour de le logo. En outre, nous voulons faire le moins possible. Je pense que c'est effectivement cette partie facile...
Ce est autour du logo? Pour une boîte, nous pouvons voir en métal, qui, malgré les effets de l'éclairage, ne change pas que ce soit dans sa couleur de base. Aussi longtemps que nous savons de l'angle de l'étiquette, nous pouvons dire ce qui est directement au-dessus d'elle, donc nous sommes à la recherche à la différence entre ces:
Ici, ce qui est au dessus et en dessous du logo est complètement sombre, uniforme en couleur. Relativement facile à cet égard.
Ici, ce qui est au dessus et en dessous c'est de la lumière, mais toujours conforme à la couleur. C'est tout d'argent, et de tout-métal argenté semble en fait assez rares, ainsi que de l'argent couleurs en général. En outre, c'est dans une mince couche de glisser et assez près de la rouge qui a déjà été identifiés à ce que vous pouvait suivre la trace de sa forme sur toute sa longueur pour calculer un pourcentage de ce qui peut être considéré comme l'anneau de métal de la boîte. Vraiment, vous avez seulement besoin d'une petite fraction de ce que n'importe où le long de la peut dire qu'il en fait partie, mais vous avez encore besoin de trouver un équilibre qui assure ce n'est pas seulement une bouteille vide avec quelque chose de métallique derrière elle.
Et enfin, la question délicate. Mais pas si difficile, une fois que nous allons seulement par ce que l'on peut voir directement au-dessus (et ci-dessous), le rouge de la cape. Son transparent, ce qui signifie qu'il va montrer tout ce qui est derrière elle. C'est bien, parce que les choses qui sont derrière ne sont pas susceptibles d'être uniformes en couleurs comme l'argent métal circulaire de la can. Il pourrait y avoir beaucoup de différentes choses qui sont derrière, qui nous aurait dit que c'est un vide (ou rempli de liquide clair) bouteille, ou d'une couleur uniforme, ce qui peut signifier soit que c'est rempli de liquide ou que la bouteille est tout simplement en face d'un solide de couleur. Nous travaillons avec ce qui est le plus proche du haut et du bas, et les chances de la bonne couleur au bon endroit sont relativement minces. Nous savons que c'est une bouteille, parce qu'il n'a pas obtenu que la clé élément visuel de la boîte, ce qui est relativement simpliste par rapport à ce qui pourrait être derrière une bouteille.
(ce dernier était le meilleur que j'ai pu trouver un grand vide coca cola bouteille il est intéressant de noter la pac ET l'anneau jaune, indiquant que la rougeur de la pac ne devrait probablement pas être invoqué)
Dans les rares cas où une teinte similaire de l'argent est derrière la bouteille, même après l'abstraction de la matière plastique, ou de la bouteille est en quelque sorte rempli avec la même nuance de l'argent liquide, on peut se rabattre sur ce que l'on peut estimer comme étant la forme de l'argent - qui, comme je l'ai mentionné, est circulaire et suit la forme de la boîte. Mais même si je manque de certaines connaissances en traitement d'image, que les sons lents. Mieux encore, pourquoi ne pas en déduire ce par pour une fois, de contrôle autour de la côtés du logo pour s'assurer qu'il n'en est rien, de la même couleur argent là-bas? Ah, mais si, il y a la même nuance de l'argent derrière un peut? Ensuite, nous avons en effet de payer plus d'attention à des formes, en regardant en haut et en bas de la peut de nouveau.
Selon la façon impeccable tout cela doit être, il peut être très lente, mais je pense que mon idée de base est de vérifier la méthode la plus simple et la plus proche des choses d'abord. Aller par les différences de couleur autour de la déjà appariés forme (ce qui semble le plus trivial partie de ce tout de même) avant d'aller à l'effort de travailler la forme des autres éléments. À la liste, il va:
Dans le cas où vous ne pouvez pas le faire, cela signifie probablement que le haut et le bas de la boîte sont couverts, et la seule choses qu'un humain pourrait avoir utilisé fiable de faire une distinction entre la boîte et le flacon est de l'occlusion et de la réflexion de la can, qui serait un beaucoup plus fort de la bataille de processus. Cependant, pour aller encore plus loin, vous pouvez suivre l'angle de la canette/bouteille de vérifier pour plus de bouteille, comme les traits, à l'aide de la semi-transparent la numérisation des techniques mentionnées dans les autres réponses.
Supplémentaire intéressante cauchemars peuvent inclure un peut commodément assis derrière la bouteille à une telle distance que le métal, il se trouve juste à montrer au-dessus et au-dessous de l'étiquette, toujours l'échec aussi longtemps que vous êtes balayage le long de toute la longueur de l'étiquette rouge - qui est en fait plus un problème parce que vous n'êtes pas détecter un peut où vous, plutôt que de considérer ce que vous êtes réellement la détection d'une bouteille, y compris le peut par accident. Le verre est à moitié vide, dans ce cas!
Comme un avertissement, je n'ai aucune expérience ni n'ont jamais pensé au sujet de traitement de l'image en dehors de cette question, mais il est tellement intéressant que ça m'a fait penser assez profondément à ce sujet, et après avoir lu toutes les autres réponses, je considère que cela peut-être le plus facile et le moyen le plus efficace pour y arriver. Personnellement, je suis simplement heureux que je n'ai pas fait avoir à penser à la programmation de cette!
MODIFIER
En outre, regardez ce dessin je l'ai fait dans MS Paint... C'est absolument horrible et très incomplète, mais en fonction de la forme et de couleurs, vous pouvez deviner ce qu'il va probablement être. En essence, ce sont les seules choses que l'on doit à peine de numérisation pour. Quand vous regardez très distinctif, la forme et la combinaison de couleurs de manière à fermer, quoi d'autre pourrait-ce être? Le bits, je n'ai pas de peinture, fond blanc, devrait être considérée comme "quoi que ce soit incompatible". Si elle avait un fond transparent, il pourrait aller sur presque n'importe quelle autre image, et vous pouvez encore le voir.
Je ne suis pas au courant de OpenCV mais en regardant le problème, logiquement, je pense qu'on pourrait différencier entre une bouteille et par la modification de l'image que vous cherchez à savoir Coca-Cola. Vous devriez incorporer jusqu'à la partie supérieure de peut comme dans le cas de la can, il est la doublure d'argent au-dessus de coca cola, et dans le cas de la bouteille, il n'y aura pas l'argent comme doublure.
Mais, évidemment, cet algorithme échoue dans le cas où le haut de la boîte est caché, mais dans ce cas, même l'homme ne sera pas en mesure de différencier entre les deux (si seulement coca-cola partie de bouteille/est visible)
J'aime le défi et a voulu donner une réponse, ce qui résout le problème, je pense.
De détection de la pac est un autre problème. Il peut être soit simples ou compliquées. Si j'étais vous, je voudrais simplement vérifier la couleur de l'histogramme dans le retour sur investissement pour une simple décision.
S'il vous plaît, donner de la rétroaction si je me trompe. Merci.
Il y a un tas de couleur descripteurs utilisés pour reconnaître des objets, le document ci-dessous compare beaucoup d'entre eux. Ils sont spécialement puissant lorsqu'il est combiné avec EIPD ou de SURF. SURFER ou une EIPD ne sont pas très utiles dans un coca-cola en image, parce qu'elles ne reconnaissent pas beaucoup de points d'intérêt, vous avez besoin de la couleur de l'information pour les aider. J'utilise le code BIC (Frontière ou à l'Intérieur Classification des Pixels) avec les VAGUES dans un projet et il a travaillé beaucoup pour reconnaître les objets.
Couleur descripteurs pour le Web de recherche d'images: une étude comparative
Suis quelques années de retard pour répondre à cette question. Avec l'état de l'art poussé à ses limites par CNNs dans les 5 dernières années, je ne voudrais pas utiliser OpenCV pour effectuer cette tâche maintenant! (Je sais que vous spécifiquement voulu OpenCv fonctionnalités dans la question) j'ai l'impression de l'objet algorithmes de détection tel que plus Rapide-RCNNs, YOLO, SSD, etc. as ce problème avec une marge importante par rapport à OpenCV fonctionnalités. Si je ont été de s'attaquer à ce problème maintenant (au bout de 6 ans !!) Je serais certainement utiliser plus Vite-RCNN.
J'aime votre question, peu importe si c'est hors sujet ou pas 😛
Un aparté intéressant; je viens de terminer un sujet dans mes études où nous avons couvert de la robotique et de la vision par ordinateur. Notre projet pour le semestre a été incroyablement similaire à celle que vous décrivez.
Nous avons dû développer un robot qui a utilisé une Xbox Kinect pour détecter les bouteilles de coke et de boîtes de conserve sur n'importe quelle orientation dans une variété de l'éclairage et des conditions environnementales. Notre solution consiste à utiliser un filtre passe-bande sur le canal Hue en combinaison avec la hough cercle transformer. Nous avons été en mesure de limiter l'environnement un peu (on peut choisir où et comment positionner le robot et le capteur Kinect), sinon, nous allions utiliser l'EIPD ou de SURF transforme.
Vous pouvez lire à propos de notre approche sur mon blog sur le thème 🙂
Vous avez besoin d'un programme qui apprend et améliore la précision de la classification organique à partir de l'expérience.
Je vais suggérer l'apprentissage en profondeur, avec l'apprentissage en profondeur, cela devient un problème trivial.
Vous pouvez recycler la création v3 modèle sur Tensorflow:
Comment Recycler les Débuts de la Couche Finale pour de Nouvelles Catégories.
Dans ce cas, vous serez la formation d'un réseau de neurones à convolution pour classer un objet comme coca-cola ou pas.
L'Apprentissage En Profondeur
Recueillir au moins quelques centaines d'images contenant du cola canettes, d'annoter la boîte englobante autour d'eux comme positif classes, comprennent des bouteilles de cola et d'autres produits cola étiquette négatifs classes ainsi que des objets aléatoires.
À moins que vous collectez d'un très vaste ensemble de données, d'effectuer le tour de l'utilisation de l'apprentissage en profondeur de fonctionnalités pour les petites dataset. Idéalement à l'aide d'une combinaison de Machines à Vecteurs de Support(SVM) avec une profonde réseaux de neurones.
Une fois que vous nourrissez les images déjà formés à l'apprentissage en profondeur du modèle(par exemple, GoogleNet) au lieu d'utiliser un réseau de neurones de la décision (finale) de la couche à faire des classifications, utilisez couche précédente(s) les données de caractéristiques de former votre classificateur.
OpenCV et Google Net:
http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html
OpenCV et SVM:
http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
Comme alternative à toutes ces belles solutions, vous pouvez former votre propre classificateur et de faire votre demande robuste aux erreurs. À titre d'exemple, vous pouvez utiliser Haar Formation, en fournissant un bon nombre d'images positives et négatives de votre cible.
Il peut être utile d'extraire uniquement les boîtes de conserve et peut être combiné avec la détection d'objets transparents.
Il y a une vision par ordinateur paquet appelé HALCON de MVTec dont les démos pourrait vous donner un bon algorithme d'idées. Il y a beaucoup d'exemples similaires à votre problème que vous pourriez exécuter en mode démo et puis regarder les opérateurs dans le code et de voir comment les mettre en œuvre à partir existant OpenCV opérateurs.
J'ai utilisé ce package pour prototyper rapidement des algorithmes complexes pour ce type de problèmes, et ensuite trouver comment les mettre en œuvre en utilisant les fonctions OpenCV. En particulier, pour votre cas vous pouvez essayer de le mettre en œuvre dans OpenCV les fonctionnalités intégrées à l'opérateur find_scaled_shape_model. Certains opérateurs de l'article scientifique concernant l'implémentation de l'algorithme qui peut vous aider à trouver comment faire quelque chose de similaire dans OpenCV. Espérons que cela aide...
Si vous êtes intéressé à être en temps réel, alors ce que vous avez besoin est d'ajouter dans un pré-filtre de traitement afin de déterminer ce qui est numérisé avec les poids-lourds de trucs. Un bon vite, très en temps réel, pré-filtre de traitement qui vous permettent de numériser des choses qui sont plus susceptibles d'être un coca-cola que de ne pas, avant de passer plus terrible des choses est quelque chose comme ceci: la recherche de l'image par le plus grand des taches de couleur qui sont d'une certaine tolérance à l'écart de la
sqrt(pow(red,2) + pow(blue,2) + pow(green,2))
de votre coca-cola. Commencer avec un très stricte tolérance d'écart de couleur, et de travailler votre chemin jusqu'à la plus légère de la couleur des tolérances. Puis, lorsque votre robot est à court d'un temps imparti pour traiter l'image en cours, il utilise actuellement trouvé des bouteilles à vos fins. Veuillez noter que vous devrez régler les couleurs RVB dans lesqrt(pow(red,2) + pow(blue,2) + pow(green,2))
pour les obtenir juste à droite.Aussi, c'est gona semble vraiment stupide, mais avez-vous veillez à activer
-oFast
les optimisations du compilateur lors de la compilation de votre code C?Premières choses que je regarde pour une couleur comme le ROUGE , quand on fait des yeux Rouges, détection dans l'image, il ya une certaine gamme de couleurs pour détecter certaines caractéristiques à ce sujet compte tenu de la zone environnante, et comme la distance de l'autre oeil si c'est bien visible dans l'image.
1: la caractéristique Première est de couleur Rouge et est très dominante. Après la détection de la Coca-Cola en Rouge il y a plusieurs points d'intérêt
1A: Quelle est la taille de cette zone rouge (est-il en quantité suffisante pour faire une détermination de la valeur vraie ou pas - de 10 pixels est sans doute pas assez),
1B: contient-il la couleur de l'Étiquette de "Coca-Cola" ou vague.
1B1: Est-il suffisant pour envisager une forte probabilité que c'est un label.
Élément 1 est une sorte de coupe courte - pré-processus doe morve existent dans l'image - se déplacer sur.
Donc, si c'est le cas je peux alors utiliser le segment de mon image et de commencer à chercher plus de zoom de la zone en question un peu - en fait de regarder de la région /bords...
2: compte tenu de l'image ci-dessus de la zone ID de d 1 - vérifier les environs de points [bords] de l'élément en question.
A: c'Est là ce qui semble être un peut en haut ou en bas - silver?
B: Une bouteille peut sembler transparent , mais alors peut-être une table en verre - donc, il y a un verre de table/étagère ou une zone transparente - si donc il y a de multiples possibilités de sort. Une Bouteille PEUT avoir un bonnet rouge, il ne pourrait pas, mais il doit avoir soit la forme de la bouteille haut /filetage des vis, ou d'un cap.
C: Même si cela échoue A et B, il peut encore être un peut - partielle..
C'est plus complexe lorsqu'elle est partielle, car une partielle bouteille /partielle peut le même aspect , de sorte que certains de traitement de données de mesure de la zone Rouge bord à bord.. petite bouteille peut être de taille similaire ..
3: Après l'analyse ci-dessus que c'est quand je regarde le lettrage et le logo wave - parce que je peux orienter mes recherche pour certains des lettres dans les mots Que vous pourriez ne pas avoir tout le texte en raison de ne pas avoir tous le peut, l'onde s'aligner sur certains points du texte (sage distance) afin que je puisse la recherche pour que la probabilité et de savoir où les lettres doivent exister à ce point de l'onde à une distance x.
Peut être trop d'années de retard, mais néanmoins une théorie de l'essayer.
Le ratio du rectangle de délimitation de rouge logo de la région à l'ensemble de la dimension de la bouteille/est différent. Dans le cas de la can, devrait être de 1:1, alors que sera différente de celle de la bouteille (avec ou sans cap).
Cela devrait rendre facile de distinguer entre les deux.
Mise à jour:
La courbure horizontale du logo de la région sera différente entre la can et la Bouteille en raison de leur taille respective différence. Cela pourrait être particulièrement utile si votre robot a besoin de récupérer la bouteille, et vous décidez de la poignée en conséquence.