Visión general
Yupoo Picture Manager da servicio a decenas de millones de usuarios y gestiona decenas de miles de millones de imágenes. Como su galería de usuarios es cada vez mayor, Yupoo necesita urgentemente una solución que pueda localizar rápidamente la imagen. En otras palabras, cuando un usuario introduce una imagen, el sistema debe encontrar su imagen original e imágenes similares en la galería. El desarrollo del servicio de búsqueda por imagen proporciona un enfoque eficaz a este problema.
El servicio de búsqueda por imagen ha experimentado dos evoluciones:
- Comenzó la primera investigación técnica a principios de 2019 y lanzó el sistema de primera generación en marzo y abril de 2019;
- Comenzó la investigación del plan de actualización a principios de 2020 y comenzó la actualización general al sistema de segunda generación en abril de 2020.
Este artículo describe la selección de la tecnología y los principios básicos en los que se basan las dos generaciones del sistema de búsqueda por imágenes a partir de mi propia experiencia en este proyecto.
Visión general
¿Qué es una imagen?
Debemos saber qué es una imagen antes de tratar con imágenes.
La respuesta es que una imagen es una colección de píxeles.
Por ejemplo, la parte del recuadro rojo de esta imagen es prácticamente una serie de píxeles.
1-que-es-una-imagen.png
Supongamos que la parte del recuadro rojo es una imagen, entonces cada cuadradito independiente de la imagen es un píxel, la unidad básica de información. Entonces, el tamaño de la imagen es 11 x 11 px.
2-que-es-una-imagen.png
Representación matemática de las imágenes
Cada imagen puede representarse mediante una matriz. Cada píxel de la imagen corresponde a un elemento de la matriz.
Imágenes binarias
Los píxeles de una imagen binaria son blancos o negros, por lo que cada píxel puede representarse por 0 o 1. Por ejemplo, la representación matricial de una imagen binaria de 4 * 4 es:
0 1 0 1
1 0 0 0
1 1 1 0
0 0 1 0
Imágenes RGB
Los tres colores primarios (rojo, verde y azul) pueden mezclarse para producir cualquier color. Para las imágenes RGB, cada píxel tiene la información básica de tres canales RGB. Del mismo modo, si cada canal utiliza un número de 8 bits (en 256 niveles) para representar su escala de grises, entonces la representación matemática de un píxel es:
([0 .. 255], [0 .. 255], [0 .. 255])
Tomando como ejemplo una imagen RGB de 4 * 4:
3-4-x-4-rgb-image.png
La esencia del tratamiento de imágenes es procesar estas matrices de píxeles.
El problema técnico de la búsqueda por imagen
Si busca la imagen original, es decir, una imagen con exactamente los mismos píxeles, puede comparar directamente sus valores MD5. Sin embargo, las imágenes que se suben a Internet suelen estar comprimidas o con marcas de agua. Incluso un pequeño cambio en una imagen puede crear un resultado MD5 diferente. Mientras haya inconsistencia en los píxeles, es imposible encontrar la imagen original.
Para un sistema de búsqueda por imagen, queremos buscar imágenes con contenido similar. Entonces, tenemos que resolver dos problemas básicos:
- Representar o abstraer una imagen como un formato de datos que pueda ser procesado por un ordenador.
- Los datos deben ser comparables para el cálculo.
Más concretamente, necesitamos las siguientes características:
- Extracción de características de la imagen.
- Cálculo de características (cálculo de similitudes).
El sistema de búsqueda por imágenes de primera generación
Extracción de características - abstracción de imágenes
El sistema de búsqueda por imágenes de primera generación utiliza el algoritmo Perceptual hash o pHash para la extracción de características. ¿Cuáles son los fundamentos de este algoritmo?
4-búsqueda-de-imágenes-de-primera-generación.png
Como se muestra en la figura anterior, el algoritmo pHash realiza una serie de transformaciones en la imagen para obtener el valor hash. Durante el proceso de transformación, el algoritmo abstrae continuamente las imágenes, acercando así los resultados de imágenes similares.
Cálculo de características - cálculo de similitud
¿Cómo calcular la similitud entre los valores hash de dos imágenes? La respuesta es utilizar la distancia de Hamming. Cuanto menor sea la distancia de Hamming, más similar será el contenido de las imágenes.
¿Qué es la distancia de Hamming? Es el número de bits diferentes.
Por ejemplo,
Value 1: 0 1 0 1 0
Value 2: 0 0 0 1 1
Hay dos bits diferentes en los dos valores anteriores, por lo que la distancia Hamming entre ellos es 2.
Ahora ya conocemos el principio del cálculo de la similitud. La siguiente pregunta es, ¿cómo calcular las distancias Hamming de 100 millones de datos a partir de 100 millones de imágenes? En resumen, ¿cómo buscar imágenes similares?
En la fase inicial del proyecto, no encontré una herramienta satisfactoria (o un motor informático) que pudiera calcular rápidamente la distancia de Hamming. Así que cambié de plan.
Mi idea es que si la distancia de Hamming de dos valores pHash es pequeña, entonces puedo cortar los valores pHash y es probable que las partes pequeñas correspondientes sean iguales.
Por ejemplo:
Value 1: 8 a 0 3 0 3 f 6
Value 2: 8 a 0 3 0 3 d 8
Dividimos los dos valores anteriores en ocho segmentos y los valores de seis segmentos son exactamente iguales. Se puede deducir que su distancia Hamming es cercana y por lo tanto estas dos imágenes son similares.
Tras la transformación, se puede comprobar que el problema del cálculo de la distancia de Hamming se ha convertido en un problema de equivalencia de coincidencias. Si divido cada valor pHash en ocho segmentos, mientras haya más de cinco segmentos que tengan exactamente los mismos valores, entonces los dos valores pHash son similares.
Por lo tanto, es muy sencillo resolver el emparejamiento de equivalencias. Podemos utilizar el filtrado clásico de un sistema de base de datos tradicional.
Por supuesto, yo utilizo la concordancia multitérmino y especifico el grado de concordancia utilizando minimum_should_match en ElasticSearch (este artículo no introduce el principio de ES, puedes aprenderlo por ti mismo).
¿Por qué elegimos ElasticSearch? En primer lugar, proporciona la función de búsqueda antes mencionada. En segundo lugar, el proyecto de gestor de imágenes en sí mismo está utilizando ES para proporcionar una función de búsqueda de texto completo y es muy económico utilizar los recursos existentes.
Resumen del sistema de primera generación
El sistema de búsqueda por imágenes de primera generación opta por la solución pHash + ElasticSearch, que presenta las siguientes características:
- El algoritmo pHash es sencillo de utilizar y puede resistir cierto grado de compresión, marca de agua y ruido.
- ElasticSearch utiliza los recursos existentes del proyecto sin añadir costes adicionales a la búsqueda.
- Pero la limitación de este sistema es obvia: el algoritmo pHash es una representación abstracta de toda la imagen. Una vez que destruimos la integridad de la imagen, por ejemplo añadiendo un borde negro a la imagen original, es casi imposible juzgar la similitud entre el original y los demás.
Para superar estas limitaciones, surgió el sistema de búsqueda de imágenes de segunda generación con una tecnología subyacente completamente distinta.
Este artículo ha sido escrito por rifewang, usuario de Milvus e ingeniero de software de UPYUN. Si te gusta este artículo, ¡ven a saludarnos! https://github.com/rifewang
- El problema técnico de la búsqueda por imagen
- El sistema de búsqueda por imágenes de primera generación
- Resumen del sistema de primera generación
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word