Em visão computacional, a detecção de objetos é uma tecnologia fundamental. Ela possibilita que as máquinas percebam e interpretem o ambiente visual com excepcional precisão. Especificamente, a detecção de objetos permite que os computadores não apenas identifiquem objetos em imagens ou vídeos, mas também os localizem. O processo de localização de objetos envolve determinar a posição precisa de um objeto em uma imagem ou quadro de vídeo, geralmente por meio de caixas delimitadoras. Já a classificação se refere à identificação de objetos em categorias predefinidas (por exemplo, carro, pessoa, bicicleta).
Em termos de aplicações, a detecção de objetos é uma técnica avançada que tem transformado inúmeras indústrias. Utilizada em áreas variando de carros autônomos a sistemas de vigilância, essa é uma técnica que está constantemente avançando as fronteiras da inteligência artificial (IA).
Neste post, realizaremos a detecção de objetos usando a nova versão do YOLO, YOLOv9.
YOLOv9
YOLO (You Only Look Once) é uma rede neural do tipo deep learning desenvolvida para tarefas de visão computacional. Seu algoritmo é considerado um dos mais eficazes e mais rápidos para inúmeras tarefas da área. Ele analisa toda a imagem de uma só vez usando uma rede neural profunda convolucional (CNN). YOLOv9 é a sua mais nova versão.
YOLOv9, como seus antecessores, concentra-se em identificar e identificar objetos em imagens e vídeos. Aplicativos como carros autônomos, sistemas de segurança e pesquisa avançada de imagens dependem muito desse recurso. YOLOv9 introduz inovações ainda mais impressionantes do que YOLOv8, que já exploramos algumas vezes (veja aqui e aqui).
Os modelos YOLO são pré-treinados no conjunto de dados COCO. Eles conseguem reconhecer várias classes de objetos sem precisar de treinamento adicional. Mas eles também podem ser treinados para detectar classes adicionais. Neste post, focaremos nas classificações padrão, ou seja, sem nenhum treinamento extra.
Detecção de Objetos com YOLOv9 em Código
Para usar o YOLO, precisa instalar as bibliotecas Python OpenCV e ultralytics, preferencialmente em ambiente virtual.
pip install opencv-python ultralytics
Num código Python, importamos os pacotes:
import cv2
from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator
Usaremos o Annotator da própria ultralytics para desenhar as caixas delimitadoras ao redor dos objetos identificados.
Também precisamos especificar o modelo YOLO que será usado. Como explicado anteriormente, YOLO é uma rede neural do tipo deep learning pré-treinada. YOLOv9 deve contar com 5 versões, ou seja, 5 tamanhos de redes diferentes. Por enquanto, apenas duas estão disponíveis: YOLOv9c e YOLOv9e. Para saber mais detalhes sobre elas, clique aqui.
Para esse post, usaremos o YOLOv9c. Ele será baixado diretamente com a ultralytics na primeira vez que o código for executado:
model = YOLO("yolov9c.pt")
Classificação e Localização de Objetos
Para realizar a detecção de objetos em imagens ou vídeos, utilizaremos duas funções. A primeira (código abaixo) realiza as classificações e retorna uma tupla contendo a classe e as coordenadas das caixas limitadoras de cada objeto detectado.
def predict(model, img, classes=[], conf=0.5):
'''Realiza a detecção de objetos em imagens
ou vídeos e retorna os resultados contendo as classes identificadas
e as coordenadas para traçar caixas delimitadoras. '''
if classes:
results = model.predict(img, classes=classes, conf=conf)
else:
results = model.predict(img, conf=conf)
return results
Essa primeira função possui quatro argumentos: o modelo (model), uma imagem para realizar a detecção (img), uma lista de nomes de classe para filtrar previsões (opcional), e um limite mínimo de confiança para uma previsão ser aceita (conf, opcional).
Como mencionado acima, a função retorna uma tupla (results) com o nome das classes detectadas e as coordenadas de suas localizações.
Anotação em Imagens
A segunda função (código abaixo) é responsável por receber a tupla com os resultados da primeira e realizar as anotações dos objetos detectados e de suas localizações na imagem ou quadro de um vídeo. Ela recebe os mesmos argumentos da primeira.
def detect(model, img, classes=[], conf=0.5):
'''Anota as classes e desenha caixas delimitadoras ao redor dos objetos detectados.'''
results = predict(model, img, classes, conf=conf)
for r in results:
annotator = Annotator(img)
boxes = r.boxes
for box in boxes:
b = box.xyxy[0] # coordenada das caixas delimitadoras
c = box.cls # classe detectadas
annotator.box_label(b, model.names[int(c)]) # anota imagem
return img
Como o YOLO pode identificar vários objetos numa única imagem, essa função executa um loop sobre todos os possíveis objetos detectados para desenhar as caixas e adicionar seus rótulos. A função retorna a imagem anotada.
Detecção de Objetos em Imagens
Com as funções implementadas, basta selecionar uma imagem para realizar as detecções de objetos. A imagem anotada é então salva com OpenCV. Veja o trecho abaixo, ele abre uma imagem, realiza a detecção com YOLO e salva a imagem final anotada:
path_para_imagem = 'SUA_IMAGEM_AQUI' # insira o local da sua imagem, por exemplo: fotos/imagem.jpg
img = cv2.imread(img_name) # abre imagem com OpenCV
img_anotada = detect(model, img, classes=[], conf=0.5) # anota imagem
cv2.imwrite('nome_da_nova_imagem.jpg', img_anotada) # salva imagem anotada
Abaixo, veja alguns resultados obtidos:
Detecção de Objetos em Vídeo
Para detecções em vídeo, basta adicionar um loop. Ele detecta os objetos aplicando o YOLO quadro a quadro. Em código, esse loop pode ser implementado assim:
video_path = "SEU_VIDEO_AQUI.mp4" # insira seu vídeo
cap = cv2.VideoCapture(video_path)
while True:
success, img = cap.read()
if not success:
break
result_img = detect(model, img, classes=[], conf=0.5) # anota os quadros do vídeo
cv2.imshow("Image", result_img) # mostra vídeo anotado
cv2.waitKey(1)
Abaixo, mostramos um exemplo de quatro vídeos combinados e totalmente anotados com YOLO.