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 .
la source
Réponses:
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 :
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.
la source
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.
la source
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:
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à.
la source