Neste projeto, será utilizado o modelo pré-treinado yolov8n.pt, para detecção de objetos.
O código foi desenvolvido em Python, no Google Colab.
Arquivo de entrada
Utilizaremos um arquivo baixado do portal da Prefeitura Municipal de Juiz de Fora, com a captura do vídeo da câmara 16 (http://camerasjf.gctnet.com.br:8880/cameras/?cam=16), do cruzamento da Avenida Brasil com a Avenida Rio Branco, do dia 16/10/2023, com início às 10:49:32, e duração de 60 segundos, resolução 1920x1080, Codec de vídeo H.265, frame rate de 29.97 fps, bitrate de 448 kbps, fornecido em um container mkv, que é um envelope que incorpora múltiplos formatos multimídia.
Pré-processamento
Convertemos o arquivo de vídeo para o formato mp4, utilizando o seguinte script:
Implementação
Instalamos o pacote Ultralytics, que contém a classe YOLO:
Importamos as bibliotecas necessárias:
Uma variável recebe o arquivo de entrada:
Criamos um modelo de rede neural:
YOLOv8 é um grupo de modelos de rede neural, criados e treinados com a biblioteca Pytorch, exportados para arquivos com a extensão .pt. Há cinco tipos de modelos para cada tarefa (classificação, detecção, segmentação), e cinco modelos para cada tipo, de acordo com o tamanho do número de parâmetros de treinamento.
Lemos o arquivo de entrada:
Utilizamos a classe VideoWriter do opencv para criar o objeto de saída, no formato mp4. Utilizada para gravar arquivos de vídeo, recebe como parâmetros o nome do arquivo de saída, o codec utilizado para compressão, definido por um código de 4 caracteres(fourcc), a taxa de frames por segundo e o tamanho do vídeo:
Listamos as classes do dataset COCO, com 80 categorias, desenvolvido pela Microsoft (https://cocodataset.org/#home):
Criamos dicionários auxiliares:
Realizamos a leitura dos frames:
Ao processar a entrada, o modelo retorna os objetos que foram detectados e suas propriedades. Utilizamos o método "track" com o parâmetro "persist=True", para garantir que cada "id" seja único para o mesmo veículo:
Mapeamos algumas propriedades da caixa delimitadora:
-
cls: descreve a classe do objeto
-
conf: expressa o nível de confiança da predição
-
id: denota o identificador único do objeto
-
xyxy: indica as coordenadas da caixa delimitadora
Adicionamos rótulos às caixas delimitadoras, para exibir a classe e nível de confiança (ou id) do objeto detectado, desde que duas condições sejam atendidas simultaneamente (que a classe predita esteja contida no dicionário class_names e que a probabilidade seja superior a 0.3):
Inserimos no frame a contagem de veículos por tipo (a legenda deve ser posicionada à esquerda e centralizada verticalmente):
Salvamos o arquivo de saída, liberamos os objetos de captura e gravação e fechamos todos os frames:
Pós-processamento
Compactamos o arquivo de saída(reduzido a um terço do original):
Exibimos o arquivo de saída:
- Vídeo de saída com etiqueta contendo tipo de veículo e nível de confiança:
- Vídeo de saída com etiqueta contendo tipo de veículo e id: