IA Para contagem de Objetos em Movimento
A contagem de objetos em movimento é uma das aplicações mais importantes em visão computacional, área da IA dedicada a capacitar máquinas a perceberem estímulos visuais. Ela pode ser usada em muitas tarefas, incluindo controle de estoque, de tráfego, vigilância, prevenção de furtos e muito mais.
A maioria dos algoritmos de detecção de objetos em imagens e vídeos funciona detectando objetos quadro a quadro. Para executar a contagem, um algoritmo precisa ser capaz de não apenas detectar objetos, mas rastreá-los em múltiplos quadros. Isso é feito através da atribuição de IDs.
Já falamos previamente do YOLO (You Only Look Once). Esse modelo é uma rede neural do tipo deep learning desenvolvida para tarefas de visão computacional. Popularmente conhecido por sua boa capacidade de detecção em alta velocidade, o YOLO não se restringe a isso. Ele também pode ser usado para outras tarefas, como rastreamento e contagem de objetos em movimento.
YOLO para Rastremaneto e Contagem
Para realizar contagem com YOLO, ele precisa ser instalado, o que deve ser feito preferencialmente em ambiente virtual.
pip install ultralytics
Sua instalação requer também PyTorch. Como a instalação do PyTorch pode precisar de configurações adicionais, consulte a documentação oficial para obter as instruções para seu sistema. Usaremos também OpenCV cujas instruções para instalação podem ser obtidas aqui.
Para usar o YOLO em código, primeiro fazemos as importações necessárias e especificamos um modelo. Embora a versão mais recente do YOLO seja o modelo v10, usaremos o v8, pois ele tem documentação melhor:
import cv2
from ultralytics import YOLO, solutions
model = YOLO("yolov8n.pt")
Contagem com IA em Código
A contagem de objetos é feita em combinação com rastreamento. O rastreamento é usado para atribuir IDs aos objetos. Para a contagem, definimos uma linha ou área numa imagem. Toda vez que um objeto rastreado cruzar a linha/área definida, o contador é incrementado. Portanto, dando sequência ao nosso código, primeiro capturamos um vídeo com OpenCV (linha 1). Em seguida, obtemos a taxa de quadros por segundo (fps) e o tamanho dos quadros (w, h) (linha 3), pois esses parâmetros são necessários para escrever um novo vídeo. Depois, definimos um objeto de escrita de vídeo para exibir as IDs e contagem (linha 4).
cap = cv2.VideoCapture("SEU_VIDEO_AQUI")
assert cap.isOpened(), "Erro ao ler arquivo"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
A contagem de objetos é feita com a definição de uma linha ou área. Para esse post, usaremos uma linha. Ela é definida com uma posição de início e outra de término.
line_points = [(0, 400), (2180, 400)]
O passo seguinte é definir o contador. Ele contém vários parâmetros, incluindo os nomes das classes que serão contadas, se queremos registrar os rastreamentos, a largura da linha que será usada, etc. Para saber mais detalhes sobre cada um deles, consulte a documentação oficial.
counter = solutions.ObjectCounter(
view_img=True,
reg_pts=line_points,
classes_names=model.names,
draw_tracks=True,
line_thickness=2,
)
Por último, realizamos a aplicação do algoritmo YOLO em si, com um loop simples. O loop aplica o algoritmo de rastreamento quadro a quadro no vídeo (linha 6), realiza a contagem e escreve as informações do contador (linha 7).
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("O quadro de vídeo está vazio ou o processamento de vídeo foi concluído com êxito.")
break
tracks = model.track(im0, persist=True, show=False)
im0 = counter.start_counting(im0, tracks)
video_writer.write(im0)
cap.release()
video_writer.release()
cv2.destroyAllWindows()
Com esse código simples, nosso contador automático está pronto. Veja um resultado abaixo: