Você está na página 1de 67

DETECÇÃO DE OBJETOS COM YOLO, DARKNET, OPENCV E PYTHON

CONTEÚDO
• Teoria básica sobre detecção de objetos e YOLO
• Detecção de objetos em imagens com Darknet e
OpenCV
• Detecção de objetos em vídeos com Darknet e
OpenCV
• Treinamento para detecção de objetos personalizados
• Anexos
• Redes neurais artificiais
• Redes neurais convolucionais
CLASSIFICAÇÃO DE IMAGENS

• Classificação de imagens tenta


prever qual objeto a imagem
contém
• Predição se é um gato ou se é um
cachorro Créditos da imagem: https://cv-tricks.com/

• E se a imagem tiver tanto o gato


quanto o cachorro, como que
faremos? O que o modelo vai
prever?
CLASSIFICAÇÃO DE IMAGENS

• Treinar classificadores
multi-classe para
identificar duas (ou
mais) classes
• Identificar a localização
de um objeto (dada a
classe) em uma imagem
é chamado de
localization Créditos da imagem de exemplo: https://www.pexels.com/

(localização)
DETECÇÃO DE OBJETOS

•Previsão da classe e da
localização do objeto
•O retângulo contendo a
localização do objeto é
chamado de caixa
delimitadora (bounding
box)
Créditos da imagem: zerotosingularity.com/
DETECÇÃO DE OBJETOS

Para descrever a caixa delimitadora são


necessários 4 variáveis (5 se for considerar
o nome da classe)
• coordenada x de início (left X)
• coordenada y de início (top Y)
• largura da caixa
• altura da caixa

Observação: alguns sistemas ou bibliotecas podem usar


diferentes variáveis. Por exemplo, ao invés de largura e
altura é possível utilizar mais duas coordenadas X e Y para
delimitar onde a caixa “termina”.
DETECÇÃO DE OBJETOS

Abordagens para detecção de objetos


• Haar Cascades (Viola e Jones, 2001)
• HOG - Histogram of Oriented Gradients (Navneet Dalal e Bill
Triggs, 2005)
• Redes neurais convolucionais
• R-CNN - Region-based Convolutional Neural Networks
• SPP-net - Spatial Pyramid Pooling
• Fast R-CNN
• Faster R-CNN
Créditos: https://cv-tricks.com/object-detection/faster-r-cnn-yolo-ssd/
YOLO (YOU ONLY LOOK ONCE)

• Método de detecção de objetos de passada


única (single pass) que utiliza uma rede
convolucional como extrator de características
(features)
• Diferente de outros algoritmos 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
• Utiliza uma rede neural única usando as
características da imagem inteira para detectar
múltiplas caixas, cada uma contendo um objeto
• Dimensões pré-definidas (âncoras) a de objetos
anotados no conjunto de treinamento
YOLO E DARKNET

O YOLO utiliza uma rede neural


profunda, cuja arquitetura é chamada
de Darknet (que é o mesmo nome do
framework utilizado para implementar)
• Darknet é um framework open source
para redes neurais
• É escrito na linguagem C
• Suporta CPU e GPU
• Foi desenvolvido inicialmente por Mais informações:
https://pjreddie.com/darknet/
Joseph Redmon, criador do YOLO.
YOLO

• Antes do YOLO, sistemas de Haar cascade, um dos métodos


detecção de objetos faziam a clássicos mais conhecidos para
detecção de objetos
detecção por meio da divisão da
imagem em várias partes e depois
em cada pedaço da imagem se
executava um classificador
• É necessário executar o mesmo
classificador dezenas ou milhares
de vezes sobre a mesma imagem
Créditos da imagem: GREG BORENSTEIN
HAARCASCADES
YOLO

• Portanto se a intenção é implementar essa técnica para ser usada em


tempo real então necessitaria de um computador muito potente para
conseguir rodar
• No caso do YOLO, é treinado uma única rede neural para fazer a detecção
completa na imagem Detecção de massas mamárias cancerígenas em
uma mamografia usando YOLO
• Dessa forma, é capaz de produzir todas as
bounding boxes (caixas delimitadoras ao
redor do objeto) e todas as probabilidades
dessas detecções de uma única vez (single
pass).
• São de uso geral – avanço em várias áreas
como medicina e robótica
Creditos da imagem: ScienceDirect.com
YOLO E OUTRAS ABORDAGENS

• Podemos usar um classificador como VGGNet ou Inception e transformá-


lo em um detector de objetos se usarmos sliding window
• Essa abordagem funciona mas ela será extremamente lenta
YOLO – FUNCIONAMENTO

• O algoritmo divide a imagem em um grid


de S x S células
• Grade de 13x13, que geralmente é mais
usado (nas versões mais recentes tem se
usado mais o tamanho 19x19)
• Cada uma dessa células é responsável
por fazer a predição de 5 caixas
delimitadoras, para caso haja mais de
um objeto naquela célula (uma caixa
delimitadora descreve o retângulo que
cobre o objeto)
YOLO – FUNCIONAMENTO

• Retorna uma pontuação de confiança: o quanto de


certeza o algoritmo tem que aquela caixa
delimitadora contém um objeto. Essa pontuação
não diz a respeito de que tipo de objeto tem ali,
apenas diz a respeito do formato da caixa em si
• Para cada caixa, a célula também faz a previsão de
uma classe, fornecido um valor de probabilidade
para cada uma das classes possíveis
• O valor de confiança para a caixa (quanto maior a confiança, mais
delimitadora e a predição da classe grossa é a linha desenhada)
são combinados em uma pontuação
final. Por exemplo, a caixa mais grossa
amarela possui aproximadamente
85% de certeza que ali dentro
contém um cachorro
YOLO – FUNCIONAMENTO

• Com uma grade 13x13 há 169


células. Para cada uma dessas células O resultado final da predição:
são detectados 5 caixas
delimitadoras, o que resulta em 845
no total
• A maioria dessas caixas terá um valor
de confiança extremamente baixo.
Por isso, geralmente são
consideradas apenas as caixas cuja
pontuação final seja 30% ou
mais (threshold)
Créditos das imagens usadas nesse
exemplo: https://pjreddie.com/
CAIXAS DELIMITADORAS

Cada caixa delimitadora pode ser descrita a partir de 4 descritores:

• centro da caixa delimitadora


(bxby)
• largura (bw)
• altura (by)
• valor c, que é a classe
correspondente ao objeto
(pessoa, carro, etc)
Créditos da imagem: Appsilon - Jędrzej Świeżewski
CAIXAS DELIMITADORAS

É necessário obter o valor pc, que indicará a probabilidade de existir um objeto


naquela caixa

Em um grid 19x19, serão


1805 caixas
delimitadoras

Créditos da imagem: Appsilon - Jędrzej Świeżewski


SUPRESSÃO NÃO-MÁXIMA (NON-MAX SUPRESSION)

• A maioria dessas células não vai conter um objeto, portanto,


é necessário obter o valor pc que servirá para remover caixas
com baixa probabilidade de conter um objeto e também
caixas que possuem uma área compartilhada

Créditos da imagem: Appsilon - Jędrzej Świeżewski


ÂNCORAS (ANCHOR BOXES)

• São retângulos de proporções pré-


definidas usados para ter maior
correspondência entre as caixas
delimitadoras previstas e as esperadas
• Possuem tamanhos iniciais (largura, altura)
próximos aos tamanhos dos objetos –
serão redimensionados para o tamanho do
objeto usando algumas saídas da rede
neural
• A rede neural não deve prever o tamanho
Créditos: Andrew Ng

final do objeto, mas apenas ajustar o


tamanho da âncora mais próxima ao
tamanho do objeto
ARQUITETURA
HISTÓRIA YOLO

• v1 - Joseph Redmon introduziu o YOLO em seu paper publicado em


junho de 2015: You Only Look Once: Unified, Real-Time Object
Detection.
• v2 - Em dezembro de 2016, Redmon e Ali Farhadi introduziram o
YOLOv2 em seu paper: "YOLO9000: Better, Faster, Stronger.

• v3 - Em abril de 2018, ele e seu consultor publicaram o YOLOv3


"YOLOv3: An Incremental Improvement".
• v4 - Em abril de 2020, a quarta versão do YOLO é oficialmente
lançada através da publicação do artigo “YOLOv4: Optimal Speed and
Accuracy of Object Detection” por Alexey Bochkovskiy et al.
YOLO v1

• Introduz a abordagem
• Uma única rede convolucional
• 45fps (0,02s / imagem)
Paper: https://arxiv.org/pdf/1506.02640.pdf

Exemplo de detecção com grid


7x7, usado na primeira versão.
YOLO v2

• Mais preciso e mais rápido que a


versão anterior
• Usa Batch normalization em todas
as camadas, aumenta a resolução
do input de treinamento e passa a
utilizar a técnica anchor boxes Paper: https://arxiv.org/pdf/1612.08242.pdf

• O paper também apresenta o


YOLO9000, um sistema em tempo
real que utiliza uma abordagem
capaz de detectar mais de 9000
categorias de objetos, combinando
o dataset COCO com o dataset do
ImageNet
YOLO v3

• A versão 3 conseguiu melhorar


bastante a eficiência da predição,
obtendo resultados mais precisos
que seu antecessor
• Porém, não é mais rápido que o v2 Paper: https://arxiv.org/pdf/1612.08242.pdf
no geral
• A principal novidade é predição da
imagem em 3 diferentes escalas,
reduzindo a imagem em 32, 16 e 8
vezes (respectivamente), para assim
conseguir manter a acurácia em
tamanhos menores, já que as versões
anteriores tinham problemas em
detectar objetos muitos pequenos
comparação entre YOLOv3 e outras técnicas
que possuem os melhores resultados
YOLO v3

• O YOLOv3 usa uma variante do


Darknet, que originalmente tem
53 camadas treinadas em cima do
ImageNet. Para fazer a detecção,
são adicionadas mais 53 camadas,
resultando num total de 106
camadas que compõem a sua
arquitetura. Por isso essa versão
teve uma queda na velocidade

Créditos da imagem: Ayoosh Kathuria - Towards Data Science


YOLO

https://twitter.com/pjreddie/status/1230524770350817280
YOLOv4

Quatro anos depois da publicação da sua


primeira versão, o YOLOv4 é oficialmente
introduzido em abril de 2020 por Alexey
Bochkovskiy, Chien-Yao Wang e Hong-Yuan
Mark Liao em seu artigo “YOLOv4: Optimal
Speed and Accuracy of Object Detection”
Até a sua data de publicação, é o detector
de objetos com maior acurácia que permite
ser executado em tempo real
Algumas características que podem ser
destacadas nessa versão:
• Melhoria na velocidade de inferência e
acurácia
https://arxiv.org/pdf/2004.10934.pdf
• Mais eficiente para rodar em GPUs -
utiliza menos memória
DATASET DE TREINAMENTO
DATASET DE TREINAMENTO
DATASET DE TREINAMENTO

Padrão usado pelo


Open Images Dataset:

Créditos da imagem: https://github.com/EscVM/OIDv4_ToolKit#annotations


DATASET DE TREINAMENTO

• A imagem abaixo ainda poderia ser utilizada para detectar bandejas,


bastaria acrescentar mais uma linha contendo as informações da posição
desse objeto/classe na imagem
FORMATO DAS ANOTAÇÕES

O novo formato compatível com o YOLO é: <classe-id> <x> <y> <largura> <altura>

• <classe-id> - um número inteiro associado à classe,


iniciando do 0 (o número para cada classe vai ser equivalente à
ordem dos nomes em classes.txt)
• <x> <y> <largura> <altura> - valores do tipo float
relativos à largura e altura do objeto na imagem. Variam entre 0.0
e 1.0.
• <largura> = <largura_obj> / <largura_imagem>
• <altura> = <altura_obj> / <altura_imagem>
• <x> <y> - pontos centrais do retângulo de detecção do
objeto (e não o canto esquerdo superior do retângulo)
FORMATO DAS ANOTAÇÕES

A conversão dos valores pode ser feita da seguinte forma:


• <x> = (int((<x fim> - <x inicio>) / 2) + <x inicio>) / <largura_imagem>
• <y> = (int((<y fim> - <y inicio>) / 2) + <y inicio>) / <altura_imagem>
• <largura> = (<x fim> - <x inicio>) / <largura_imagem>
• <altura> = (<y fim> - <y inicio>) / <altura_imagem>
DATASET MANUAL

As vezes pode ser necessário construir seu próprio conjunto de imagens


manualmente pois em alguns casos, conforme comentado, o objeto que
queremos não está presente no Open Images Dataset ou em outra base de
imagens disponibilizada na internet.
Iremos brevemente explicar como você pode montar seu dataset para
qualquer tipo de objeto usando as imagens do Google Imagens.
Para montar seu conjunto de imagens nessa situação você tem duas
opções:
• Baixar imagem por imagem manualmente
• Utilizar um script para baixar múltiplas imagens de uma única vez
A primeira opção é certamente a mais demorada, mas caso decida fazê-la
você pode começar na etapa 8.
Mas para ser mais rápido recomendamos a segunda opção, para isso é
necessário executar todos os passos seguintes:
DATASET MANUAL

1) Ir até o site do Google Imagens e pesquisar pelo objeto


escolhido.

Nesse exemplo vamos construir um dataset com imagens de coxinhas!


DATASET MANUAL

2) Descer a barra de rolagem até o momento que você julgar ser o suficiente (pois o script irá
baixar todas as imagens que aparecem na página até do ponto que você parou de rolar a barra).
Recomendamos ir até o momento que a qualidade das imagens estiver boa (ou até onde
começar a aparecer muitas imagens que não estão tão relacionadas ao objeto pesquisado)

...
DATASET MANUAL

3) Executar os comandos
javascript (que estão no arquivo:
codigos_console.js)

Para isso precisa abrir o


“Inspecionar elemento”
• Clique com o botão direito
sobre a página e escolha
“Inspecionar”
• Ou pressione Ctrl+Shift+I (ou
F12)
DATASET MANUAL

3) Executar os comandos javascript (que estão no arquivo:


codigos_console.js)

Em seguida cole
todos os códigos
e pressione Enter.
DATASET MANUAL

4) Após executar o último comando javascript será baixado o


arquivo urls.txt.
Em seguida extraia os arquivos dentro da pasta
dataset_manual dentro de MaterialYOLO.zip
Mova esse arquivo urls.txt até a pasta onde você salvou esses
arquivos presentes. Demos o nome dessa pasta principal de
“google-dataset”.
DATASET MANUAL

5) Nesse mesmo diretório, crie uma pasta chamada “imagens” e dentro


dela crie uma pasta com o nome da classe (caso esteja baixando imagens
para mais de uma classe/objeto então crie uma pasta para cada classe)

Então sua estrutura vai estar assim por enquanto:

Pasta Principal (“google-dataset”) Pasta “imagens”


DATASET MANUAL

6) Execute o script download_images.py.


No diretório raiz (pasta principal) rode o comando abaixo:

python download_images.py --urls urls.txt --output imagens/coxinha

No parâmetro --output você deve colocar o diretório onde serão salvas as imagens.
No passo anterior lembre que era pra criar uma pasta com o nome da classe, dentro
da recém criada pasta “imagens”.

Obs: Dependendo do tamanho pode levar alguns minutos para baixar todas as
imagens.
DATASET MANUAL

Para executar esse script é necessário ter instalado as bibliotecas:


• imutils
• requests
• opencv-python

Caso você já não tenha elas instaladas então você pode instalar
manualmente, ou usar o comando abaixo
• pip install -r requirements.txt
(para isso você deve colocar o requirements.txt dentro do diretório principal que você criou
para armazenar os arquivos do dataset, junto com o url.txt e os outros arquivos)
DATASET MANUAL

7) Acesse o diretório onde estão as imagens e revise se há


alguma que não contém o objeto ou que não seja boa e
portanto não queira incluir no dataset.
Obs: o script já foi programado para automaticamente
considerar apenas imagens de fato, então, no momento do
download as imagens inválidas ou vazias deverão ser
descartadas.
Mas ainda assim é recomendável fazer uma revisão.
DATASET MANUAL

8) Execute os comandos para instalar as bibliotecas necessárias


para a utilização do repositório labelImg
(https://github.com/tzutalin/labelImg).
DATASET MANUAL

9) Clone o repositório labelImg e acessar o diretório


Para baixar o repositório labelImg execute o comando:

• git clone https://github.com/tzutalin/labelImg.git


Recomendamos salvar em um diretório acima da pasta principal (que no nosso caso é a “google-dataset”)

Em seguida acesse o diretório do projeto com o comando cd


• cd labelImg/
DATASET MANUAL

Para concluir a instalação execute os comandos


• pip install pyqt5
• pip install lxml
• pyrcc5 -o libs/resources.py resources.qrc
(ou, dependendo da configuração do seu
ambiente, acesse o README do repositório pois
lá tem todos os comandos para vários ambientes
diferentes)
Por exemplo, para Windows (com ou sem
Anaconda) os comandos são esses ao lado.
Para outros ambientes ou sistemas (Linux,
macOS, etc.) confira o README
https://github.com/tzutalin/labelImg
DATASET MANUAL

10) Crie o arquivo classes.txt

Igual fizemos com o dataset


criado usando o Open
Images Dataset, devemos
criar um arquivo classes.txt
com todas as classes que
queremos treinar.

Então se por exemplo


quisermos treinar mais duas
classes, ficará nesse padrão
ao lado
DATASET MANUAL

11) Execute o seguinte comando


• python labelImg.py [PASTA COM AS IMAGENS] [ARQUIVO classes.txt]

Em nosso exemplo ficará assim:

• python labelImg.py ../google-dataset/imagens/coxinha/ classes.txt

Esse comando abrirá a interface do programa.


DATASET MANUAL

12) Clique no botão


PascalVOC (menu) de
modo que seja alterado
para YOLO. Se estiver
aparecendo YOLO no
lugar então pode seguir
em frente.

Clique para
mudar para YOLO
DATASET MANUAL

13) Agora podemos começar a


rotular as imagens.
Clique no botão "Create
RectBox" e em seguida clique e
arraste o cursor do mouse sobre
a área do objeto, de modo que o
cubra totalmente da melhor
forma possível.
Após soltar o mouse vai
aparecer uma janela pedindo
para escolher qual a classe do
objeto que você acabou de
selecionar (de acordo com o que
você adicionou no classes.txt).
Selecione a classe
correspondente ao objeto que
você acabou de selecionar e
clique no botão OK.
DATASET MANUAL

• Caso sua imagem contenha mais de um objeto então faça o mesmo


processo. Se você já tiver selecionado todos os objetos que aparecem na
imagem então clique em "Save" e confirme para salvar o .txt na pasta
desejada (a mesma pasta onde estão as imagens)
• Em seguida clique sobre o botão "Next Image".
• Repita o mesmo procedimento para todas as imagens desejadas.
• Após terminar de montar seu dataset, compacte a pasta que contém as
imagens e os txts para um zip chamado obj.zip.
• Em seguida, continue a seguir os passos do Colab “Criando um dataset”, a
partir da Etapa 7 ("Definindo os arquivos de configuração").

Créditos do script para download de imagens do Google: PyImageSearch


TREINAMENTO YOLO
TREINAMENTO YOLO – AP (AVERAGE PRECISION)

Métrica muito utilizada para medir a acurácia do YOLO e outro detectores de


objetos como Faster R-CNN e SSD.
TREINAMENTO YOLO – mAP (MEAN AVERAGE PRECISION)

Em alguns contextos, o mAP é obtido calculando o AP para


cada classe e calculando a média de todos

Veja o que o próprio COCO diz:

“AP é medida em todas as categorias. Tradicionalmente, isso é


chamado de “mean average precision” (mAP). Não fazemos
distinção entre AP e mAP (e também AR e mAR) e assumimos
que a diferença é clara a partir do contexto.”
INTERSECION OVER UNION (IoU)

• Também referenciado como Índice de Jaccard e é uma


métrica de avaliação para medir a precisão de um detector de
objeto
• Muito utilizada em desafios de detecção de objetos, como o
popular desafio PASCAL VOC

Créditos da imagem: Analytics Vidhya


INTERSECION OVER UNION (IoU)

• Um detector de objetos encontra a classe e a


localização (caixas delimitadoras)
• O desempenho pode ser avaliado por meio da
localização das coordenadas na imagem
• Pode ser utilizado o IoU, que computa a
interseção sobre a união de duas caixas
delimitadoras: a que foi prevista pelo modelo e a
ground truth (ou “verdade fundamental”, que
corresponde ao limite real do objeto, que está
informado no arquivo de anotação do objeto) Vermelho é o ground truth e
• O IoU quantifica a similaridade entre essas duas verde é a seleção prevista
pelo modelo
caixas delimitadoras.
INTERSECION OVER UNION (IoU)

• Mede a sobreposição entre


os 2 limites (quanto o limite
previsto se sobrepõe ao
ground truth)
• Em alguns conjuntos de
dados, predefinimos um
limite IoU (0,5 por exemplo)
ao classificar se a previsão é
um verdadeiro positivo ou
falso positivo.

Créditos da imagem: Jonathan Hui


INTERSECION OVER UNION (IoU)

Se o IoU = 0,5
• se IoU ≥ 0,5, classifique a detecção do objeto como Verdadeiro Positivo (TP)
• se IoU < 0,5, então é uma detecção errada e classifique-a como Falso Positivo (FP)
• Quando uma ground truth está presente na imagem e o modelo não conseguiu
detectar o objeto, classifique-o como Falso Negativo (FN)
• Verdadeiro Negativo (TN): todas as partes da imagem onde objetos não foram
previstos. Esta métrica não é útil para detecção de objetos, portanto ignoramos.
INTERSECION OVER UNION (IoU)

• O alcance do IoU está entre 0 para 1, quanto maior mais


próximo as duas detecções são
• Podemos também definir um limiar (threshold) para o
IoU para determinar se a detecção do objeto é válida ou
não
TREINAMENTO

Como saber quando o modelo está bom e posso interromper o


treinamento?
• Uma regra “comum” é verificar o avg loss, quando fica abaixo de 2.0 já
começa a ficar bom, porém o recomendável é deixar rodando o
treinamento até que esse valor seja próximo ou abaixo de 0.6
• Para um modelo pequeno e um dataset fácil esse valor final pode ser até
0.05
• Porém para modelos maiores com datasets grandes e complexos esse
valor pode ainda continuar acima de 2.0 mesmo após chegar ao mesmo
número iterações
• Por isso não há uma regra geral. A principal recomendação é parar
quando perceber que o avg loss não diminui mais (ou demora muitas
iterações para diminuir bem pouco)
TREINAMENTO – SOBREAJUSTE

Créditos da imagem: Epicalsoft


TREINAMENTO – SOBREAJUSTE

• Quando os últimos pesos não são aqueles que possuem uma


melhor precisão na detecção. Por exemplo, treinamos até a
iteração 9000 mas o arquivo .weights que detectou melhor
foi o de 8000 iterações
• Se o modelo treinou até a iteração 9000, os pesos da iteração
8000 e 7000 devem ser testados
• Se o último peso for o melhor, é um indicativo que o modelo
pode ser treinado por mais tempo
COMPARATIVO

1000 iterações 2000 iterações


COMPARATIVO

3000 iterações 4000 iterações


COMPARATIVO

2000 imagens de treinamento / 4000 iterações


COMPARATIVO

YOLOv3 YOLOv4

cavalos_yolov3.avi cavalos_yolov4.avi

Você também pode gostar