Detecção de Objetos com YOLO – Uma abordagem moderna

Uma das ferramentas de Visão Computacional que tem ganhado muita atenção nos últimos anos é o YOLO: You Only Look Once.

Após o seu lançamento em 2015, o YOLO foi logo reconhecido como uma técnica inovadora pois através de uma abordagem totalmente nova foi capaz de obter uma precisão igual ou superior ao dos outros métodos de detecção de objetos da época, porém com uma velocidade de detecção muito superior.

Teste realizado com o modelo padrão do YOLOv4 (créditos do vídeo usado: pexels.com)

Enquanto as técnicas mais precisas levavam aproximadamente 0.5 segundos (ou mais) para processar uma imagem, o YOLO conseguia detectar com o mesmo nível de precisão em menos de 0.05 segundos, o que permitiu ser utilizado em aplicações de tempo real, sendo capaz de rodar até em uma taxa de 30 frames por segundo.

Outro motivo do sucesso do YOLO é o fato de ser totalmente código aberto e livre de licenças de uso. Ou seja, desde o código fonte, até a arquitetura da rede neural e os pesos pré-treinados, tudo isso pode ser usado por qualquer um e de qualquer forma.

Atualmente, essa técnica é considerada o estado da arte em detecção de objetos em tempo real. Em abril de 2020, quase 5 anos após o lançamento de sua primeira versão, o YOLO tem a sua quarta versão oficialmente publicada. Até o momento da data de sua publicação, o YOLOv4 é o detector de objetos com maior acurácia que permite ser executado em tempo real de acordo com os testes realizados utilizando o dataset MS COCO.

Confira abaixo uma demonstração do que o YOLOv4 é capaz de fazer:

O início do YOLO

O YOLO foi desenvolvido por Joseph Redmon e Ali Farhadi em 2015 durante o seu doutorado.

Em sua palestra na TED Talks, Redmon faz uma demonstração em tempo real da primeira versão do YOLO, quando sua arquitetura era um pouco diferente comparado à da versão atual, porém os conceitos principais continuam os mesmos.

Durante a apresentação, ele faz uma demonstração ao vivo provando que o detector é capaz de executar em sua GPU a detecção de até 80 categorias de objetos simultaneamente a uma taxa de mais ou menos 30 FPS, e mantendo uma ótima precisão, o que foi revolucionário para a época.

Assista abaixo Joseph Redmon apresentando o YOLO em sua palestra “How computers learn to recognize objects instantly”

Classificação de Imagens e Detecção de Objetos

Antes de compreender a importância do YOLO, vamos apenas revisar rapidamente o que é a detecção de objetos.

Diferente da classificação, que busca apenas prever a classe presente na imagem, a detecção de objetos além de prever qual é a classe precisa identificar também a localização do objeto nessa imagem. 

Por exemplo, quando construímos um classificador de cachorro e gatos, o nosso classificador vai retornar como resultado da predição a classe (cachorro ou gato) e a confiança (grau de certeza sobre aquela predição).

Créditos da imagem: becominghuman.ai

Mas e se a imagem tiver tanto o gato quanto o cachorro? Poderíamos talvez treinar classificadores multi-classe que vão ser capazes de identificar as duas classes (tanto cachorro como gato). 

O retângulo que contém a localização do objeto é chamado de caixa delimitadora (bounding box).

No entanto, nós ainda não temos como saber a localização do cachorro ou gato na imagem. Esse problema de identificar a localização de um objeto (dada a classe) em uma imagem é chamado de localization (localização).

Ser capaz de predizer a localização do objeto na imagem junto com a classe do objeto (para múltiplas classes) é o que chamamos de Detecção de Objetos.

Mas afinal, o que é exatamente o YOLO? Qual sua vantagem para a detecção de objetos?

YOLO é um método de detecção de objetos de passada única (single pass) que utiliza uma rede neural convolucional como extrator de características (features).

Diferente de algoritmos anteriores de detecção de objetos, como R-CNN ou Faster R-CNN, ele apenas precisa olhar pela imagem uma única vez para enviar para a rede neural.

Por isso ele recebe esse nome (You Only Look Once – “Você só olha uma vez”).

E devido a essa característica, o YOLO foi capaz de conseguir uma velocidade na detecção muito maior do que as técnicas concorrentes, sem perder em acurácia.

Funcionamento

O YOLO trata a detecção de objetos como um simples problema de regressão.

1. Primeiro, o algoritmo divide a imagem em um grid de S x S células. Como exemplo usaremos 13×13, porém esse tamanho pode mudar. Para as versões mais recentes por exemplo tem-se preferido utilizar um grid de 19×19.

2. Cada uma dessa células é responsável por fazer a predição de 5 caixas delimitadoras (B), para caso haja mais de um objeto naquela célula. Também é retornado a pontuação de confiança que nos diz o quanto de certeza ele tem que aquela caixa delimitadora contenha um objeto.

3. Para cada caixa, a célula também faz a previsão de uma classe. Isso funciona como se fosse um classificador: é fornecido um valor de probabilidade para cada uma das classes possíveis. O valor de confiança para a caixa delimitadora e a predição da classe são combinados em uma pontuação final, que vai nos dizer a probabilidade dessa caixa conter um objeto específico.

Nesse caso o grid é 13×13, o que no final resulta em 169 células. Para cada uma dessas células são detectados 5 caixas delimitadoras, o que resulta em 845 no total. 

4. Acontece que a maioria dessas caixas terá um valor de confiança extremamente baixo, então por isso geralmente se considera apenas as caixas cuja pontuação final seja 30% ou mais. Esse valor de 30% é o limiar, chamado de threshold, e ele pode ser alterado dependendo do quão preciso você quer que o detector seja.

Obs: Esse valor B (para as caixas delimitadoras) nesse exemplo é 5 porém pode mudar conforme a versão do YOLO. No YOLOv2 por padrão é = 5. Já no YOLOv3 o B = 3, porém é importante comentar que a partir dessa versão é feito a predição em 3 diferentes escalas, portanto vai ser mais de um feature map de saída com diferentes tamanhos (divide-se por 32, 16 e 8). Ou seja, para uma resolução de 416×416 serão 10647 boxes no total por imagem (416/32 = 13, 416/16 = 26, 416/8 = 52)

((52 x 52) + (26 x 26) + (13 x 13)) x 3 = 10647

Caso deseje saber mais sobre o funcionamento dessa etapa veja esse artigo aqui.

Darknet

A logo do Darknet

Para o seu funcionamento o YOLO utiliza uma rede neural profunda, cuja arquitetura é chamada de Darknet, que é o mesmo nome do framework utilizado para implementar o detector.

Esse framework foi desenvolvido pelo próprio criador do YOLO, Joseph Redmon.

Ele é open source e escrito na linguagem C, também possui suporte para GPU.

O YOLO comparado a outras técnicas de detecção de objetos

Haar cascade, um dos métodos clássicos mais conhecidos para detecção de objetos. Créditos da imagem: GREG BORENSTEIN

Ao longo dos anos foram desenvolvidas diversas abordagens e metodologias para resolver esse mesmo problema da detecção de objetos. A técnica Haar Cascades (Viola e Jones, 2001) foi considerada a primeira abordagem a conseguir resultados realmente satisfatórios e que pudessem ser implementados em aplicações reais, sendo até hoje ainda bastante utilizada.

Poucos anos depois, em 2005, é apresentado o HOG – Histogram of Oriented Gradients (Navneet Dalal e Bill Triggs), o que também foi considerado um marco importante para essa área.

Mais tarde, com a ascensão do Deep Learning, foram desenvolvidos métodos baseados em Redes Neurais Convolucionais (CNN). Dentre os principais, podemos citar:

  • R-CNN – Region-based Convolutional Neural Networks 
  • SPP-net – Spatial Pyramid Pooling
  • Fast R-CNN
  • Faster R-CNN

Com o tempo, esses algoritmos baseados em Deep Learning começaram a se tornar mais viáveis, pois no início era extremamente demorado para executar.  Para se ter uma ideia, o R-CNN por exemplo levava 50 segundos aproximadamente para processar uma imagem, enquanto que o Faster R-CNN conseguiu anos mais tarde reduzir para 0.2 segundos.

E onde o YOLO se encaixa?

O YOLO veio logo depois, junto com o Faster R-CNN.

A vantagem do YOLO frente aos outros métodos é que esse faz as predições da classe com uma única passada na rede. Antes dele, esses outros principais sistemas de detecção de objetos faziam a detecção através da divisão da imagem em várias partes e depois em cada pedaço da imagem se executava um classificador, em cada uma dessas regiões (como é o caso do Haar Cascade por exemplo). 

As pontuações altas retornadas por esse classificador eram consideradas detecções na imagem (ou seja, os próprios objetos).

Podemos usar um classificador como VGGNet ou Inception e transformá-lo em um detector de objetos se usarmos uma janela que se desloca pela imagem (sliding window). Em cada etapa é rodado um classificador para obter uma predição a respeito de que tipo de objeto é dentro da janela. Usando a janela deslizante pode-se retornar centenas ou milhares de predições para aquela imagem, mas mantemos apenas aquelas que o classificador possui uma certeza maior.

Créditos da imagem: PyImageSearch

Isso significa que é necessário rodar o mesmo classificador dezenas ou milhares de vezes sobre a mesma imagem. Mas diferente de quando estamos usando uma abordagem clássica como o Haar Cascade, ao lidarmos com uma técnica que utiliza redes neurais artificiais (ou seja, baseada em Deep Learning) é muito demorado e pesado executar a mesma operação sobre a imagem milhares de vezes, ainda mais se for rodar isso em condições normais usando um computador convencional. 

Comparando com esses outros métodos, o YOLO possui uma abordagem completamente diferente. Ele não é um classificador tradicional que foi reajustado para ser um detector de objetos, mas sim foi feito para ser capaz de rodar por toda a imagem apenas de uma vez, fazendo isso de uma forma inteligente.

Créditos: YOLO Paper

Desse modo, com o método YOLO é possível realizar a detecção em tempo real, ou quase real dependendo das configurações de hardware da máquina onde está sendo rodado.

A evolução do YOLO

Joseph Redmon introduziu a primeira versão em seu paper publicado em junho de 2015: You Only Look Once: Unified, Real-Time ObjectDetection.

Em dezembro de 2016, Redmon e Ali Farhadi introduziram o YOLOv2 com o paper: “YOLO9000: Better, Faster, Stronger. Mais preciso e mais rápido que a versão anterior.

Em abril de 2018, o YOLOv3 (“YOLOv3: An Incremental Improvement“) demonstrou uma grande melhora na eficiência da predição. No entanto, no geral ele não é mais rápido que a versão anterior. A principal novidade é a predição da imagem em 3 diferentes escalas, o que resolveu o principal problema da versão anterior que era a dificuldade para reconhecer objetos muito pequenos na imagem. Essa novidade também é o principal motivo de não ser mais rápido que o seu antecessor, já que tal função exigiu mudanças na arquitetura e funcionamento, que tornaram o processo mais pesado.

YOLOv4 – Mais rápido e mais preciso

A quarta versão do YOLO foi lançada em abril de 2020, sendo oficializada após a publicação do paper “YOLOv4: Optimal Speed and Accuracy of Object Detection” por Alexey Bochkovskiy, Chien-Yao Wang e Hong-Yuan Mark Liao.

As principais características que podem ser destacadas nessa versão são a melhoria na velocidade de inferência e acurácia. Outra característica importante é o fato de ser mais eficiente para rodar em GPUs, pois foi otimizada para utilizar menos memória.

Mas o quão bom essa nova versão realmente é?

O YOLOv4 demonstrou ser o melhor detector de objetos para testes em tempo real de acordo com as métricas do MS COCO, um famoso dataset utilizado para avaliar os sistemas de detecção de objetos.

Além de ser mais rápido e mais preciso que o EfficientDet, o YOLOv4 também supera o RetinaNet/MaskRCNN (Facebook Pytorch/Detectron) no dataset COCO.

Comparação entre YOLOv4 e as outras abordagens mais eficientes atualmente. Créditos da imagem: YOLOv4 Paper

O que os autores do YOLOv4 fizeram foi melhorar essa arquitetura através de inúmeras otimizações realizadas.

A sua arquitetura final consiste em: 

  • Backbone: CSPDarknet53
  • Neck: SPP, PAN
  • Head: YOLOv3

Além disso, foram implementadas várias técnicas modernas. Umas das novidades mais importantes foi a introdução de um novo método de data augmentation chamado de Mosaic e Self-Adversarial Training (SAT).

Implementando o YOLO para detecção de imagens

Primeiramente vamos clonar o repositório do darknet (por AlexeyAB, o mais atualizado atualmente), que contém todos os arquivos e ferramentas necessárias para fazer a implementação do YOLO.

!git clone https://github.com/AlexeyAB/darknet

Em seguida vamos acessar o diretório

%cd darknet

Agora vamos compilar o Darknet usando o comando “make”

!make

O YOLO por padrão já foi treinado com o conjunto de dados do MS COCO, que possui 80 classes diferentes. Vamos pegar esses pesos pré-treinados para que possamos executar o YOLO v4 nessas classes pré-treinadas. Precisamos baixar separado pois esses pesos possuem mais de 200mb.

!wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

Agora estamos com tudo pronto para realizar os testes. Para rodar a detecção utilizaremos o seguinte comando

!./darknet detect <arquivo config> <arquivo dos pesos> <imagem> 

Veja um exemplo abaixo:

./darknet detect cfg/yolov4.cfg yolov4.weights data/person.jpg
Resultado obtido com a detecção que realizamos no exemplo acima

O teste acima foi executado no Google Colab utilizando a GPU Tesla T4. O tempo total de processamento foi de aproximadamente 0.07 segundos.

Portanto, com esse teste podemos comprovar como o YOLO consegue processar a imagem com uma impressionante velocidade nas GPUs, enquanto mantém uma ótima precisão em sua detecção.

Assim como vários outros sistema de detecção de objetos, o YOLO é de uso geral, o que significa que ele pode ser usado para muitos propósitos diferentes, basta treinar para qualquer categoria de imagem que você deseja detectar. 

O mesmo código usado para encontrar pessoas ou animais pode ser usado para encontrar células cancerígenas em uma biópsia de tecido, por exemplo.

Detecção de massas mamárias cancerígenas em uma mamografia usando YOLO. Créditos da imagem: ScienceDirect.com

Há pesquisadores no mundo todo que já utilizam essa tecnologia, o que permitiu o avanço em várias áreas como medicina e robótica.

Além disso, podemos ver a detecção de objetos sendo utilizada em várias outras aplicações modernas, desde em rastreamento de objetos e nos aplicativos do seu celular, até em veículos autônomos, que já são uma realidade nos dias de hoje em muitos locais do mundo e aos poucos vão ganhando cada vez mais espaço.

Referências