Visión artificial y NLP para el procesamiento inteligente de imágenes

Moscú, la ciudad del misterio... (Esta foto es proporcionada por Igor Shabalin)

1. Descripción

        En estos días, todos los que tienen un teléfono inteligente tienen el potencial para ser fotógrafos. Como resultado, todos los días aparecen toneladas de fotos nuevas en las redes sociales, sitios web, blogs y bibliotecas de fotos personales. Si bien el proceso de tomar fotografías puede ser muy emocionante, ordenarlas y describirlas manualmente después puede ser tedioso y llevar mucho tiempo.

        Este artículo analiza cómo se pueden combinar las técnicas de visión por computadora (CV) y procesamiento del lenguaje natural (NLP) para obtener un conjunto de etiquetas descriptivas para fotos y luego generar descripciones significativas basadas en estas etiquetas, ahorrando un tiempo valioso.

2. ¿Qué hay en la foto?

        Los humanos podemos responder esa pregunta en una fracción de segundo, una vez que la foto está en nuestras manos. Las máquinas también pueden responder a esta pregunta, siempre que estén familiarizadas con CV y ​​NLP. Por favor, vea las fotos a continuación:

¿Cómo sabe su aplicación qué hay en la imagen de arriba? Con una herramienta como Predict API de Clarifai , esto puede ser pan comido. Aquí hay un conjunto de etiquetas descriptivas que la API le brinda después de procesar la foto de arriba:

‘straw’, ‘hay’, ‘pasture’, ‘wheat’, ‘cereal’, ‘rural’, ‘bale’, …

        Como puede ver, estas etiquetas le brindan información adecuada sobre lo que se puede ver en la imagen. Si todo lo que necesita es categorizar automáticamente su contenido visual, tener estas etiquetas debería ser suficiente para hacer su trabajo. Sin embargo, para la tarea de generar descripciones de imágenes, debe ir un paso más allá y aprovechar algunas técnicas de NLP.

        En este artículo, verá un ejemplo simplificado de cómo se puede hacer esto, mostrándole cómo entretejer algunas de las palabras en la lista de etiquetas resultante en frases simples. Para una discusión conceptual sobre este tema, también puede consultar mi artículo en el blog de Clarifai: Generación de descripciones de imágenes mediante procesamiento de lenguaje natural .

3. Prepárate

        Para seguir los scripts discutidos en este artículo, se requieren los siguientes componentes de software:

Pitón 2.7+∕3.4+

spaCy v2.0+

Un modelo en inglés preentrenado para spaCy

Cliente Clarifai API Python

Clave API de Clarifai

        Puede encontrar instrucciones de instalación en los sitios respectivos. Entre otras cosas, necesitará una biblioteca de Python que le permita obtener y analizar datos de Wikipedia.

4. Etiquetar fotos automáticamente

        Primero, echemos un vistazo al código que puede usar para etiquetar fotos automáticamente. En la implementación a continuación, usamos el modelo genérico de reconocimiento de imágenes de Clarifai para obtener etiquetas descriptivas para las fotos enviadas.

from clarifai.rest import ClarifaiApp, client, Image
def what_is_photo(photofilename):
  app = ClarifaiApp(api_key='Your Clarifai API key here')
  model = app.models.get("general-v1.3")
  image = Image(file_obj=open(photofilename, 'rb'))
  result = model.predict([image])
  tags = ''
  items = result['outputs'][0]['data']['concepts']
  for item in items:
    if item['name'] == 'no person':
      continue
    result = "{}, ".format(item['name'])
    tags = tags +result
  return tags 

        Para probar la función anterior, puede agregar el siguiente bloque principal a su secuencia de comandos:

if __name__ == "__main__":
  tag_list = list(what_is_photo("country.jpg").split(", "))
  print(tag_list[:7]) 

        En este ejemplo particular, elegimos las siete etiquetas descriptivas principales generadas para las fotos enviadas. Entonces, para la foto provista en la foto, ¿qué hay dentro de la foto? En la sección anterior, este script produjo la siguiente lista de etiquetas descriptivas:

['straw', 'hay', 'pasture', 'wheat', 'cereal', 'rural', 'bale'] 

        Esto es suficiente para fines de clasificación y se puede utilizar como fuente de datos para que la PNL genere descripciones significativas, como se describe en la siguiente sección.

5. Usa NLP para convertir etiquetas descriptivas en descripciones

        Nos dicen en la escuela que para dominar un idioma hay que leer mucho. En otras palabras, tienes que entrenar con los mejores ejemplos del idioma. Volviendo a nuestra discusión, necesitamos texto que use palabras de la lista de etiquetas. Por supuesto, puede obtener un gran corpus, como el volcado de la base de datos de Wikipedia, que contiene toneladas de artículos diferentes. Sin embargo, en la era de la búsqueda impulsada por IA, solo puede limitar su corpus al texto más relevante para las palabras en la lista de etiquetas que tiene. El siguiente código muestra cómo obtener el contenido de una sola entrada de Wikipedia, que contiene información relacionada con una lista de etiquetas (deberá agregar esto al código en la función principal de la sección anterior):

import wikipedia
tags = ""
tags = tags.join(tag_list[:7])
wiki_resp = wikipedia.page(tags)
print("Article url: ", wiki_resp.url) 

        Ahora que tiene algunos datos de texto para procesar, es hora de poner a trabajar la PNL. Estos son los pasos iniciales para inicializar la canalización de procesamiento de texto de spaCy y luego aplicarla al texto (añadiéndola al fragmento de código anterior).

nlp = spacy.load('en')
doc = nlp(wiki_resp.content)
print(len(list(doc.sents))) 

        En el siguiente código, itera a través de las oraciones del envío, analizando las dependencias gramaticales en cada oración. En particular, busca frases que contengan palabras de la lista de tokens enviada. En una frase, las dos palabras de la lista deben estar gramaticalmente relacionadas con la relación cabeza/hijo. Si está confundido acerca de la terminología utilizada aquí, le recomiendo consultar Procesamiento del lenguaje natural con Python , que explica los conceptos de PNL en detalle e incluye muchos ejemplos fáciles de seguir. Puede comenzar a leer de inmediato: los capítulos  2 y 12 son gratuitos. Además, se puede encontrar un ejemplo de cómo se puede usar el análisis de dependencia sintáctica en la práctica en mi artículo reciente para Oracle Magazine sobre  la generación de intenciones y entidades para Oracle Digital Assistant Skills .

        Volviendo al código a continuación, tenga en cuenta que esto es una simplificación; por supuesto, el código del mundo real será un poco más complejo. (adjunte el código de abajo al código anterior en el script principal)

x = []
for sent in doc.sents:
  if bool([t for t in sent if t.lemma_ in tag_list[:7] and t.head.lemma_ in tag_list[:7] and t.head.lemma_ != t.lemma_]):
     t = [t for t in sent if t.lemma_ in tag_list[:7] and t.head.lemma_ in tag_list[:7] and t.head.lemma_ != t.lemma_][0]
     y = [(t.i, t), (t.head.i, t.head)]
     y.sort(key=lambda tup: tup[0])
     x.append((y[0][1].text + ' ' + y[1][1].text, 2))
  if bool([t for t in sent if t.lemma_ in tag_list[:7] and t.head.head.lemma_ in tag_list[:7] and t.head.lemma_ != t.lemma_ and t.head.head.lemma_ != t.head.lemma_]):
    t = [t for t in sent if t.lemma_ in tag_list[:7] and t.head.head.lemma_ in tag_list[:7] and t.head.lemma_ != t.lemma_ and t.head.head.lemma_ != t.head.lemma_][0]
    if t.i > t.head.i > t.head.head.i:
      y = [(t.head.head.i, t.head.head), (t.head.i, t.head), (t.i, t)]
      x.append((y[0][1].text + ' ' + y[1][1].text + ' ' + y[2][1].text, 3))
x.sort(key=lambda tup: tup[1], reverse= True)
if len(x) != 0:
  print(x[0][0]) 

        ¿Este código me da la siguiente frase para la foto proporcionada en la foto? Parte anterior de este artículo:

Hay in bales 

        Esto parece una descripción relevante para la foto.

Supongo que te gusta

Origin blog.csdn.net/gongdiwudu/article/details/132332667
Recomendado
Clasificación