YOLO: um sistema para detecção de classes de objetos em tempo real

AGRADEÇA AO AUTOR COMPARTILHE!

Neste artigo tratamos de uma ferramenta de visão computacional para detecção e classificação de objetos em tempo real chamada YOLOYou Only Look Once.

Por si só, o nome já é bastante provocativo, e talvez seja um dos motivos de ela estar recebendo tanta atenção ultimamente. Certamente, o nome mostra muito bem o seu objetivo: em uma pequena fração de segundo  – dez vezes mais rápido que um piscar de olhos , o sistema consegue detectar até 80 classes de objetos diferentes em uma imagem ou em um frame de vídeo.

Outros fatores que fazem o YOLO ser um must have em nossa caixa de ferramentas:

  • Atualmente, é o estado da arte em sistemas de reconhecimento de objetos em tempo real, de acordo com um compromisso entre velocidade e assertividade;
  • É totalmente código aberto e livre de licenças de uso, ou seja, tudo nesta tecnologia (o código-fonte, a arquitetura da rede neural, os pesos com os quais esta rede é executada e os datasetsusados para treinar a rede) é livre e pode ser usado por qualquer um, de qualquer forma.

De uma forma geral, deteccão de objetos sempre foi  –  e continua sendo  –  uma área bastante fértil, atraindo a atenção tanto da comunidade acadêmica e científica quanto de empresas interessadas em fornecer soluções relacionadas. O termo “detecção de objetos” pode ter um sentido bastante amplo, indo da simples detecção de objetos inanimados, passando pela classificação destes objetos em tamanho, tipo, cor etc., até a identificação de seres humanos. Para esta última aplicação, existem ferramentas que fazem tão somente a classificação do objeto “cabeça” ou ainda extração de características pertinentes, como idade, sexo, biotipo e estado emocional.

Algumas notícias citam ferramentas que monitoram o comportamento dos alunos em sala de aula na China. Segundo um artigo recente, a tecnologia de reconhecimento facial em larga escala está sendo usada também para o policiamento urbano. Câmeras estão sendo utilizadas para detectar pedestres imprudentes, encontrar fugitivos, controlar o trânsito e até mesmo prevenir crimes.

Mas não precisamos ir até a China para buscar exemplos. Na cidade de São Paulo, um sistema de reconhecimento facial será implantado para medir a reação de usuários às propagandas exibidas nas estações. Em Nova Venécia, município do Espírito Santo, cinco escolas públicas estão sendo usadas para testar tecnologias de reconhecimento facial. O objetivo é controlar a frequência escolar, ter maior comunicação com as famílias dos alunos e até mesmo diminuir o desperdício de merenda.

Este vídeo (abaixo) já mostra uma das possíveis aplicações de sistemas de reconhecimento de objetos em tempo real: seu uso em carros autônomos. Percebam a rapidez com que o sistema detecta os objetos, desenhando uma bounding box ao redor de cada um, e classificando-os conforme a classe detectada. Isso se faz possível através de uma ferramenta de machine learning chamada rede neural convolucional (convolutional neural network, ou CNN, em inglês).

Pretendemos abordar mais detalhes do YOLO nos próximos artigos, por isso vamos propositalmente deixar esta primeira parte mais superficial. O objetivo é ir direto ao ponto e saber como podemos executar o YOLO em nosso computador.

Todas as informações necessárias estão disponibilizadas neste site: https://pjreddie.com/darknet/.

Antes de sair rodando desesperadamente qualquer coisa, é legal dar uma boa olhada no site, ler sobre as implementações do YOLO, sobre o darknet (código-base em linguagem C onde a rede neural é implementada) e sobre os datasets pré-treinados existentes para o YOLO.

Depois disto, pode-se fazer um clone do repositório. Abra um terminal e execute o seguinte comando:

git clone https://github.com/pjreddie/darknet

Não é muita coisa (~16MB). Logo depois, o projeto precisa ser compilado (sim, é compatíveal com Windows, Linux e Mac  –  já rodamos em todos eles).

cd darknet; make

O YOLO não depende de quase nada. Para quem é desenvolvedor e já possui toolchains de compilação e ferramentas usuais para isto (make, git, pkg-config, build-essential, entre outras), basta fazer um make mesmo.

YOLO utiliza uma rede neural profunda, cuja arquitetura é chamada de darknet (sim, tem o mesmo nome do projeto em si  –  a coisa é meio confusa…). Esta arquitetura (camadas convolucionais, filtros, funções de ativação) é descrita por um arquivo de configuração chamado yolov3.cfg, localizado no diretório cfg/ do projeto. Mas, além da arquitetura da rede neural, são necessários também os parâmetros de treinamento desta rede (pesos e tendências  – ou, em inglês, weights e biases). O arquivo de parâmetros deve ser obtido separadamente, pois é muito grande (237MB!).

Execute então este comando para fazer o seu download:

wget https://pjreddie.com/media/files/yolov3.weights

Temos agora todos os artefatos para executar uma detecção! Execute o comando:

./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg

Este comando significa que estamos usando a rede neural descrita pelo arquivo cfg/yolov3.cfg com o pesos dados por yolov3.weights, com o dataset descrito por cfg/coco.data para detectar objetos na imagem data/dog.jpg. Você verá a seguinte saída no seu terminal:

layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32 0.299 BFLOPs
1 conv 64 3 x 3 / 2 416 x 416 x 32 -> 208 x 208 x 64 1.595 BFLOPs
…….
105 conv 255 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 255 0.353 BFLOPs
106 detection
truth_thresh: Using default ‘1.000000’
Loading weights from yolov3.weights…Done!
data/dog.jpg: Predicted in 0.029329 seconds.
dog: 99%
truck: 93%
bicycle: 99%

O que vemos acima é a rede neural sendo carregada, o tempo com que o resultado foi calculado (0,029 s) e uma lista com os objetos detectados e a taxa de confidência de cada um.

O resultado, neste momento, não se apresenta graficamente, mas é salvo em um arquivo chamado predictions.png. Abra-o para ver o resultado.

yolo-deteccao-objetos

O tempo de 0,029 segundo é realmente muito bom e condiz com o que falamos no primeiro parágrafo. Provavelmente, este resultado foi obtido com o uso de um computador dotado de GPU (graphics processing unit), que dispõe de um grande poder de processamento paralelo. Mas, executando o mesmo teste em um computador mais tradicional (um MacBook Air com Core i5, com 4GB de RAM e sem GPU), este tempo aumenta para 13 segundos. O sistema funciona e dá os mesmos resultados, mas neste caso não estamos mais falando em reconhecimento em tempo real.

Abaixo outro teste que fizemos no laboratório:

Mais um dia normal no DBLab: José cortando um celular e Felipe comendo um livro.

Mais um dia normal no DBLab: José cortando um celular e Felipe comendo um livro.

Veja no resultado acima as classes de objetos que foram detectadas. Por algum motivo, o YOLO não conseguiu detectar o livro, apesar de esta classe estar presente no dataset utilizado.

É muito legal fazer testes com o YOLO e ver o que ele consegue detectar. Mas o mais legal mesmo é ver ele em ação para uma entrada de vídeo em tempo real. Para que isso seja viável computacionalmente, é indispensável o uso de uma boa GPU. Nossa configuração de hardware utiliza uma GPU NVidia GTX 1060, já suficiente para obter uma velocidade de 20 frames por segundo para o dataset COCO (ou seja, um frame a cada 0,05 segundo).

Aqui, mais um exemplo do YOLO rodando em tempo real: 

Bom, o objetivo deste artigo foi lançar a provocação do problema de detecção de objetos em visão computacional, e dar uma rápida introdução ao YOLO. Vamos parar por aqui, mesmo sabendo que tem muita coisa a ser discutida ainda.

Nos próximos artigos, vamos abordar alguns detalhes do código-fonte do projeto darknet, arquitetura da rede neural, revisão histórica de outras redes também usadas em visão computacional, datasets de treinamento e talvez um dos pontos mais relevantes: como personalizar o sistema e treiná-lo para reconhecer objetos específicos.

AGRADEÇA AO AUTOR COMPARTILHE!

Felipe Kühne

Mais artigos deste autor »

Líder técnico do DBLab, o laboratório de inovação da DBServer. Professor da Escola Politécnica da PUCRS. Mestre em Engenharia Elétrica pela UFRGS. Entusiasta de tecnologia e robótica.


Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">