Scixiv

Computer Vision

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