Je dis surement des choses fausses, si quelqu'un de mieux renseigné passe dans le coin, qu'il n’hésite pas à me corriger !
Pour détecter un objet dans un image, l'approche la plus simple et performante est de créer un modèle mathématique de l'objet et ensuite de chercher ce modèle dans l'image. Par exemple, la reconnaissance de cercle citée plus haut c'est surement fait avec une transformée de Hough. Pour appliquer cette méthode il faut que tes objets recherchés soient très ressemblant (ce qui est le cas pour un cercle, un carré, un visage...). Les pièces et surtout leurs détails qui permettrait de les différencier sont trop différents pour utiliser ce genre de méthode selon moi.
Une autre méthode simple et de faire de la comparaison "pixel à pixel" pour retrouver où l'objet recherché se trouve par rapport à une image de référence. Le problème est qu'il faut que l'objet recherché soit dans le même sens et de la même taille que l'image de référence. Tu peux toujours exécuter plein de fois la recherche en tournant et redimensionnant a chaque fois l'image de référence. Mais cela fait très vite beaucoup trop d'opérations.
La dernière méthode est de passer par des algorithmes d'apprentissage automatique, comme le deep learning. Souvent ces algos coutent chères à entrainer, mais après c'est quasiment instantané. Pour les entrainer il te faut plein d'images dans lesquelles tu connais le résultat attendu. Si tu veux que l'algo soit capable de trouver des objets tournés et redimensionnés, il faut bien sure fournir des exemples de différentes tailles et orientations.
Google Research est TRES fort la dessus. Google publie énormément de choses, cherche "google object detection" dans Google ou Google Scholar. Regarde aussi des exemples de Caffe qui semble être un framework utilisé par pas mal de papiers.
Pour te donner un peu un ordre d'idée de comment faire, je vais te décrire comment Ocropy fonctionnait (à l'époque où j'ai regardé, depuis ça a peut-être changé). Ocropy permet de transformer des scans de livre en texte (c'est de la reconnaissance de caractère).
1) l'image est d'abord nettoyée avec plusieurs algos (une qui enlève les poussières, une qui enlève les pliures, une qui transforment l'image en "noir ou blanc" de façon intelligente...)
2) l'image est tournée et découpée grace à un algo d'analyse de ligne
3) les lignes sont redimensionnées grâce à un algo de détection de taille moyenne de caractères
4) Les lignes sont injectées dans un algo de deep learning spécialisé dans la détection de caractère
L'étape 1, ce sont que des filtres d'images (comme ceux qu'il y a dans Gimp=>filtres). Les étapes 2 et 3 utilise une approche par modèle (mon premier paragraphe). Jusqu'à maintenant les images n'ont étaient que homogénéisées.
La dernière étape utilise un algo d'apprentissage automatique. Cela fonctionne extrêmement bien si l'algo de learning a appris sur des lignes de la même langue et de la même police que le texte à lire par l'algo.
Les algos de deep learning sont un peu magique (le choix des types de neurones et leurs nombres sont complètement faites au feeling) et c'est la grande critique qui leur sont faites. Mais elles peuvent donner des résultats extraordinaires!
Toutefois tu ne seras peut-être pas obligé d'aller jusque là. Si tu arrives a suffisamment homogénéiser ton entré, une simple comparaison "pixel à pixel" peut suffire. Tu auras en sortie quelque chose comme : "cette image contient 1 pièce ressemblant a 80% à 5cent italien de 2004, 75% à 5cent polonais de 2003...". Et ensuite le choix final se fait à la main.
TL;DR: Détecte les pièces avec OpenCV. Filtre tes pièces pour que quelque soit la photo les pièces aient toutes la même luminosité et couleurs. Trouve un moyen de les tourner toutes dans le même sens. Fait une copie "pixel à pixel" qui te donne une probabilité de ressemblance avec ta base de donnée de pièce. Profit.
# Un peu long
Posté par davandg (site web personnel, Mastodon) . En réponse au message reconnaissance de pièces de monnaies. Évalué à 2.
Je dis surement des choses fausses, si quelqu'un de mieux renseigné passe dans le coin, qu'il n’hésite pas à me corriger !
Pour détecter un objet dans un image, l'approche la plus simple et performante est de créer un modèle mathématique de l'objet et ensuite de chercher ce modèle dans l'image. Par exemple, la reconnaissance de cercle citée plus haut c'est surement fait avec une transformée de Hough. Pour appliquer cette méthode il faut que tes objets recherchés soient très ressemblant (ce qui est le cas pour un cercle, un carré, un visage...). Les pièces et surtout leurs détails qui permettrait de les différencier sont trop différents pour utiliser ce genre de méthode selon moi.
Une autre méthode simple et de faire de la comparaison "pixel à pixel" pour retrouver où l'objet recherché se trouve par rapport à une image de référence. Le problème est qu'il faut que l'objet recherché soit dans le même sens et de la même taille que l'image de référence. Tu peux toujours exécuter plein de fois la recherche en tournant et redimensionnant a chaque fois l'image de référence. Mais cela fait très vite beaucoup trop d'opérations.
La dernière méthode est de passer par des algorithmes d'apprentissage automatique, comme le deep learning. Souvent ces algos coutent chères à entrainer, mais après c'est quasiment instantané. Pour les entrainer il te faut plein d'images dans lesquelles tu connais le résultat attendu. Si tu veux que l'algo soit capable de trouver des objets tournés et redimensionnés, il faut bien sure fournir des exemples de différentes tailles et orientations.
Google Research est TRES fort la dessus. Google publie énormément de choses, cherche "google object detection" dans Google ou Google Scholar. Regarde aussi des exemples de Caffe qui semble être un framework utilisé par pas mal de papiers.
Pour te donner un peu un ordre d'idée de comment faire, je vais te décrire comment Ocropy fonctionnait (à l'époque où j'ai regardé, depuis ça a peut-être changé). Ocropy permet de transformer des scans de livre en texte (c'est de la reconnaissance de caractère).
1) l'image est d'abord nettoyée avec plusieurs algos (une qui enlève les poussières, une qui enlève les pliures, une qui transforment l'image en "noir ou blanc" de façon intelligente...)
2) l'image est tournée et découpée grace à un algo d'analyse de ligne
3) les lignes sont redimensionnées grâce à un algo de détection de taille moyenne de caractères
4) Les lignes sont injectées dans un algo de deep learning spécialisé dans la détection de caractère
L'étape 1, ce sont que des filtres d'images (comme ceux qu'il y a dans Gimp=>filtres). Les étapes 2 et 3 utilise une approche par modèle (mon premier paragraphe). Jusqu'à maintenant les images n'ont étaient que homogénéisées.
La dernière étape utilise un algo d'apprentissage automatique. Cela fonctionne extrêmement bien si l'algo de learning a appris sur des lignes de la même langue et de la même police que le texte à lire par l'algo.
Les algos de deep learning sont un peu magique (le choix des types de neurones et leurs nombres sont complètement faites au feeling) et c'est la grande critique qui leur sont faites. Mais elles peuvent donner des résultats extraordinaires!
Toutefois tu ne seras peut-être pas obligé d'aller jusque là. Si tu arrives a suffisamment homogénéiser ton entré, une simple comparaison "pixel à pixel" peut suffire. Tu auras en sortie quelque chose comme : "cette image contient 1 pièce ressemblant a 80% à 5cent italien de 2004, 75% à 5cent polonais de 2003...". Et ensuite le choix final se fait à la main.
TL;DR: Détecte les pièces avec OpenCV. Filtre tes pièces pour que quelque soit la photo les pièces aient toutes la même luminosité et couleurs. Trouve un moyen de les tourner toutes dans le même sens. Fait une copie "pixel à pixel" qui te donne une probabilité de ressemblance avec ta base de donnée de pièce. Profit.