A detecção de objetos tem como principal característica identificar onde os objetos existentes em uma imagem estão, além de dizer que objeto é este, como acontece na classificação de imagens.
Para entender a detecção de objetos, vamos começar fazendo uma provocação para encontrarmos ou pensarmos nas debilidades do algoritmo de redes neurais convolucionais que vimos aqui.
A escala das imagens
A primeira coisa a destacar é o problema da escala. Se formos lembrar dos algoritmos de convolução (redes neurais convolucionais), tínhamos um kernel (o tamanho de um filtro que varria a imagem).
Não devemos confundir o conceito de filtro existente no pré-processamento de imagens, pois ali quando falamos em filtro, é para mudar a qualidade da resolução da imagem com o objetivo de evitar os ruídos.
Nas redes neurais convolucionais, nós também chamamos o kernel de convolução – aquela quantidade e tamanho específico de pixels que vão varrer a imagem – de filtro, mas é um filtro com conceito bem diferente daquele do pré-processamento no processamento de imagens. Portanto, aqui estamos falando do kernel de convolução mesmo, daquele tamanho específico que usamos para varrer a imagem, que gera o feature map.
Quando fazemos isso para gerar um feature map, pegamos um tamanho específico de filtro (kernel), que varre a imagem inteira e, com base nisso, um feature map é gerado.
Depois, geramos diferentes features maps com base em diferentes pesos e bias: cada kernel terá pesos e bias diferentes e, com isso, produzirão features maps diferentes. Mas quando fazemos isso, não estamos imunes ao problema da escala.
Observando esta imagem de cavalos, veremos que eles são de diferentes tamanhos. Não que os cavalos tenham tamanhos diferentes uns dos outros (na verdade os cavalos têm tamanhos muito semelhantes entre si!), mas nesta figura, parece que os cavalos têm tamanhos muito diferentes. Isto porque eles estão em escalas diferentes: alguns cavalos estão mais ao fundo, outros mais à frente; e com isso, alguns cavalos acabam ficando muito maiores do que os outros.
Lembre-se que a rede neural está recebendo uma imagem em duas, ou ainda em três, dimensões. Mas essas três dimensões são canais de cores porque uma imagem só há duas dimensões: a vertical e a horizontal.
O resto são dimensões de cores. O algoritmo não tem como adivinhar que um cavalo está numa profundidade diferente, pois ele não tem essa informação sobre a profundidade.
Como redes convolucionais lidam com o problema da escala
Como, então, o algoritmo pode resolver esse problema? Nas redes neurais convolucionais, a única forma de resolver esse problema será passando várias imagens de objetos com tamanhos diferentes.
Por exemplo, se queremos aprender que existe um cavalo numa figura, precisamos passar para esse algoritmo várias imagens de cavalos de tamanhos diferentes.
Essa é a realidade: as redes neurais conseguem compreender que um cavalo pode estar posicionado em diferentes regiões – essa é uma vantagem das redes neurais convolucionais em relação às redes neurais densas, só que as redes neurais convolucionais não conseguem resolver o problema da escala, pois cada kernel tem um tamanho específico, sendo que a única diferença entre um feature map para outro é que esses kernels de tamanhos específicos possuem diferentes pesos e bias.
Ou seja, esses kernels só estão aprendendo relações naquele tamanho específico. Isso faz com que, se quisermos que uma rede neural aprenda o que é um cavalo em diferentes tamanhos e escalas, temos que informar várias imagens de cavalos – grandes e pequenos – em diferentes escalas e, com isso, ter a esperança dela ter recebido quantidade suficiente de cavalos pequenos, de maneira que, quando informamos uma figura com cavalo pequeno, ela conseguirá reconhecer; ou se oferecermos suficientes imagens com cavalos de tamanho médio, de modo que se informarmos uma nova imagem de cavalos, com tamanho médio, ela conseguirá reconhecer; e a mesma coisa se dará com cavalos de tamanho grande.
Resolvendo o problema da escala na detecção de objetos
Para a detecção de objetos, essa estratégia das CNNs não é muito eficiente. Por isso, os algoritmos de reconhecimento de objetos são um pouco mais inteligentes e conseguem resolver esse problema da escala de outra forma. Uma ideia básica e central para resolver esse problema da escala e que praticamente todos os algoritmos de reconhecimento de objetos usam é o conceito de usar diferentes tamanhos de janelas.
Vamos imaginar o seguinte: a figura que vimos é de um cavalo; e vamos escolher um tamanho específico de kernel de convolução que varrerá a imagem inteira. Começaremos com um kernel de tamanho grande no topo da figura, aí ele vai andando para o lado, depois ele andará para baixo e, assim, ele varrerá a figura completa.
Em algum momento, ele passará por aquele cavalo maior, mais ao centro da figura. Ao chegar ali, talvez ele reconheça que há um cavalo naquele kernel. Então, esse kernel está preparado para reconhecer um cavalo que preenche, mais ou menos, seu tamanho completo.
Esse é o objetivo: sempre que passamos um kernel pela figura, ele tentará reconhecer, ali, um cavalo que completa todas as suas dimensões. Quando acontecer dele passar por esse cavalo central, ele reconhecerá que naquela região há um cavalo. É como se ele raciocinasse: “Opa! Estou vendo um cavalo!”.
Quando esse kernel passar por um cavalo menor (pequeno), ele não conseguirá reconhecer que se trata de um cavalo, porque o cavalo está muito pequeno e, para o kernel, isso não passa de um borrão ou um ruído. Aquele kernel específico está tentando reconhecer cavalos grandes, pois esse é o seu objetivo.
O que podemos fazer, então? Podemos passar outro kernel, agora de tamanho menor. Começamos com o mesmo conceito: um kernel que varrerá a imagem completa; só que seu tamanho será pequeno, com o objetivo de tentar capturar cavalos que estão numa dimensão menor.
Quando esse kernel estiver passando pelo cavalo grande, ele não identificará que se trata de um cavalo; ele passará por diferentes regiões desse cavalo grande sem reconhecê-lo como tal, sendo como apenas um ruído para ele por estar numa escala muito grande:
No entanto, quando ele passa por um cavalo que está numa dimensão menor, consegue ver que ali há um cavalo. Ele o identifica por causa das características do cavalo que está preenchendo exatamente as dimensões do kernel:
Usamos apenas dois exemplos de um kernel muito grande e um muito pequeno, mas poderemos usar kernels de muitos tamanhos, até para pegarmos aqueles cavalos que não estão nem tão grandes nem tão pequenos.
Podemos pegar um kernel de tamanho intermediário que varrerá a figura inteira e, em algum momento, identificará os cavalos de dimensão intermediária.
Esse é o conceito chave da resolução do problema de escala. Podemos criar kernels de tamanhos diferentes para varrer as imagens e, com isso, tentar capturar os objetos de nosso interesse em diferentes escalas.
O que não é um objeto: background
Para a rede neural treinar, vamos passar a imagem dos cavalos, cada um recortado (os grandes, os pequenos), todos eles com os seus retângulos em volta, para a rede neural aprender o que são cavalos, da mesma forma que um problema simples de classificação de imagens.
Ao passarmos essa informação, a rede neural já sabe não apenas o que são cavalos, mas aprende o que não é um cavalo. A isso chamamos background.
Vamos imaginar que fixamos um tamanho de kernel e a rede neural varrerá a figura inteira com esse tamanho específico, quando ela estiver passando por posições que não são cavalos, como no início da figura, ela saberá que isso não é um cavalo porque, na fase de treinamento, diremos que isso não é um cavalo. Ela classificará isso como background.
Aqui, se tivermos só o objetivo de identificar o que são cavalos e o que não são, ela vai aprender que o que não é cavalo é o background.
Vamos usar bastante esta terminologia! O background é como se fosse todo o resto: há o cavalo e aquilo que não é cavalo, ou seja, todo o resto. Enquanto a rede neural estiver varrendo diferentes regiões, ela dirá: isto aqui é background, isto aqui é background e, de repente, “Opa, isto aqui é um cavalo!”; então ela conseguirá, depois, identificar o que caracteriza um cavalo em relação àquilo que não é um cavalo.
Cada algoritmo de detecção de objetos tem suas características peculiares, tendo um modo próprio para reconhecer os objetos. Mas é importante entender esse conceito geral no reconhecimento de objetos, que é um pouco mais sofisticado do que aquilo que existe nas redes neurais convolucionais.
Esta já é uma etapa um pouco mais avançada porque, além de simplesmente trabalhar com tudo o que as redes neurais convolucionais – que já são para reconhecimento de imagens, que costumam ser mais eficientes do que do que as redes densas – aqui ainda damos um passo além, resolvendo outros problemas como, por exemplo, a questão da escala.
Como aprender mais sobre detecção de objetos na prática
Muita teoria e prática são necessárias para que possamos desenvolver nossas próprias aplicações para detecção de objetos, e todos esses detalhes são abordados em nosso curso Redes Neurais, Deep Learning e Visão Computacional, sempre com foco no aprendizado do aluno, prezando pela didática, com objetividade e clareza.
Temos opções do básico ao avançado, possibilitando a todos um aprendizado completo!
Leia também: