Detecção e rastreamento de gado em vídeo aéreo usando YOLO e visão por computador

João LeonardiJoão LeonardiORCID5 min
View on GitHub

Pipeline de detecção e rastreamento de gado em vídeo aéreo (VANT): YOLO em tempo real (Roboflow), associação temporal de indivíduos, profundidade métrica (Depth Pro) e seleção automática do melhor ângulo por animal. O objetivo é contagem, localização e frames de qualidade sem inspeção manual frame a frame.

Neste post documentamos o fluxo de inferência, o rastreamento, a estimativa de profundidade e os critérios de seleção de vista — base da série de gado vivo antes do Antares (peso).


1. Motivação e Contexto

O monitoramento de rebanhos em larga escala apresenta desafios significativos de processamento de imagem e análise temporal. Abordagens tradicionais requerem inspeção manual ou sistemas custosos. O objetivo deste trabalho é automatizar a detecção e análise de indivíduos em vídeo capturado por VANT (Veículo Aéreo Não Tripulado), viabilizando contagem, localização espacial e seleção automática de frames de melhor qualidade visual.


2. Arquitetura do Sistema

O pipeline opera em três estágios sequenciais:

2.1 Estágio 1: Live Streaming e Detecção em Tempo Real

Processamento contínuo de frames de vídeo com detecção YOLO via API Roboflow:

# Fluxo principal
for frame in video_stream:
    # Redimensionar para otimizar latência
    frame_resized = resize_image(frame, max_size=1024)
    
    # Inferência no modelo cattle-bmfuz/1
    predictions = roboflow_api.detect(
        frame_resized,
        confidence_threshold=0.40,
        overlap_threshold=0.30
    )
    
    # Associar detecções a IDs de rastreamento
    cattle_tracker.update(predictions, frame_id)

Especificações:

  • Modelo: cattle-bmfuz/1 (modelo customizado treinado com Roboflow)
  • Confiança mínima: 40%
  • Limiar de sobreposição (IOU): 30%
  • API: Inference SDK v0.58.1

2.2 Estágio 2: Rastreamento Temporal e Seleção de Melhor Ângulo

Cada animal detectado é associado a um ID único. Para cada indivíduo, o sistema mantém histórico de detecções e seleciona o frame de melhor qualidade visual:

class CattlePipeline:
    cattle_tracker = {
        'cattle_id': {
            'detections': [...],        # Histórico de bbox e confiança
            'best_detection': None,     # Detecção com maior confiança
            'best_frame': None,         # Frame visual de melhor qualidade
            'best_confidence': float,   # Score de confiança máximo
            'best_angle_score': float,  # Métrica de ângulo de visualização
            'first_seen_time': timestamp,
            'is_confirmed': bool,       # Rastreamento confirmado (>15s)
            'depth_map': numpy.ndarray  # Mapa de profundidade estimado
        }
    }

Critérios de Seleção:

  • Confiança de detecção (output da rede YOLO)
  • Ângulo de visualização (relação aspecto, posição no frame)
  • Duração de rastreamento (confirmação após 15 segundos contínuos)

2.3 Estágio 3: Estimativa de Profundidade e Segmentação

Para o melhor frame de cada animal, calcula-se mapa de profundidade métrica usando Apple Depth Pro:

from depth_pro import create_model_and_transforms
 
# Inferência de profundidade
model, transform = create_model_and_transforms()
depth_map = model(frame_transformed)
 
# Profundidade no ROI (bounding box)
bbox_depth = depth_map[y1:y2, x1:x2]
mean_depth = bbox_depth.mean()  # Distância métrica do animal

Arquitetura Depth Pro:

  • Modelo pré-treinado em diversas cenas naturais
  • Saída: mapa de profundidade densa em escala métrica
  • Dispositivo: GPU (CUDA), MPS (Apple Silicon), ou CPU

3. Componentes Principais

3.1 Pipeline de Detecção (cattle_pipeline.py)

Classe CattlePipeline orquestra toda a sequência:

pipeline = CattlePipeline(
    api_key="vAEx3j7cOgLv4GtMzmPv",
    model_id="cattle-bmfuz/1"
)
 
# Processar vídeo
for frame in video_source:
    predictions = pipeline.process_frame(frame, frame_id)
    pipeline.update_tracking(predictions)
    
    # Após confirmação (15s), extrair melhor specimen
    if animal.is_confirmed:
        best_crop = pipeline.get_best_crop(animal.cattle_id)

Métodos principais:

  • process_frame(frame, frame_id): Inferência e atualização
  • update_tracking(predictions): Associação de dados de rastreamento
  • get_best_crop(cattle_id): Exportar melhor imagem do animal
  • estimate_depth(frame, bbox): Calcular profundidade

3.2 Estimativa de Profundidade (depth_estimator.py)

Wrapper para Apple Depth Pro com suporte a múltiplos aceleradores:

depth_estimator = DepthEstimator()
 
# GPU NVIDIA
if torch.cuda.is_available():
    depth_map = depth_estimator.predict(frame, device='cuda')
 
# Apple Silicon
elif torch.backends.mps.is_available():
    depth_map = depth_estimator.predict(frame, device='mps')
 
# CPU fallback
else:
    depth_map = depth_estimator.predict(frame, device='cpu')

3.3 Processamento de Vídeo

Entrada: MP4/MOV de drone com múltiplos fotogramas

Fluxo:

  1. video_detection.py: Detecção em arquivo pré-gravado
  2. video_detection_live.py: Processamento em tempo real (protocolo de câmera)
  3. visual_odometry.py: Estimação de movimento de câmera entre frames

3.4 Overlay de Telemetria (telemetry_overlay.py)

Visualização em tempo real com metadados:

# Dados sobrepostos no vídeo
draw_telemetry_overlay(frame, {
    'timestamp': frame_time,
    'cattle_count': len(confirmed_animals),
    'frame_rate': fps,
    'model_inference_time': latency_ms,
    'gps_position': drone_position,
    'altitude': height_m
})

4. Dados e Validação

4.1 Dataset de Entrada

  • Fonte: Captura aérea por VANT em ambiente rural
  • Resolução: UHD 2560×1440, 30 fps
  • Duração: Sequências de vídeo com múltiplos minutos
  • Exemplo: 20250914_184106_19117428-uhd_2560_1440_30fps
  • Frames extraídos: Conjunto de referência em data/frames/original/

4.2 Modelo de Detecção

Treinamento: Roboflow com dataset anotado de gado

  • Modelo ID: cattle-bmfuz/1
  • Classes: Gado (single class detection)
  • Performance: Confiança média ~0.65–0.85 em condições de voo normal

Parâmetros de Inferência:

Confidence threshold: 40% (reduz falsos negativos)
Overlap IOU threshold: 30% (agrupa detecções próximas)
Input: JPG redimensionado (max 1024px)
Latência: ~500–1000ms por frame via API

4.3 Validação de Rastreamento

  • Confirmação após 15 segundos contínuos de rastreamento
  • Métrica: Taxa de reidentificação (re-ID) de animais
  • Métrica: Precisão de profundidade em ROI (comparar com GPS/RTK se disponível)

5. Fluxo de Execução

5.1 Modo Batch (Arquivo de Vídeo)

python video_detection.py \
  --video-path data/20250914_184106_19117428-uhd_2560_1440_30fps/video.mp4 \
  --api-key vAEx3j7cOgLv4GtMzmPv \
  --model-id cattle-bmfuz/1 \
  --output-dir output/

Saída:

  • Vídeo com bounding boxes e track IDs
  • JSON com metadados de cada detecção
  • Imagens cropped dos melhores exemplares

5.2 Modo em Tempo Real

python video_detection_live.py \
  --camera-source 0 \
  --api-key <API_KEY> \
  --telemetry-port /dev/ttyUSB0  # GPS/IMU do drone

5.3 Análise Pós-Processamento

python cattle_pipeline.py \
  --input-video output/detected.mp4 \
  --estimate-depth \
  --export-crops \
  --export-metrics

6. Arquitetura Técnica Detalhada

6.1 Stack de Dependências

dependencies = [
    "inference>=0.58.1",           # Roboflow API client
    "inference-sdk>=0.58.1",       # Advanced features
    "opencv-python>=4.10.0.84",    # Processamento de vídeo
    "supervision>=0.26.1",         # Utilidades de detecção
    "pillow>=11.3.0",              # Manipulação de imagens
    "torch>=2.0",                  # Deep learning (Depth Pro)
    "requests>=2.32.5",            # HTTP client
    "certifi>=2025.10.5"           # SSL/TLS
]

6.2 Fluxo de Dados

Vídeo de entrada (MP4)

Extração de frames (OpenCV)

Redimensionamento (max 1024px)

Inferência YOLO (Roboflow API)

Rastreamento temporal (ID association)

Seleção de melhor frame (por animal)

Estimativa de profundidade (Depth Pro)

Exportação (crops, metadata JSON, vídeo anotado)

6.3 Limitações Atuais

  • Latência de API: ~500–1000ms por frame (bottleneck principal)
  • Modelo genérico: Treinado em gado bovino; generalização para outras espécies não testada
  • Profundidade: Estimativa monocular; exatidão depende de texture e lighting
  • Rastreamento: Associação greedy; não implementa filtro Kalman para trajectórias suaves

7. Extensões Futuras

  1. Deploy Local: Implementar YOLO v8 local (TensorRT) para eliminar latência de API
  2. Multi-classe: Estender para ovinos, equinos, fauna selvagem
  3. Segmentação de Instância: Contorno preciso de cada animal
  4. Rastreamento Robusto: Implementar Kalman filter e Hungarian algorithm para data association
  5. Calibração Estéreo: Usar múltiplas câmeras para profundidade mais precisa
  6. Análise Comportamental: Detectar padrões de movimento (pastejo, repouso, fuga)

8. Referências e Créditos

  • Roboflow: Plataforma de treinamento customizado de YOLO
  • Apple Depth Pro: Modelo de estimativa de profundidade monocular
  • OpenCV & Supervision: Processamento e anotação de vídeo
  • Inference SDK: Cliente Python para modelos via API

Conclusão

Este pipeline demonstra como integrar detecção de objetos em tempo real, rastreamento visual e estimativa de profundidade para automatizar monitoramento de rebanhos. A modularidade do design permite adaptar o sistema para outras aplicações de detecção aérea, como inventário agrícola, monitoramento ambiental ou busca e resgate.

Na série Gado vivo: detecção e peso