Le parcours vers l’optimisation de la recherche d’images à l’échelle du milliard (1/2)
Yupoo Picture Manager sert des dizaines de millions d’utilisateurs et gère des dizaines de milliards d’images. À mesure que sa galerie utilisateur s’agrandit, Yupoo a un besoin commercial urgent d’une solution capable de localiser rapidement l’image. En d’autres termes, lorsqu’un utilisateur saisit une image, le système doit trouver son image originale et des images similaires dans la galerie. Le développement du service de recherche par image fournit une approche efficace à ce problème.
Le service de recherche par image a connu deux évolutions :
- A commencé la première étude technique au début de 2019 et a lancé le système de première génération en mars et avril 2019 ;
- A commencé l’étude du plan de mise à niveau au début de 2020 et a démarré la mise à niveau globale vers le système de deuxième génération en avril 2020.
Cet article décrit la sélection technologique et les principes de base derrière les deux générations du système de recherche par image, sur la base de ma propre expérience sur ce projet.
Vue d’ensemble
Qu’est-ce qu’une image ?
Nous devons savoir ce qu’est une image avant de traiter des images.
La réponse est qu’une image est une collection de pixels.
Par exemple, la partie dans le cadre rouge sur cette image est virtuellement une série de pixels.
Figure 1.
Supposons que la partie dans le cadre rouge soit une image, alors chaque petit carré indépendant de l’image est un pixel, l’unité d’information de base. La taille de l’image est donc de 11 x 11 px.
Figure 2.
Représentation mathématique des images
Chaque image peut être représentée par une matrice. Chaque pixel de l’image correspond à un élément de la matrice.
Images binaires
Les pixels d’une image binaire sont soit noirs, soit blancs, donc chaque pixel peut être représenté par 0 ou 1. Par exemple, la représentation matricielle d’une image binaire 4 * 4 est :
0 1 0 1
1 0 0 0
1 1 1 0
0 0 1 0
Images RGB
Les trois couleurs primaires (rouge, vert et bleu) peuvent être mélangées pour produire n’importe quelle couleur. Pour les images RGB, chaque pixel possède l’information de base de trois canaux RGB. De même, si chaque canal utilise un nombre sur 8 bits (en 256 niveaux) pour représenter son échelle de gris, alors la représentation mathématique d’un pixel est :
([0 .. 255], [0 .. 255], [0 .. 255])
En prenant une image RGB 4 * 4 comme exemple :
Figure 3.
L’essence du traitement d’image consiste à traiter ces matrices de pixels.
Le problème technique de la recherche par image
Si vous recherchez l’image originale, c’est-à-dire une image avec exactement les mêmes pixels, vous pouvez alors comparer directement leurs valeurs MD5. Cependant, les images téléversées sur Internet sont souvent compressées ou filigranées. Même une petite modification dans une image peut créer un résultat MD5 différent. Dès qu’il existe une incohérence dans les pixels, il est impossible de trouver l’image originale.
Pour un système de recherche par image, nous voulons rechercher des images au contenu similaire. Nous devons donc résoudre deux problèmes fondamentaux :
- Représenter ou abstraire une image sous un format de données pouvant être traité par un ordinateur.
- Les données doivent être comparables pour le calcul.
Plus précisément, nous avons besoin des fonctionnalités suivantes :
- Extraction des caractéristiques de l’image.
- Calcul des caractéristiques (calcul de similarité).
Le système de recherche par image de première génération
Extraction des caractéristiques — abstraction de l’image
Le système de recherche par image de première génération utilise l’algorithme Perceptual hash ou pHash pour l’extraction des caractéristiques. Quelles sont les bases de cet algorithme ?
First generation image search.
Comme le montre la figure ci-dessus, l’algorithme pHash effectue une série de transformations sur l’image pour obtenir la valeur de hachage. Au cours du processus de transformation, l’algorithme abstrait continuellement les images, rapprochant ainsi les résultats des images similaires les uns des autres.
Calcul des caractéristiques — calcul de similarité
Comment calculer la similarité entre les valeurs pHash de deux images ? La réponse est d’utiliser la distance de Hamming. Plus la distance de Hamming est petite, plus le contenu des images est similaire.
Qu’est-ce que la distance de Hamming ? C’est le nombre de bits différents.
Par exemple,
Valeur 1: 0 1 0 1 0
Valeur 2: 0 0 0 1 1
Il y a deux bits différents dans les deux valeurs ci-dessus, donc la distance de Hamming entre elles est de 2.
Maintenant, nous connaissons le principe du calcul de similarité. La question suivante est : comment calculer les distances de Hamming de données à l’échelle de 100 millions provenant de 100 millions d’images ? En bref, comment rechercher des images similaires ?
Au début du projet, je n’ai pas trouvé d’outil satisfaisant (ou de moteur de calcul) capable de calculer rapidement la distance de Hamming. J’ai donc changé mon plan.
Mon idée est que si la distance de Hamming de deux valeurs pHash est faible, alors je peux découper les valeurs pHash et les petites parties correspondantes sont susceptibles d’être égales.
Par exemple :
Valeur 1: 8 a 0 3 0 3 f 6
Valeur 2: 8 a 0 3 0 3 d 8
Nous divisons les deux valeurs ci-dessus en huit segments et les valeurs de six segments sont exactement les mêmes. On peut en déduire que leur distance de Hamming est proche et que ces deux images sont donc similaires.
Après la transformation, vous pouvez constater que le problème du calcul de la distance de Hamming est devenu un problème de correspondance d’équivalence. Si je divise chaque valeur pHash en huit segments, tant qu’il y a plus de cinq segments qui ont exactement les mêmes valeurs, alors les deux valeurs pHash sont similaires.
Ainsi, il est très simple de résoudre la correspondance d’équivalence. Nous pouvons utiliser le filtrage classique d’un système de base de données traditionnel.
Bien sûr, j’utilise la correspondance multi-termes et je spécifie le degré de correspondance à l’aide de minimum_should_match dans ElasticSearch (cet article ne présente pas le principe d’ES, vous pouvez l’apprendre par vous-même).
Pourquoi choisissons-nous ElasticSearch ? Premièrement, il fournit la fonction de recherche mentionnée ci-dessus. Deuxièmement, le projet de gestion d’images lui-même utilise ES pour fournir une fonction de recherche en texte intégral et il est très économique d’utiliser les ressources existantes.
Résumé du système de première génération
Le système de recherche par image de première génération choisit la solution pHash + ElasticSearch, qui présente les caractéristiques suivantes :
- L’algorithme pHash est simple à utiliser et peut résister à un certain degré de compression, de filigrane et de bruit.
- ElasticSearch utilise les ressources existantes du projet sans ajouter de coûts supplémentaires à la recherche.
Mais la limitation de ce système est évidente : l’algorithme pHash est une représentation abstraite de l’image entière. Une fois que nous détruisons l’intégrité de l’image, par exemple en ajoutant une bordure noire à l’image originale, il est presque impossible de juger de la similarité entre l’originale et les autres.
Pour dépasser ces limitations, le système de recherche d’images de deuxième génération, doté d’une technologie sous-jacente complètement différente, a émergé.
Cet article est écrit par rifewang, utilisateur de Milvus et ingénieur logiciel chez UPYUN. Si vous aimez cet article, n’hésitez pas à venir dire bonjour ! https://github.com/rifewang
Continuer à lire

Introducing Zilliz CLI and Agent Skills for Zilliz Cloud
Manage your vector database from your terminal or AI coding agent. Zilliz CLI and Agent Skills work with Claude Code, Cursor, Codex, and Copilot.

OpenAI o1: What Developers Need to Know
In this article, we will talk about the o1 series from a developer's perspective, exploring how these models can be implemented for sophisticated use cases.

Vector Databases vs. Hierarchical Databases
Use a vector database for AI-powered similarity search; use a hierarchical database for organizing data in parent-child relationships with efficient top-down access patterns.



