Réseaux de neurones - Trouver les images les plus similaires


11

Je travaille avec Python, scikit-learn et keras. J'ai 3000 milliers d'images de montres frontales comme les suivantes: Watch_1 , Watch_2 , Watch_3 .

Je veux écrire un programme qui reçoit en entrée une photo d'une vraie montre qui peut être prise dans des conditions moins idéales que les photos ci-dessus (couleur de fond différente, éclair plus sombre, etc.) et trouver les montres les plus similaires parmi les 3000. Par similitude, je veux dire que si je donne en entrée une photo d'une montre ronde brune avec de la dentelle fine, j'attends en sortie des montres de forme ronde, de couleur sombre et avec de la dentelle fine.

Quel est l'algorithme d'apprentissage automatique le plus efficace pour ce faire?

Par exemple, en suivant ce lien, j'ai deux solutions différentes en tête:

1) Utiliser un CNN comme extracteur de caractéristiques et comparer les distances entre ces caractéristiques pour chaque paire d'images en référence à l'image d'entrée.

2) Utilisation de deux CNN dans un réseau neuronal siamois pour comparer les images.

Ces deux options sont-elles les meilleures pour cette tâche ou suggéreriez-vous autre chose?

Connaissez-vous un réseau neuronal pré-formé (avec des hyperparamètres prédéterminés) pour cette tâche?

J'ai trouvé des articles intéressants sur StackOverflow à ce sujet, mais ils sont assez anciens: Post_1 , Post_2 , Post_3 .


Bienvenue sur le site! Apprenez une intégration (je recommande un hachage binaire pour une récupération rapide de l'ordre de mille bits), puis effectuez une recherche de similarité.
Emre

C'est mon plaisir d'être ici ... haha! ... Oui, c'est une bonne idée et j'avais déjà lu cet article ...
Outcast

Réponses:


4

Je ne pense pas qu'une architecture de haut niveau en tant que telle soit la meilleure solution, mais elle dépend plutôt de nombreux facteurs et détails. D'après ce que je sais de la première approche est prometteuse, en particulier lorsqu'elle est prolongée par des étapes supplémentaires comme cela est fait dans TiefVision :

  1. Un réseau de boîtes englobantes supplémentaire est utilisé pour distinguer la partie pertinente de l'image du reste
  2. Les vecteurs de caractéristiques ne sont pas simplement comparés directement, mais plutôt utilisés pour former un réseau de comparaison à l'aide de triplets (apprentissage de la similitude sur la base de vecteurs de caractéristiques et d'exemples pour des instances plus ou moins similaires).

Ce travail est beaucoup plus récent (2016/17) que ce que vous avez publié et est livré avec un bel ensemble d'outils et plus détaillé du papier .

Pourquoi utiliser des triplets aka Deep Ranking?

Comme indiqué dans les commentaires: Pourquoi utiliser des triplets pour la similitude des images au lieu d'apprendre des vecteurs de caractéristiques et de calculer leur distance? Les triplets sont un moyen de formuler la question de la similitude comme un problème d'apprentissage au lieu d'apprendre des vecteurs de caractéristiques qui ne se soucient pas fondamentalement de la similitude. Cette approche est particulièrement logique dans les cas où la similitude perçue par l'homme est importante, ce qui peut différer de la perception de la machine.

Les triplés fonctionnent comme ceci: vous fournissez 3 images. Une image à comparer, une image similaire (proche) et une image pas si similaire (éloignée). Ce sont vos données de formation / test / validation. La formation de votre réseau sur ces échantillons et la prévision du bon ordre (classer les images similaires des images non similaires) dans l'ensemble permettent au réseau d'apprendre à commander des images en fonction de leur similitude.

Dans l'ensemble, cette approche est relativement complexe. Il est peut-être trop technique, mais vous avez également demandé la meilleure façon de le faire et le classement profond atteint des valeurs de très haute précision.


Merci pour votre réponse. Ceci est intéressant (je l'ai voté). L'idée du triplet est bonne même si je ne sais pas exactement pourquoi utiliser des triplets d'images est nécessairement mieux que d'utiliser des paires d'images pour ma tâche. Si vous le souhaitez, vous pouvez l'expliquer davantage dans votre message. Je vais également jeter un œil à TiefVision.
Diffusé le

@Universalis merci pour l'astuce (et le vote positif). J'ai mis à jour ma réponse avec plus de détails sur les triolets et le raisonnement. Le papier est également très bien écrit, alors regardez tous les détails. Cependant, il pourrait y avoir de nouvelles façons sophistiquées de le faire depuis la création de TiefVision et DeepRanking.
Gegenwind

Merci encore pour votre réponse. Oui, j'ai jeté un coup d'œil au document et il était assez clair de ce que vous avez ajouté à votre réponse. En ce sens, j'avais déjà compris ce que vous avez ajouté votre réponse et ma question était plus clairement la suivante: pourquoi ne pas utiliser 2 images (une paire) au lieu de 3 images (un triplet) pour classer les images selon leur similitude? Quel est l'avantage supplémentaire d'utiliser des triplets au lieu de paires?
Diffusé le

Hmm, j'ai peut-être mal compris votre approche. Le triplet fournit des informations comparatives selon lesquelles l'image 1 est plus proche de l'image 2 que de l'image 3. Le fait de n'avoir que 2 images et d'indiquer "ces 2 sont similaires" manque d'un facteur de comparaison "similaire en ce qui concerne" car dans cette approche, vous supposez que la distance simple du vecteur caractéristique ne vous en dit pas assez. en d'autres termes: vous apprenez la similitude par commande et vous en manquez sans avoir au moins 2 articles à commander.
Gegenwind

Merci encore pour votre réponse. Cependant, même maintenant et après avoir lu un peu plus attentivement le document, je ne comprends pas pourquoi vous avez nécessairement besoin de triplets et non de paires d'images pour cette approche non supervisée. Lorsque vous utilisez des étiquettes, il est clair qu'en utilisant des triplets, vous obtiendrez un classement de similitude complet des images que vous ne pouvez pas obtenir avec des paires. Mais dans cette (sorte) d'approche non supervisée que vous proposez alors pourquoi ne pas comparer les valeurs de la fonction de perte pour chaque paire d'images (toujours une image de la paire est l'image d'entrée) pour trouver par exemple les 5 plus similaires à la image d'entrée?
Diffusé le

2

Je choisirais un classificateur, comme VGG-16, qui fonctionne bien sur les classes imagenet. Ensuite, exécutez vos images de montre à travers elle. Bien sûr, vous pouvez vous attendre à ce que la sortie soit principalement «surveillée» avec une forte probabilité.

Cependant, vous obtenez alors des fonctionnalités supplémentaires: le niveau d'activation de toutes les autres catégories. Cela vous donne un vecteur de mille valeurs entre 0 et 1.

Vous pouvez également extraire l'activation à différents points du réseau. Ensuite, la similitude de ces activations et sorties ne devrait être similaire entre deux cas que si les images sont similaires.


Merci pour votre réponse (vote positif). Oui, je pensais à cela et dans un sens, c'est lié à la première option que j'ai fournie lors de mon post. Donc, je pensais également à utiliser d'autres détecteurs comme SURF ... Je vais voir si ceux-ci sont suffisamment efficaces ...
Outcast

2

Je me concentrerais d'abord sur l'augmentation des données. Puisque vos images ont un fond blanc, vous avez un peu plus de facilité. Transformez l'arrière-plan blanc en arrière-plan transparent, réduisez l'image, faites-la pivoter et placez-la dans des arrière-plans similaires à vos données cibles.

Faites-le plusieurs fois avec une combinaison différente et ayez une étiquette pour chaque montre. Ensuite, je vous suggère d'utiliser un réseau de neurones convolutif régulier pour la classification. Chaque étiquette aura un score, choisissez celle qui a la confiance la plus élevée et celle qui devrait être la plus similaire .

Par exemple, disons que vous exécutez le classificateur avec une image et obtenez ce résultat:

Watch1: 0.51

Watch2: 0.30

Watch3: 0.25

Le CNN dit qu'il a une confiance de 51% que Watch1 est la montre dans l'image d'entrée. Mais ce qui est vrai aussi, c'est que c'est celui qu'il pense être le plus similaire, Watch2 serait le prochain plus similaire et ainsi de suite.

Si vous n'obtenez pas de bons résultats, faites comme d'habitude. Expérimentez avec les paramètres et / ou ajoutez plus de couches. Essayez de savoir où il échoue. Une fois que vous avez cette idée, vous pouvez l'utiliser pour choisir un type de réseau convolutionnel plus spécialisé pour votre problème particulier. Rechercher cela sans savoir au préalable comment il fonctionnerait n'est pas la bonne approche. Je vous suggère de commencer avec un modèle convolutionnel de base et de travailler à partir de là.


1
Merci pour votre réponse (vote positif). Oui, j'avais déjà une augmentation de données en tête. Cependant, votre réponse n'est pas très claire. Qu'entendez-vous par «avoir une étiquette pour chaque montre»? Voulez-vous dire étiqueter chaque montre individuellement ou les étiqueter comme une paire avec une autre selon qu'elles sont similaires ou non? (Si c'est le premier, expliquez pourquoi c'est efficace s'il vous plaît)
Outcast

C'est la première suggestion, je supposais que vous aviez déjà un moyen pratique de les étiqueter tous. C'est fondamentalement la solution la plus basique, donc elle ne sera pas efficace. Ma suggestion était que le modèle de base pourrait peut-être vous donner suffisamment d'informations pour que vous puissiez poursuivre un modèle plus spécialisé. La recherche d'un classement approfondi semble très prometteuse comme l'a dit @Gegenwind. J'ai mis à jour ma réponse pour la rendre un peu plus claire.
zimio

Hm, oui maintenant, c'est plus clair ce que vous vouliez dire ... C'est certainement une bonne suggestion générale: commencez par les bases et passez pas à pas à des choses plus complexes ... Merci en tout cas ...
Diffusé le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.