Comme nous l'avons examiné dans notre dernier article Certaines des caractéristiques clés d'un système de gestion de données efficace sont l'exploration et le filtrage des données. Nous le défendons depuis longtemps, mais nous n’avons jamais eu le temps d’ajouter cette fonctionnalité à notre plateforme. Ces temps sont révolus !
Dans cet article, nous vous expliquerons le concept général de l'intégration d'images et comment nous avons implémenté notre fonction de recherche visuelle évolutive pour trouver des images similaires parmi des millions d'images pour plusieurs clients en même temps.
Qu'est-ce qu'un embedding ?
Les intégrations sont un moyen de mapper des variables discrètes à des nombres continus. Dans le contexte des réseaux de neurones, les plongements sont des représentations vectorielles de faible dimension de variables catégorielles.
Les intégrations de réseaux neuronaux permettent des voisins proches dans l'espace et peuvent être utilisées pour faire des recommandations basées sur les intérêts des utilisateurs, les catégories de clusters ou les entrées dans des modèles d'apprentissage automatique pour les tâches supervisées qui nécessitent des vecteurs en entrée, comme les tâches de classification qui utilisent des étiquettes apprises à partir de données étiquetées. (comme la détection du spam).
La visualisation intégrée est utile car elle permet aux utilisateurs de voir les concepts et les relations entre les différentes catégories au sein d'un ensemble de données donné, plus clairement que les méthodes traditionnelles, en réduisant la dimensionnalité sans perdre d'informations sur ce qui est représenté.
Ici, notre objectif est d'exploiter les intégrations pour identifier rapidement les similitudes dans les images (sans informations a priori sur les caractéristiques de similarité).
Comment générer des images Embeddings ?
Transformation Based Descriptors
Vous disposez de plusieurs stratégies pour générer vos intégrations d’images. Le tout est de sélectionner un ensemble de fonctionnalités qui représenteront vos images de la meilleure façon possible. Pour ce faire, vous pouvez utiliser certains descripteurs classiques comme SIFT (Scale-Invariant Feature Transform) ou SURF (Speeded Up Robust Features). Ces approches se concentrent sur l'identification et la mise en correspondance des points d'intérêt, ce qui constitue un excellent moyen de trouver des objets similaires dans une image et dans des positions différentes.
Ici est une bonne introduction au SURF !
Pour les générer, vous pouvez utiliser OpenCV. Ici est un lien vers un tutoriel OpenCV sur le calcul SURF.
Veuillez noter que les algorithmes SURF et SIFT sont brevetés et ne peuvent pas être utilisés commercialement. Une excellente alternative peut être ORB (Oriented FAST and Rotated BRIEF).
Descripteurs basés sur les réseaux de convolution
Comme nous l'avons vu, les descripteurs classiques sont parfaits pour identifier tout type de transformation et faire correspondre deux images qui se ressemblent beaucoup. Mais si vous souhaitez créer une recherche de similarité plus symbolique, vous aurez besoin d’une autre méthode.
C'est pourquoi les réseaux de neurones convolutifs sont si puissants. Au cours des dix dernières années, les modèles d’apprentissage profond ont atteint des niveaux de précision très élevés pour classer les images. Ces ConvNets d'apprentissage en profondeur peuvent être utilisés pour extraire des fonctionnalités d'images invariantes ; non seulement lorsqu'il s'agit de transformation géométrique, mais aussi dans l'instance elle-même ! Qu'est-ce que cela signifie ? Deux images de la même catégorie auront la même représentation.
Le but est d'utiliser le vecteur de fonctionnalités généré par l'extracteur de fonctionnalités ConvNet, pour construire un espace vectoriel correspondant à toutes les images de votre ensemble.
Il existe tellement de modèles ConvNet qu’il est devenu complexe de décider lequel utiliser. Lors de la création d’une fonctionnalité de recherche visuelle évolutive, vous devrez générer diverses intégrations au fil du temps pour l’ensemble de votre datalake. C’est donc une bonne idée de trouver un bon compromis entre la taille du modèle, le temps d’inférence et la précision.
Les dernières architectures EfficientNet publiées par l'équipe Google sont un excellent choix puisque le nombre de paramètres (donc la taille et le temps d'inférence) du modèle est nettement inférieur à celui de ResNet, par exemple. Un EfficientNet-b0 peut donc convenir parfaitement à notre cas d'utilisation. Pour générer les intégrations, nous utilisons le Paquet Python img2vec.
Maintenant que nous avons tout ce dont nous avons besoin pour générer nos intégrations, nous pouvons réfléchir à la stratégie de recherche de similarité.
Comment implémenter la recherche visuelle ?
Une fois que nous avons des intégrations pour toutes nos images, nous devons créer un index pour chaque donnée. Ici, alors que nous construisons une fonctionnalité pour interagir avec les images stockées dans le datalake de Picsellia, nous allons utiliser l'UUID de nos données comme index.
Ensuite, nous voulons trouver, à partir d’un indice, les N images les plus similaires.
Recherche par force brute (Euclidien, Cosinus, etc.)
Un moyen simple d’implémenter une recherche de similarité consiste à calculer la distance d’un vecteur de caractéristiques donné entre tous les autres vecteurs, puis à sélectionner les N voisins les plus proches. Pour cette approche, il vous suffit de prendre en compte la distance que vous souhaitez calculer, la similarité vectorielle est souvent calculée via la distance cosinus.
Le pseudo-code associé à cette recherche serait :
x = target_vector
for all indexes:
compute cosine_distance between x and the index
extract the K nearest neighbors
Cette approche est considérée comme de la force brute puisque la complexité de la recherche est linéaire (comme le montre le graphique ci-dessous). Pour nous, il est totalement impossible d’utiliser de telles approches car nous gérons des millions d’images pour plusieurs clients.
HNSW (Hierarchical Navigable Small World Graphs) – a Smarter Approach
This algorithm has been introduced in the research paper “Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs” by Yu. A. Malkov, D. A. Yashunin.
You can find the Python bindings to the C++ implementation here.
The algorithm generates a graph where every node is a feature vector linked to its closest neighbor. When looking for the K nearest neighbor, you just have to navigate the graph and extract the K closest point.
The objective is to create an approximation of the search to reduce the number of computations performed and reduce the computational complexity of the search. In short terms, it allows us to search inside a 1m index’s database in milliseconds!
Terminons maintenant en utilisant Picsellia !
Dans les coulisses de la mise en œuvre de la recherche visuelle de Picsellia
Chez Picsellia, nous fournissons une plate-forme de gestion de données pour dynamiser le stockage d'objets dans le cloud avec l'indexation, le filtrage, la recherche, la visualisation, etc. C'est pourquoi il est logique pour nous de créer des fonctionnalités de recherche visuelle.
Plutôt une bonne vitesse, non ? Eh bien, voyons comment nous avons construit cela.
Nos exigences
Pour répondre à nos normes de développement, notre fonction de recherche visuelle doit avoir ces caractéristiques :
- Soyez autonome dans un microservice Web
- Travailler sur plusieurs collections d'index cloisonnés pour chaque client
- Parcourez des millions de lignes en millisecondes
- Avoir une complexité non linéaire
Ce sont des besoins essentiels, mais si nous voulons tout développer en interne, nous devrons déployer des efforts pour construire une solution évolutive répondant à ces exigences. Espérons que, à mesure que le domaine de la recherche neuronale est en plein essor, il existe de nombreuses solutions sur le marché pour répondre à ces exigences.
Présentation de Qdrant
"Qdrant" (lire : quadrant) est un moteur de recherche de similarité vectorielle. Il fournit un service prêt pour la production avec une API pratique pour stocker, rechercher et gérer des points-vecteurs avec une charge utile supplémentaire. Qdrant est adapté à une prise en charge étendue du filtrage. Cela le rend utile pour toutes sortes de réseaux de neurones ou de correspondance sémantique, de recherche à facettes et d'autres applications.
Qdrant est publié sous la licence open source Apache 2.0. Son code source est disponible sur GitHub." Source : Documentation de Qdrant. Il implémente une implémentation personnalisée de l'algorithme HSNW nous permettant d'ajouter des filtres supplémentaires à notre requête, et nous offrant une modularité complète sur notre recherche, ce qui est formidable pour nous !
Leur solution open source est regroupée dans une seule image Docker exposant un serveur Web avec lequel communiquer. Pour notre équipe technique, c’est parfait car nous pouvons l’intégrer dans un service personnalisé qui générera les intégrations et les stockera facilement dans la collection Qdrant.
De plus, ils fournissent un ensemble d'API pour enregistrer un nouvel index et un identifiant correspondant, afin de récupérer ultérieurement les éléments. Nous utilisons l'identifiant unique de l'image stockée sur nos buckets, garantissant une communication fluide entre nos services.
Implémentation
La phase clé est la création des intégrations et comment le faire à grande échelle sans affecter les performances globales du moteur de recherche et de la plateforme. Pour ce faire, nous utilisons des tâches asynchrones avec Celery pour mettre en file d'attente tout le travail et conserver la création des intégrations sur le CPU.
En résumé
Cette nouvelle implémentation nous permet de générer des intégrations pour des millions d'images de manière asynchrone sans aucun impact sur les performances globales des produits Picsellia.
Une fois les intégrations indexées et liées à notre identifiant d'image unique, il devient très facile de trouver des images similaires dans votre dataset en un rien de temps ! Cela rend l’exploration des datasets aussi simple que ABC pour vous !
Si vous souhaitez bénéficier d'une suite complète de gestion de données regroupée au sein d'une plateforme de vision par ordinateur de bout en bout, il suffit de demander un essaie !