Visão Computacional e PNL para Processamento Inteligente de Imagens

Moscou, a cidade do mistério... (Esta foto é fornecida por Igor Shabalin)

1. Descrição

        Hoje em dia, todo mundo com um smartphone tem potencial para ser fotógrafo. Como resultado, toneladas de novas fotos aparecem em mídias sociais, sites, blogs e bibliotecas de fotos pessoais todos os dias. Embora o processo de tirar fotos possa ser muito empolgante, separá-las e descrevê-las manualmente depois pode ser tedioso e demorado.

        Este artigo discute como as técnicas de visão computacional (CV) e processamento de linguagem natural (NLP) podem ser combinadas para obter um conjunto de rótulos descritivos para fotos e, em seguida, gerar descrições significativas com base nesses rótulos, economizando um tempo valioso.

2. O que está na foto?

        Nós, humanos, podemos responder a essa pergunta em uma fração de segundo, uma vez que a foto esteja em nossas mãos. As máquinas também podem responder a essa pergunta, desde que estejam familiarizadas com CV e PNL. Por favor, veja as fotos abaixo:

Como seu aplicativo sabe o que está na imagem acima? Com uma ferramenta como a Predict API da Clarifai , isso pode ser muito fácil. Aqui está um conjunto de tags descritivas que a API fornece após o processamento da foto acima:

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

        Como você pode ver, essas tags fornecem informações apropriadas sobre o que pode ser visto na imagem. Se tudo o que você precisa é categorizar automaticamente seu conteúdo visual, ter essas tags deve ser suficiente para realizar seu trabalho. No entanto, para a tarefa de geração de descrição de imagem, você precisa dar um passo adiante e aproveitar algumas técnicas de PNL.

        Neste artigo, você verá um exemplo simplificado de como isso pode ser feito, mostrando como tecer algumas das palavras na lista de tags resultante em frases simples. Para uma discussão conceitual sobre esse tópico, você também pode conferir meu artigo no blog da Clarifai: Generating Image Descriptions Using Natural Language Processing .

3. Prepare-se

        Para seguir os scripts discutidos neste artigo, são necessários os seguintes componentes de software:

Python 2.7+∕3.4+

spaCy v2.0+

Um modelo inglês pré-treinado para spaCy

Cliente Python da API Clarifai

Chave API Clarifai

        Você pode encontrar instruções de instalação nos respectivos sites. Entre outras coisas, você precisará de uma biblioteca Python que permita buscar e analisar dados da Wikipédia.

4. Marcar fotos automaticamente

        Primeiro, vamos dar uma olhada no código que você pode usar para marcar fotos automaticamente. Na implementação abaixo, usamos o modelo genérico de reconhecimento de imagem da Clarifai para obter rótulos descritivos para as 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 testar a função acima, você pode anexar o seguinte bloco principal ao seu script:

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

        Neste exemplo específico, escolhemos as sete principais tags descritivas geradas para as fotos enviadas. Então, para a foto fornecida na foto, o que há dentro da foto? Na seção anterior, esse script produziu a seguinte lista de tags descritivas:

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

        Isso é suficiente para fins de classificação e pode ser usado como fonte de dados para NLP gerar descrições significativas, conforme descrito na próxima seção.

5. Use a PNL para converter rótulos descritivos em descrições

        Dizem-nos na escola que para dominar uma língua é preciso ler muito. Em outras palavras, você tem que treinar nos melhores exemplos da linguagem. De volta à nossa discussão, precisamos de algum texto que use palavras da lista de tags. Claro, você pode obter um corpus enorme, como o despejo do banco de dados da Wikipedia, que contém toneladas de artigos diferentes. No entanto, na era da pesquisa orientada por IA, você só pode restringir seu corpus ao texto mais relevante para as palavras na lista de tags que possui. O código a seguir mostra como obter o conteúdo de uma única entrada da Wikipedia, que contém informações relacionadas a uma lista de tags (você precisará anexar isso ao código na função principal da seção anterior):

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

        Agora que você tem alguns dados de texto para processar, é hora de colocar o NLP para funcionar. Aqui estão as etapas iniciais para inicializar o pipeline de processamento de texto do spaCy e aplicá-lo ao texto (anexando-o ao trecho de código anterior).

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

        No código abaixo, você percorre as sentenças no texto submetido, analisando as dependências gramaticais em cada sentença. Em particular, você procura frases que contenham palavras da lista de tokens enviada. Em uma frase, as duas palavras da lista devem estar gramaticalmente relacionadas à relação cabeça/filho. Se você está confuso com a terminologia usada aqui, recomendo verificar Natural Language Processing with Python , que explica os conceitos de PNL em detalhes e inclui muitos exemplos fáceis de seguir. Você pode começar a ler imediatamente: os capítulos  2 e 12 são gratuitos. Além disso, um exemplo de como a análise de dependência sintática pode ser usada na prática pode ser encontrado em meu artigo recente para a Oracle Magazine sobre  geração de intenções e entidades para habilidades do Oracle Digital Assistant .

        Voltando ao código abaixo, observe que isso é uma simplificação - é claro que o código do mundo real será um pouco mais complexo. (anexe o código abaixo ao código anterior no 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]) 

        Esse código me dá a seguinte frase para a foto fornecida na foto? Parte anterior deste artigo:

Hay in bales 

        Esta parece ser uma descrição relevante para a foto.

Acho que você gosta

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