Uma breve introdução sobre visão computacional

O olho e o cérebro humano fazem um excelente trabalho de reconhecimento de objetos e detecção de padrões em imagens, mas replicar isso para um modelo computacional sempre foi um sonho de estudantes, pesquisadores e entusiastas da computação.

Durante as últimas décadas, pelo avanço de tecnologias de captura de imagens e da arquitetura de processamento de dados, diversas abordagens foram concebidas possibilitando que máquinas “imitassem” essa habilidade humana.

Como citado, um dos maiores desafios que motivaram as pesquisas na área da visão computacional é a detecção de objetos de interesse em uma imagem, conforme pode ser exemplificado na imagem abaixo:

cvFonte: cs.stanford.edu

Neste caso, através da soma de recursos computacionais e algoritmos específicos, é possível fazer com que uma máquina consiga identificar e aprender a diferenciar diversos objetos em uma imagem, algo que nós humanos fazemos constantemente em nosso dia a dia.

Estratégia

Para entender como um processo de visão computacional funciona, podemos analisar a seguinte imagem:

cv-strategy

Fonte: toptal.com

Obviamente, esta imagem mostra como funciona, de forma bem superficial, o fluxo de reconhecimento de imagens em vídeos, um problema específico, omitindo diversas tarefas e detalhes, pois a ideia é fornecer uma intuição inicial sobre o processo de visão computacional.

Os processos de visão computacional, muitas vezes, necessitam de uma etapa de pré-processamento envolvendo o processamento de imagens. As imagens de onde queremos extrair alguma informação em alguns casos precisam ser convertidas para um determinado formato ou tamanho e precisam ainda ser filtradas para remover ruídos provenientes do processo de aquisição da imagem.

Os ruídos podem aparecer de diversas fontes, como por exemplo, o tipo de sensor utilizado, a iluminação do ambiente, as condições climáticas no momento da aquisição da imagem, a posição relativa entre o objeto de interesse e a câmera. Note que ruído não é apenas interferência no sinal de captura da imagem, mas também interferências que possam atrapalhar a interpretação ou o reconhecimento de objetos na imagem.

Voltando para a estratégia apresentada na imagem acima, em cada frame (lembrando que vídeos são um conjunto de imagens, os frames) que a aplicação captura através da câmera, esta é convertida primeiro para sua escala de cinza, na qual possibilita termos apenas um canal de cor.

Após esta etapa, podemos definir alguns objetos (como o sol, a nuvem e a logo) nos quais queremos detectar.

Por fim, executamos algoritmos específicos que irão varrer todo frame a procura destes objetos, onde verifica-se padrões equivalentes, resultando assim em um conjunto de possíveis áreas similares a estes objetos, nas quais podemos destacar através da aplicação de contornos coloridos (verde pontilhado, na imagem).

Visão computacional

Ao iniciar um projeto de visão computacional deve-se definir quais tecnologias serão utilizadas. E não são poucas as bibliotecas disponíveis atualmente para este tipo de implementação, bem como estas estão disponíveis nas mais variadas linguagens de programação, como Java, C++, Python, etc.

OpenCV (Open Source Computer Vision) é uma biblioteca de programação, de código aberto, desenvolvida inicialmente pela Intel Corporation. O OpenCV implementa uma variedade de ferramentas de interpretação de imagens, indo desde operações simples como um filtro de ruído, até operações complexas, tais como a análise de movimentos, reconhecimento de padrões e reconstrução em 3D.

OpenCV

A biblioteca OpenCV possui mais de 500 funções. Foi idealizada com o objetivo de tornar a visão computacional acessível a usuários e programadores em áreas tais como a interação humano-computador em tempo real e a robótica. A biblioteca está disponível com o código fonte e os executáveis (binários) otimizados para os processadores Intel. Um programa OpenCV, ao ser executado, invoca automaticamente uma DLL (Dynamic Linked Library) que detecta o tipo de processador e carrega, por sua vez, a DLL otimizada para este. Juntamente com o pacote OpenCV é oferecida a biblioteca IPL (Image Processing Library), da qual a OpenCV depende parcialmente, além de documentação e um conjunto de códigos exemplos.

A biblioteca está dividida em cinco grupos de funções: Processamento de imagens; Análise estrutural; Análise de movimento e rastreamento de objetos; Reconhecimento de padrões e Calibração de câmera e reconstrução 3D.

Processamento de imagens ou Visão computacional?

Não é clara a fronteira entre o processamento de imagens e visão computacional. Podemos dizer que processamento de imagens é um processo onde a entrada do sistema é uma imagem e a saída é um conjunto de valores numéricos, que podem ou não compor uma outra imagem. A visão computacional procura emular a visão humana, portanto também possui como entrada uma imagem, porém, a saída é uma interpretação da imagem como um todo, ou parcialmente. Geralmente, os processos de visão computacional geralmente iniciam com o processamento de imagens. Conforme Gonzalez, o espectro que vai do processamento de imagens até a visão computacional pode ser dividido em três níveis: baixo-nível, nível-médio e alto-nível.

  • Os processos de baixo-nível envolvem operações primitivas, tais como a redução de ruído ou melhoria no contraste de uma imagem.
  • Os processos de nível-médio são operações do tipo segmentação (particionamento da imagem em regiões) ou classificação (reconhecimento dos objetos na imagem).
  • Os processos de alto- nível estão relacionados com as tarefas de cognição associadas com a visão humana.

O campo da visão computacional vem crescendo de maneira exponencial e diversas de suas aplicações começam a ganhar destaque, como radares inteligentes, onde um operador extrai a placa do veículo e identifica as letras e números da placa, possibilitando que os dados do veículo sejam encontrados em um banco de dados, e até mesmos os carros autônomos (Google!), que funcionam sem a necessidade de um motorista, identificando automaticamente sinais e obstáculos em seu caminho.

Conclusão

Estou preparando uma série de artigos para mostrar de forma prática, do básico ao avançado, como implementar algoritmos de visão computacional fazendo uso da linguagem Python (http://python.org) e da biblioteca OpenCV (http://opencv.org), permitindo assim que máquinas adquiram a capacidade de “enxergar” e, de certa forma, aprender através dessa habilidade, auxiliando nós humanos a resolver problemas complexos.

Até a próxima!

 

Referências:

Marengoni, M. e Stringhini, D., Introdução à Visão Computacional usando OpenCV, UFRGS, 2009.

Gonzalez, R.C. e Woods, R.E. e Eddins, S.L., Digital Image Processing using MATLAB, Pearson, 2006.

OpenCV Tutorial: Real-time Object Detection Using MSER in iOS, Disponível em <http://www.toptal.com/machine-learning/real-time-object-detection-using-mser-in-ios/>.

My Top 9 Favorite Python Libraries for Building Image Search Engines, Disponível em <http://www.pyimagesearch.com/2014/01/12/my-top-9-favorite-python-libraries-for-building-image-search-engines/>.

Written by Diego Cavalca

Graduado em Análise e Desenvolvimento de Sistemas pela UNILINS em 2012, atualmente Mestrando em Ciência da Computação na Universidade Federal de São Carlos (UFSCar).