Una aplicación de búsqueda de imágenes que usa la API de Vision y AutoML Vision

En este artículo, se explica cómo usar la API de Vision y AutoML Vision para potenciar tu aplicación de búsqueda y clasificación de imágenes. Cuando se combinan con otros servicios de Google Cloud, lo siguiente se facilita:

  • Buscar dentro de las imágenes objetos y escenas detectados
  • Clasificar las imágenes en diferentes categorías según las etiquetas de imagen detectadas
  • Usar categorías y etiquetas de imagen como facetas de búsqueda

La API de Vision usa la tecnología de modelos de aprendizaje profundo de Google y proporciona capacidades avanzadas de visión artificial, que incluyen las siguientes opciones:

  • Detección de etiquetas
  • Detección de rostro y punto de referencia
  • Reconocimiento óptico de caracteres (OCR)
  • Detección de contenido explícito

Con AutoML Vision, puedes entrenar modelos de alta calidad para detectar etiquetas personalizadas con la búsqueda de arquitectura neuronal de Google y el aprendizaje por transferencia de vanguardia. Estas tecnologías te permiten recolectar los datos de entrenamiento para crear tu propio modelo de visión sin la necesidad de contar con conocimientos avanzados de aprendizaje automático.

Puedes integrar estas capacidades en aplicaciones nuevas o existentes a través de una API de REST.

Para saber cómo compilar la aplicación descrita en este artículo, consulta Compila una aplicación de búsqueda de imágenes mediante la API de Vision y AutoML Vision.

Usa la detección de etiquetas a fin de que las imágenes estén disponibles para su búsqueda

La detección de etiquetas es una característica de anotación de imágenes de la API de Vision y AutoML Vision. Esta característica predice las etiquetas más adecuadas que describen una imagen. Además, identifica conjuntos de objetos amplios en miles de categorías de objetos diferentes y, luego, muestra una anotación de etiquetas o cada etiqueta detectada en una imagen. También muestra lo siguiente:

  • Identificador de etiquetas: Un ID de entidad opaco para la etiqueta, como "/m/0bt9lr"
  • Descripción de etiquetas: Una descripción textual de la etiqueta, como “perro”
  • Puntuación de confianza: un número asociado a cada anotación de etiqueta que se muestra, que representa la evaluación de la API de Vision de la precisión de la etiqueta. La puntuación de confianza va desde 0 (sin confianza) a 1 (confianza muy alta).

Con AutoML Vision, proporcionas conjuntos de datos etiquetados para entrenar modelos que realizan la detección de etiquetas personalizadas con tus etiquetas. Mediante la combinación de la detección de etiquetas con un índice de búsqueda, haces que las imágenes se puedan buscar mediante métodos nuevos. En el siguiente diagrama, se presenta este método:

índice de búsqueda y detección de etiquetas

En esta arquitectura de solución, se deben seguir los siguientes pasos:

  1. Un usuario sube una imagen de una aplicación cliente a un depósito de Cloud Storage.
  2. Cuando llega una imagen nueva al depósito, Pub/Sub genera una notificación.
  3. La notificación de Pub/Sub contiene los detalles del archivo de imagen nuevo, y el tema de Pub/Sub que se usa para las notificaciones se configura en la entrega de envío al extremo de App Engine.
  4. El backend de App Engine ahora reconoce la existencia del archivo nuevo. App Engine llama a la API de Vision en la imagen subida para procesar y agregarle etiquetas. Estas etiquetas también se agregan al índice de búsqueda.
  5. App Engine agrega al índice de búsqueda etiquetas personalizadas que detecta AutoML Vision (opcional).
  6. App Engine llama a AI Platform para clasificar las imágenes en las categorías que define el usuario mediante las etiquetas detectadas (opcional). La categoría también se agrega al índice de búsqueda.
  7. Busca las etiquetas de imágenes detectadas con la API de búsqueda de App Engine. La API de Búsqueda proporciona un rango de función de búsqueda que incluye la búsqueda por facetas y por palabra clave.

Usa las etiquetas para la búsqueda por facetas

La búsqueda por facetas es una forma de exponer las etiquetas de la API de Vision y AutoML Vision (que se denominan etiquetas de imágenes en este artículo) en una interfaz de búsqueda. Cuando usas la búsqueda por facetas, las etiquetas de imágenes y el recuento de etiquetas se presentan junto con los resultados de la búsqueda como una faceta de búsqueda navegable. Después de que los usuarios inician una búsqueda de palabra clave general mediante la consulta de diferentes campos del índice, pueden usar la faceta de búsqueda para definir mejor los resultados de la búsqueda de imágenes que contienen etiquetas de imágenes específicas.

En la interfaz de búsqueda, también se detalla cuántos resultados contiene cada perfeccionamiento de la etiqueta. Por sobre todo, la búsqueda por facetas es efectiva cuando los resultados incluyen una gran cantidad de etiquetas comunes.

Ejemplo de búsqueda por facetas

Cuando buscas imágenes con una palabra clave sencilla como “ciudad”, los resultados de la búsqueda contienen miles de imágenes. En ese caso, necesitas agregar palabras clave para limitar los resultados, pero es probable que no estés seguro qué palabras clave agregar. La búsqueda por facetas te ayuda a elegir mediante la recopilación de otras etiquetas adjuntas a las imágenes que se encuentran mediante la palabra clave “ciudad”. Estas etiquetas se consideran facetas y, las que aparecen con frecuencia, se muestran en una lista de candidatas para su selección.

Por ejemplo, una búsqueda por facetas puede mostrar una lista de las diez etiquetas más populares que, por lo general, se adjuntan a las imágenes del resultado de la búsqueda. Esta lista te permite seleccionar las palabras clave de la lista que se completó antes. En la siguiente captura de pantalla, se muestra un ejemplo implementado.

búsqueda de facetas implementada

En esta captura de pantalla, se muestra cómo se exponen las etiquetas de imágenes como facetas de búsqueda. Cuando un usuario realiza una búsqueda, las etiquetas de imágenes detectadas del conjunto de documentos coincidentes se presentan junto con los resultados de la búsqueda como una faceta de búsqueda en la que se puede hacer clic. En este ejemplo, se expone la faceta de la etiqueta de la imagen. La selección de uno de los vínculos de Image Label (Etiqueta de la imagen) activa un perfeccionamiento de la búsqueda y solo muestra las imágenes que contienen la etiqueta seleccionada, como “cityscape” (paisaje urbano) o “night” (noche).

Además, las etiquetas de imagen se agregan a un campo de índice de un documento mediante la API de Búsqueda de App Engine. En este ejemplo, también se muestran las categorías de imágenes predeterminadas (las facetas de la Mapped Category [Categoría asignada] y la Most Similar Category [Categoría más similar]) como listas de palabras clave adicionales. En la siguiente sección, se explica cómo implementar esta característica.

Usa etiquetas para clasificar imágenes

En ocasiones, es posible que desees que tu aplicación exponga las etiquetas de forma directa. En otras ocasiones, es posible que desees clasificar las imágenes en categorías predeterminadas, en vez de exponer las etiquetas de forma directa.

Por ejemplo, puede que desees permitir a los usuarios buscar las imágenes que coincidan con las categorías predeterminadas, como “naturaleza” o “paisaje urbano”, además de buscar las etiquetas de imagen de manera directa. En este caso, puedes usar las etiquetas de la imagen de maneras diferentes para derivar la categoría de imagen más adecuada.

Para habilitar esta situación, puedes usar la API de Vision y AutoML Vision:

  • La detección de etiquetas de la API de Vision es ideal si la API ya reconoce tus categorías y las muestra como etiquetas de imagen. La detección de etiquetas también es útil si tu aplicación controla las imágenes relacionadas con diversas cuestiones que se pueden beneficiar de la amplia comprensión de la API de Vision.

    En ambos casos, puedes usar las etiquetas de imagen que la API de Vision muestra para determinar contextos de una categoría más amplia de distintas maneras. Por ejemplo, etiquetas de imagen como “contaminación”, “fábrica”, “iceberg” y “vertederos de residuos” se podrían usar a fin de determinar una categoría más amplia, como “cambio climático”. Para obtener más información, consulta Clasifica imágenes con la API de Vision en otra sección de este documento.

  • AutoML Vision es ideal para la clasificación de imágenes personalizadas con conjuntos de entrenamiento etiquetados que proporcionó el usuario. La característica de detección de etiquetas personalizada en AutoML Vision muestra las etiquetas definidas por el usuario incluidas en el conjunto de entrenamiento que puedes usar para crear categorías de imágenes personalizadas.

    Si la detección de etiquetas de la API de Vision no muestra las etiquetas adecuadas para tu tarea de categorización, recomendamos usar AutoML Vision a fin de entrenar un modelo de imagen personalizada. Para obtener más información, consulta Clasifica imágenes con AutoML Vision en otra sección de este documento.

Clasifica imágenes con la API de Vision

La API de Vision detecta objetos provenientes de miles de categorías diferentes, tanto específicas como abstractas. Esta amplia comprensión se puede usar a fin de clasificar imágenes en categorías predeterminadas que son útiles para tu aplicación.

Para habilitar esta situación, debes implementar un método a fin de asociar las etiquetas de imagen de la API de Vision con categorías específicas. En las secciones siguientes, se describen dos métodos posibles:

  • Asignación de una etiqueta detectada a una categoría predeterminada
  • Uso de vectores de palabras para encontrar una categoría similar

En ambos métodos, las etiquetas de imagen de la API de Vision proporcionan un contexto adecuado para clasificar imágenes.

Asigna etiquetas detectadas a categorías predeterminadas

Imagina que estás desarrollando un sitio web que vende fotografías de archivo. Tu interfaz de usuario podría permitir a los visitantes buscar o explorar imágenes en categorías predeterminadas como vida silvestre, naturaleza y paisajes urbanos. Si la API de Vision muestra “jirafa”, “elefante” o “sabana” como etiquetas de imagen, querrás que la imagen se organice de forma automática en la categoría vida silvestre.

La detección de etiquetas de la API de Vision muestra conjuntos de categorías amplios en las imágenes y no puntuaciones para categorías predeterminadas específicas. Un método sencillo de asignación de etiquetas a las categorías podría ser asignar las etiquetas de la API de Vision a categorías específicas, en que cada categoría esté asociada a una o más etiquetas específicas de la API de Vision (para el resto de la solución, este método se llama asignación de etiqueta a categoría fija). En este esquema, las etiquetas que muestra la API de Vision se comparan con la lista de palabras que define cada categoría y la imagen asociada a la categoría más adecuada, como se determina en las puntuaciones de confianza de las etiquetas de imágenes.

La API de Vision muestra una o más etiquetas para una imagen. Para cada imagen, las etiquetas de imágenes detectadas se comparan con las palabras que definen una categoría específica. Cuando existe una o más coincidencias directas, la puntuación de confianza de la API de Vision de cada etiqueta que coincide se suma y crea una puntuación de confianza de la categoría para cada categoría. Esta puntuación es una representación numérica de qué tan bien las palabras que definen una categoría predeterminada se asignan a las etiquetas que muestra la API de Vision de una imagen específica. La categoría con el valor de confianza de categoría más alto se elige como categoría de imagen y se agrega al índice de búsqueda. Si se diera un empate, podrías agregar una imagen a las categorías calificadas o definir una heurística adicional para asignar de forma única la imagen a una sola categoría.

En el siguiente diagrama, se muestra un método para un conjunto pequeño de categorías predeterminadas.

asigna a categorías predeterminadas

La asignación de las etiquetas detectadas a las categorías funciona bien cuando estás seguro de que puedes anticipar las etiquetas de imágenes específicas con cada categoría, es decir, es probable que el conjunto de palabras que define varias categorías predeterminadas contenga un porcentaje alto de etiquetas mostradas. Por ejemplo, si las imágenes a menudo tienen alguna combinación de “perro”, “gato” o “pájaro” detectadas como etiquetas, definir una categoría predeterminada para “animales” es sencillo si defines tu categoría con estas etiquetas exactas. Cuando se muestra un rango amplio de etiquetas para las imágenes, es cada vez más difícil determinar cómo asignar estas etiquetas a las categorías específicas. En el ejemplo anterior, si “caballo” se detecta como una etiqueta, pero no “perro”, “gato” o “pájaro”, la imagen no se clasifica de forma correcta, ya que “caballo” no es parte del conjunto de palabras que define la categoría “animales”.

Otra limitación es que las etiquetas de imágenes detectadas pueden estar relacionadas con varias categorías, lo que complica aún más el proceso coincidencia de la imagen con la categoría con la puntuación más alta. Por ejemplo, si varias categorías comparten la asignación de etiqueta a categoría similares, cada uno recibe la misma contribución hacia sus puntuaciones de confianza de categoría para estas etiquetas de imágenes. Cuando sea importante colocar las imágenes en categorías únicas, será necesario encontrar las asignaciones de etiquetas únicas para cada categoría a fin de aumentar la diferenciación entre las puntuaciones de las categorías. Sin embargo, puede ser difícil identificar las etiquetas únicas para las coincidencias exactas.

Usa vectores de palabras para encontrar la categoría más adecuada

Según la variedad de etiquetas detectadas que muestra la API de Vision, puede ser difícil crear asignaciones fijas entre las etiquetas y las categorías. En este caso, puedes usar otro método que mida las similitudes conceptuales entre las etiquetas en vez de comparar de forma directa los valores de las etiquetas.

Considera un ejemplo en el que se muestra “pájaro”, loro”, “vertebrado” y “fauna” como etiquetas de imágenes detectadas. Estas etiquetas se pueden comparar con las etiquetas representativas asociadas con el siguiente conjunto de categorías predeterminadas:

Categoría Etiqueta 1 Etiqueta 2 Etiqueta 3 Etiqueta 4 Etiqueta 5 ¿Son similares?
Animal gato animal perico canino caballo
Vehículo automóvil camión auto tranvía barco No

Aunque ninguna de las etiquetas de las categorías en esta tabla coincide con precisión con las etiquetas de la imagen que se muestran, la categoría Animal es claramente la más adecuada desde el punto de vista conceptual. Es decir, las etiquetas detectadas son más similares a las palabras que definen la categoría Animal, que a las palabras que definen la categoría Vehículo. Querrás que tu sistema reconozca esta similitud y clasifique de forma correcta la imagen como Animal.

Las técnicas de procesamiento de lenguaje natural a menudo dependen de la transformación de palabras individuales en representaciones vectoriales. Puedes manipular de manera matemática estos vectores para identificar las correlaciones entre las palabras. Los diccionarios de word embedding previamente entrenados, como word2vec o GloVe, ya convirtieron palabras comunes en representaciones vectoriales de números reales. Mediante el uso de estas representaciones vectoriales, puedes calcular puntuaciones de similitud entre las etiquetas de imágenes y de categorías. La categoría con la puntuación de similitud más cercana a la imagen se asocia a esta.

Calcula los vectores de imagen y categoría mediante GloVe

Para generar vectores de números reales para imágenes, las etiquetas detectadas se convierten en representaciones vectoriales equivalentes con GloVe y, luego, se reducen a un solo vector combinado mediante la suma de vectores de palabras individuales. Si usas el ejemplo anterior, este método converte las etiquetas detectadas de la imagen (“pájaro”, “loro”, “vertebrado” y “fauna”) en vectores de palabras individuales. El vector de palabra combinado de la imagen se crea mediante la combinación lineal de los vectores de palabras individuales para cada puntuación de etiqueta. De este modo, una sola imagen con varias etiquetas se transforma en un vector combinado que representa su significado semántico general.

Un vector combinado también se calcula para cada categoría mediante la suma de los vectores de palabras que representa mejor la categoría; este vector combinado no necesita que estén todas las palabras que definen la categoría y, a menudo, es un subconjunto relevante. A fin de convertir las palabras en vectores para las imágenes y las categorías, las etiquetas de imágenes y los elementos de categoría deben existir en las incorporaciones de GloVe previamente entrenadas.

La cantidad de palabras que define cada categoría puede variar. Cuando varias palabras se usan para una categoría, la suma de los vectores de palabras se aproxima a una semántica combinada de todas las palabras en la categoría. También es válido el uso de una sola palabra para una categoría.

Debes evitar el uso de palabras que tienen significado similar en las categorías cuando seleccionas palabras a fin de generar el vector combinado para una categoría. Si conservas esas palabras, se dificultará la desaparición de la ambigüedad entre las categorías. En su lugar, elige palabras que describan las categorías de forma única. Un ejemplo hipotético: las palabras “concreto” y “asfalto” son muy parecidas para poder hacer desaparecer la ambigüedad de forma adecuada entre las categorías de Edificios y Carreteras. En cambio, “casa” y “calle” tienen más probabilidades de ser distintivas.

La cantidad y el valor de las palabras que definen varias categorías son diferentes en cada situación. Puedes experimentar y ejecutar pruebas con combinaciones diferentes para encontrar el mejor resultado.

Calcula la similitud entre los vectores de imagen y de categoría

Para clasificar una imagen con una categoría específica, puedes calcular la similitud del coseno entre el vector de imagen combinado y cada vector de categoría combinado. Cuanto más alta sea la similitud, mejor será la correlación entre la imagen y la categoría. En el siguiente diagrama, se ilustra este proceso:

calcula la similitud entre los vectores de imagen y de categoría

Aquí, los vectores de palabras de GloVe se usan para calcular los vectores de imagen y de categoría combinados. La similitud de coseno entre los vectores de imagen y categoría combinados se usa para determinar la equivalencia; en este caso, las puntuaciones semánticas son un poco más cercanas, 0.75, lo que indica que picture.jpg podría asociarse de forma útil a la categoría Animales.

Para aplicar este método, debes implementar un modelo de TensorFlow sencillo en AI Platform. El modelo acepta las etiquetas detectadas de la API de Vision, las convierte en una representación vectorial combinada y calcula la similitud del coseno para cada vector de categoría combinada. El modelo de TensorFlow usa las incorporaciones de palabras previamente entrenadas para vectorizar las etiquetas de imagen y de categoría que no requieren entrenamiento adicional.

En el siguiente diagrama, se muestra una arquitectura de solución actualizada que incorpora AI Platform:

arquitectura que incorpora AA

Activa el backend de App Engine

La activación del backend de App Engine es similar al método anterior, en el que se usó la asignación de etiquetas a categoría fijas. Así, una imagen nueva que se sube a un depósito de Cloud Storage activa el extremo de App Engine. El extremo que se activa solicita la detección de etiquetas de la imagen mediante la API de Vision y llama a un modelo de predicción en AI Platform para convertir las etiquetas de imágenes en una representación de vector. El modelo de predicción calcula una puntuación de similitud de coseno para el vector de la imagen y cada vector de categoría. La categoría que genera la similitud más alta se aplica a la imagen y se escribe en el índice de búsqueda.

Diferencias entre los métodos

En las siguientes capturas de pantalla, se ilustra la diferencia entre las categorías derivadas de la asignación de etiqueta a categoría fijas (captura de pantalla de la izquierda) y las categorías derivadas mediante los vectores de palabras (captura de pantalla de la derecha).

asignación de etiqueta a categoría vectores de palabras

En este ejemplo, Mapped Category: animals (Categoría asignada: animales) (mediante una asignación de etiqueta a categoría fija) se define por el siguiente conjunto de palabras: “perro”, “gato”, “pez”, “caballo”, “animal”, “pájaro”, “loro” y “perico”. Para cat.jpg, Vision mostró las siguientes etiquetas: “fauna”, “vida silvestre”, y “zoológico”.

Cuando el valor de la faceta Mapped Category: animals (Categoría asignada: animales) se selecciona en la captura de pantalla de la izquierda, falta la imagen de un gato. Mapped Category: animals (Categoría asignada: animales) representa un enfoque de etiqueta a categoría fija. Debido a que ninguna etiqueta de Vision coincide con los elementos de la categoría, la imagen no está asociada con la categoría animales, lo que requiere coincidencias exactas para calcular las puntuaciones de similitud de categorías. En este caso, la puntuación de similitud de categoría entre la imagen y la categoría es de cero, no existe superposición entre los elementos de la etiqueta y de la categoría.

La captura de pantalla de la derecha, que incorpora vectores de palabras de GloVe, incluyen la imagen del gato en Categoría más similar: animales. Mediante los vectores de palabras, los elementos que define la Most Similar Category: animals(Categoría más similar: animales) (“animal”, “criatura”, “especie” y “mascota”) se transforman en un vector de categoría combinado. Asimismo, las etiquetas de la imagen que muestra cat.jpg (“fauna”, “vida silvestre”, y “zoológico”) se transforman en un vector de imagen combinado. Debido a que la similitud de coseno entre los vectores combinados de imagen y categoría es bastante cercana, se determina que tienen similitud semántica legítima. En otras palabras, las etiquetas de la imagen cat.jpg son bastante similares a los elementos de categoría de animales para que el modelo de TensorFlow coloque la imagen de gato en la categoría correcta, a pesar de no tener la etiqueta “gato” exacta.

En ambas capturas de pantalla, los contadores que se muestran junto a los valores de la faceta reflejan la cantidad total de casos de una etiqueta determinada en el conjunto de resultados que se muestra. Esto explica por qué la captura de pantalla de la derecha muestra animales(1) dentro de la faceta Categoría asignada, mientras que la captura de pantalla de la izquierda indica que cat.jpg no se asignó directamente a animales mediante asignaciones fijas de etiqueta a categoría.

Clasifica imágenes con AutoML Vision

Aunque la detección de etiquetas de la API de Vision detecta conjuntos amplios de categorías en una imagen, los requisitos pueden incluir las categorías que la API de Vision no detecta. Estas categorías pueden incluir etiquetas muy específicas del dominio, como aquellas para casos prácticos especializados (por ejemplo, a fin de categorizar partes de máquinas propietarias). En este caso, recomendamos usar AutoML Vision para entrenar un modelo de imagen personalizado con un conjunto de datos proporcionado por el usuario.

Cuando entrenes los modelos de imágenes personalizados mediante AutoML Vision, asegúrate de que tus imágenes de entrenamiento sean adecuadas para AutoML Vision y que sean representativas de las imágenes que se usan en la predicción. Para ilustrar este requisito, es poco probable que un modelo de imagen destinado a detectar animales, pero entrenado solo con fotografías de criaturas de cuatro patas, identifique un pájaro como un animal. A efectos comparativos, la detección de etiquetas existente de la API de Vision es lo suficientemente amplia para explicar esta diferencia, ya sea que muestre “animal” como una etiqueta específica o que muestre las etiquetas relacionadas en que se podría derivar la categoría correcta. (Consulta Clasifica imágenes con la API de Vision que aparece antes en este documento).

En el diagrama siguiente, se muestra una arquitectura de solución que incorpora AutoML Vision en tu aplicación de búsqueda de imagen. En el siguiente ejemplo, las etiquetas definidas por el usuario en tu conjunto de datos de entrenamiento se usan directamente como categorías de imagen.

arquitectura que incorpora AutoML Vision

Al igual que con la clasificación de la API de Vision, en este enfoque, una imagen nueva que se sube al depósito de Cloud Storage activa el extremo de App Engine. El extremo activado requiere la detección de etiquetas personalizadas para la imagen con AutoML Vision. La etiqueta de la imagen con la puntuación de confianza más alta se asigna como categoría de imagen y se agrega al índice de búsqueda.

AutoML Vision se puede usar junto con la API de Vision para lograr una funcionalidad combinada. Por ejemplo, puedes usar la detección de etiquetas de la API de Vision para búsquedas por facetas en temáticas generales y usar AutoML Vision a fin de categorizar imágenes basadas en etiquetas de imágenes personalizadas.

Próximos pasos