Introdução à Visão Computacional

Entendendo como os computadores enxergam

Eduardo Eiras de Carvalho
Turing Talks
7 min readAug 16, 2020

--

Bem vindo a mais um Turing Talks! Dessa vez iremos introduzir uma área ainda não muito abordada nos nossos últimos posts, a Visão Computacional (às vezes abreviada por CV, pelo termo em inglês Computer Vision), ou “Como as máquinas enxergam?”.

A área de Visão Computacional se tornou uma das áreas mais exploradas em Computação e Inteligência Artificial, mas o que constitui essa área e por que é tão difícil de um computador extrair as mesmas informações de uma foto que um olho humano?

Foto de Blue Ox Studio em Pexel.

O sistema visual Humano não tem qualquer dificuldade interpretando a variação de luminosidade, sombras ou até mesmo diferenciando o tigre acima do resto da imagem. Para o computador, no entanto, a figura acima é apenas um monte de zeros e uns, diferente da nossa capacidade de percepção tridimensional.

Esta última década foi muito importante nos avanços em como fizemos computadores interpretarem imagens, e ainda falta muito para descobrir até onde conseguiremos ir.

Então o que é Visão Computacional?

Visão computacional é a área que estuda como os computadores “veem” e entendem imagens e vídeos digitais, desde manipulação de imagens até extração de informações. As principais aplicações da área incluem:

  • Reconhecimento facial
  • Veículos autônomos
  • Robótica
  • Reconhecimento de objetos
  • Jogos
  • Áreas da saúde
Reconhecimento de pessoas e objetos para veículos autônomos.

Hoje em dia até seu celular muito provavelmente possui diversos algoritmos de visão computacional para melhorar sua experiência e o jeito de capturar fotos e vídeos. Hospitais e laboratórios desenvolvem diversos estudos em reconhecimento de doenças através de imagens e um dia seu carro irá dirigir sem você nem mesmo encostar no volante, pelo menos segundo Elon Musk.

História da Área

No começo da área, perto de 1960, os primeiros dias de seu estudo focavam em uma tentativa de imitar a visão humana e fazer a “simples” pergunta à um computador: “O que você está vendo nessa imagem?”, na tentativa de automatizar o processo de análise. Essas tentativas iniciais foram as precursoras do reconhecimento de imagem, já que antes tudo era feito através de sensores e raio-x.

Mas as máquinas enxergam diferente de nós, seres Humanos (isso se você que está lendo realmente é um Humano), a programação direta tentando imitar fielmente nossa visão não funcionava nas máquinas. Mesmo assim, em 2001, dois pesquisadores do MIT conseguiram uma técnica de reconhecer rostos em imagens através da ideia de verificar se aquela imagem possuía formas que são comuns em rostos, uma espécie de filtros passados pela imagem inteira.

Apesar do avanço, não era possível, por exemplo, identificar qual a pessoa que estava na foto ou se havia mais alguma coisa, um carro, um pássaro, ou ainda responder a pergunta “o que o homem está fazendo na foto?” Mas você já deve estar pensando o que mudou tudo, com a vinda da era dos dados e o avanço do poder computacional, essa área pôde se aproveitar das mais recentes descobertas em Deep Learning.

A ImageNet challenge

Algumas imagens do dataset da ImageNet.

Em 2010 surgiu uma competição de visão computacional em que o objetivo era ter o menor erro em classificação de imagens em um dataset chamado ImageNet, contendo milhões de imagens de milhares de categorias, algumas imagens contendo ainda a demarcação dos objetos a serem classificados.

Abaixo podemos olhar, para cada ano, o melhor resultado de cada equipe, sendo cada “bolinha” uma equipe.

Taxa de erro da competição, mostrando o melhor resultado de cada equipe.

Você, um leitor atencioso, notou que em 2012 uma das equipes foi extremamente melhor que as outras e, ainda mais, muito melhor que o ano anterior. O que aconteceu neste ano?

Em 2012, o vencedor, Alex Krizhevsky, desenvolveu a AlexNet, uma rede neural convolucional (pode ver nossos textos de redes neurais, em que começamos a explicar a rede convolucional aqui) que despertou um enorme interesse na comunidade de Deep Learning e CV. Desde então todas as equipes utilizam esta técnica em competições de CV e os resultados foram cada vez mais próximos, como se pode ver acima.

Antes de entendermos melhor as técnicas atuais mais avançadas na área, ainda precisamos entender o que de fato as máquinas enxergam.

Como os Computadores “enxergam”?

Como um Humano, nós conseguimos perceber o espaço tridimensional à nossa volta, a diferença de luz, sombras e, sem esforços, diferenciar cada aspecto de objetos e suas superfícies. A intuição de como uma máquina enxerga vem de que cada pedacinho de uma imagem pode ser o quão claro ou escuro será aquele pedaço de foto. Cada pedacinho de imagem é chamado de um “pixel”, dessa forma conseguimos formar imagens monocromáticas, ou seja, preto e branco.

As cores são comumente armazenadas em 8-bits, assim temos 2⁸=256 valores possíveis de intensidade para uma cor, sendo 0 sua ausência (preto), e 255 a intensidade máxima (branco).

Para imagens coloridas devemos ter uma sobreposição de pixels de três cores: vermelho, verde e azul, o famoso espaço de cores RGB (red, green, blue):

A sobreposição das três cores na maior intensidade forma o branco.

Existem outros espaços de cores, mas por enquanto é suficiente entender apenas este. Para formar todas as cores que enxergamos digitalmente basta atribuir um valor de 0 a 255 para vermelho, verde e azul e, sua sobreposição, formas as demais cores.

Se você tirar uma foto próxima da sua tela é fácil ver que ela é composta por pixels vermelhos, verdes e azuis.

Na imagem acima o branco é a intensidade máxima das três cores (pode se ver o vermelho, o verde e o azul lado a lado) e o preto é a ausência delas. O laranja é algo próximo da intensidade máxima do vermelho, um pouco de verde e nada de azul.

Resumindo: Uma imagem para um computador nada mais é do que uma matriz de pixels! Simples! Um vídeo então é apenas uma sequência de imagens, ou seja, uma sequência de matrizes de pixels.

Visualizando imagens em preto e branco

Vamos visualizar, utilizando Python, a imagem de uma releitura do logo do Grupo Turing em preto e branco.

Versão simplificada do logo em preto e branco.

Como as imagens são comumente armazenadas em três canais (acho que você já cansou de me ouvir falar de RGB), devemos levar isso em conta na hora de observar e manipular imagens, no caso abaixo iremos pegar o primeiro canal pois, como a imagem é preta e branco, os três canais são iguais. Além disso, é uma prática comum normalizarmos (dividindo por 255, que é o valor máximo de intensidade dos pixels) os valores dos pixels e passarmos os valores entre 0 e 1.

Agora vamos selecionar apenas uma parte da imagem e visualizar como essa informação está sendo guardada para o computador.

Na penúltima linha estamos selecionando o primeiro canal de cores ao fazer img[:, :, 0].

Se mostrarmos o array apenas da parte da direita, esperamos ver 1 onde a imagem é branca e zero onde a imagem é preta, vamos conferir:

Array numpy da parte da imagem em específico.

Vemos que os zeros e uns formam exatamente o pedaço de reta acima.

Brincando com cores

Se quisermos fazer imagens coloridas no computador, fazemos igual o exemplo acima, a diferença é que para cada ponto da imagem (cada pixel) devemos ter três valores de 0 a 1, cada um correspondente à intensidade R, G e B.

Um “ponto” laranja.

Vemos que nosso array acima tem três dimensões: a posição em Y, a posição em X e a terceira dimensão são os três valores que definem a cor. Vamos montar uma malha colorida para entender melhor essa disposição:

Cores do arco íris.

O que ainda não se consegue fazer?

Apesar do desenvolvimento acelerado da área, é importante sabermos seus limites, se não, por que ainda não temos nenhum carro totalmente autônomo?

Um dos principais motivos para isso é que a maior parte dos últimos avanços foi na área de reconhecimento de imagem, enquanto que o próximo passo é o conhecimento visual!

Consegue-se identificar muito bem rostos, pessoas, animais, objetos em imagens, mas ainda não temos o conhecimento de o que está na imagem, como por exemplo:

Imagem de um show da banda Red Hot Chilli Peppers.

Uma máquina consegue, atualmente, facilmente reconhecer duas pessoas na imagem e, dependendo do algoritmo, consegue ainda reconhecer um baixo e um amplificador. Mas qualquer ser Humano conseguiria descrever a foto como: “Um homem de camiseta branca, tatuado, de bigode está cantando em um palco com luzes roxas enquanto outro homem tatuado está sem camiseta, tocando baixo com o cabelo pintado de laranja”.

Na realidade, já existem redes que performam razoavelmente esta tarefa de descrição de imagem, também chamada de image captioning, mas ainda estão longe de performar tão bem quanto na tarefa de classificação por exemplo.

Este nível de descrição elevado ainda não está disponível nas máquinas e será uma habilidade essencial para automação de diversos processos. Certamente um carro que consegue, além de reconhecer uma pessoa na rua, dizer se ela está planejando ou não atravessá-la na faixa, será muito mais seguro de deixar fazer todo o trabalho.

Não estamos lá ainda, mas com o passo de evolução que o mundo está observando na área além de evoluções na capacidade computacional e número de dados disponíveis, é bem provável que chegaremos lá. Enquanto isso, continue acompanhando nossos Turing Talks.

E se quiser conhecer um pouco mais sobre o Grupo Turing, não deixe de seguir as nossas redes sociais: Facebook, Instagram e LinkedIn.

Obrigado e até o próximo.

--

--

Eduardo Eiras de Carvalho
Turing Talks

Estudante de Engenharia Mecatrônica na USP, membro do Grupo Turing e extremamente interessado em IA, principalmente CV e RL nos campos de Robótica.