Kalman Filter (KF)
Um filtro de Kalman estima um estado variável, como a posição e a velocidade de um objeto, combinando previsões do modelo com medições ruidosas. Matemática e código.
Um filtro de Kalman (KF) é um algoritmo recursivo que estima o estado oculto de um sistema em mudança, como a posição e a velocidade de um objeto, a partir de uma sequência de medições ruidosas. A cada instante, prevê o próximo estado com base em um modelo de movimento do sistema e, em seguida, corrige essa previsão com a nova medição, ponderando cada uma de acordo com sua incerteza. Rudolf E. Kálmán publicou o método em 1960 e, para sistemas lineares com ruído gaussiano, ele fornece a estimativa de erro quadrático médio mínimo. O método é usado em receptores GPS, navegação de aeronaves e espaçonaves, localização de robôs e quase todos os rastreadores de múltiplos objetos em visão computacional, onde suaviza detecções instáveis e prevê onde cada objeto aparecerá em seguida.
Como funciona o filtro de Kalman#
O filtro mantém duas quantidades: uma estimativa de estado x, por exemplo, posição e velocidade, e uma matriz de covariância P que descreve o grau de incerteza dessa estimativa. Cada ciclo tem duas etapas:
- Previsão: Um modelo de movimento
Fprojeta o estado para a frente,x = F x, e a incerteza aumenta devido ao ruído do processoQ, que representa movimentos não capturados pelo modelo:P = F P Fᵀ + Q. - Atualização: Chega uma nova medição
z, relacionada ao estado pelo modelo de mediçãoH. O filtro calcula o resíduoz − H xe o ganho de KalmanK = P Hᵀ (H P Hᵀ + R)⁻¹, em queRé o ruído da medição. O estado corrigido éx + K (z − H x), e a incerteza diminui para(I − K H) P.
O ganho de Kalman define o equilíbrio entre o modelo e o sensor. Quando as medições são precisas em relação à previsão, o ganho se aproxima de 1 e a estimativa acompanha a medição; quando são ruidosas, o ganho se aproxima de 0 e a estimativa acompanha a previsão. Como o estado pode incluir quantidades que nunca são medidas diretamente, o filtro também as infere: um rastreador que observa apenas posições ainda estima a velocidade. Quando não há uma medição, o filtro ignora a atualização e segue com base na previsão:
Filtros de Kalman no rastreamento de objetos#
No rastreamento de objetos, cada trajetória tem seu próprio filtro de Kalman. O estado contém o centro e o tamanho da caixa delimitadora, além das respectivas velocidades; um modelo de velocidade constante prevê onde a caixa estará no próximo quadro. Essas previsões são associadas a novas detecções por Interseção sobre União (IoU), e cada detecção associada se torna a medição que atualiza sua trajetória. Quando um objeto fica oculto por alguns quadros, a trajetória continua seguindo o caminho previsto, de modo que a detecção que reaparece fica perto o bastante da previsão para manter o ID anterior.
Todos os rastreadores do modo de rastreamento do Ultralytics YOLO funcionam assim: KalmanFilterXYAH do ByteTrack rastreia um estado de 8 dimensões composto pelo centro da caixa, a proporção da imagem, a altura e suas velocidades; o BoT-SORT e o TrackTrack usam uma variante com largura e altura, e ambos ajustam o ruído de acordo com o tamanho da caixa, permitindo que objetos grandes e próximos tolerem saltos maiores em pixels. As mesmas etapas de previsão e atualização cabem em algumas linhas de NumPy para uma coordenada do centro de uma caixa:
import numpy as np
F = np.array([[1.0, 1.0], [0.0, 1.0]]) # constant-velocity model, state = [position, velocity]
H = np.array([[1.0, 0.0]]) # the detector measures position only
Q = 0.001 * np.eye(2) # process noise: how far real motion may stray from the model
R = np.array([[25.0]]) # measurement noise: detections jitter by about 5 px
rng = np.random.default_rng(0)
truth = 100 + 3.0 * np.arange(60) # box center moving 3 px per frame
z = truth + rng.normal(0, 5.0, truth.size) # noisy detections
x, P = np.array([z[0], 0.0]), np.diag([25.0, 100.0]) # start from the first detection
estimates = [x[0]]
for measurement in z[1:]:
x, P = F @ x, F @ P @ F.T + Q # predict
K = P @ H.T @ np.linalg.inv(H @ P @ H.T + R) # Kalman gain
x = x + K @ (measurement - H @ x) # update with the weighted residual
P = (np.eye(2) - K @ H) @ P
estimates.append(x[0])
print(f"Detection error: {np.sqrt(np.mean((z - truth) ** 2)):.2f} px")
print(f"Kalman error: {np.sqrt(np.mean((np.array(estimates) - truth) ** 2)):.2f} px")
print(f"Estimated velocity: {x[1]:.2f} px/frame")A saída mostra um erro quadrático médio de 4.50 px para as detecções brutas e 2.48 px para as estimativas filtradas, além de uma velocidade estimada de 2.98 px por quadro, próxima dos 3 px reais, embora a velocidade nunca tenha sido medida.
Filtros relacionados#
O filtro de Kalman padrão pressupõe modelos lineares de movimento e medição com ruído gaussiano. Seus métodos relacionados flexibilizam essas suposições:
- Filtro de Kalman estendido (EKF): Lineariza modelos não lineares em torno da estimativa atual usando jacobianos em cada etapa; é a escolha padrão para GPS e navegação inercial.
- Filtro de Kalman unscented (UKF): Passa um pequeno conjunto de pontos de amostra cuidadosamente escolhidos pelo modelo não linear; costuma ser mais preciso que a linearização e não exige derivadas.
- Filtro de partículas: Representa a distribuição do estado com muitas amostras aleatórias ponderadas, permitindo lidar com crenças não gaussianas e multimodais — como um robô que não sabe em qual de dois corredores está — com um custo computacional muito maior.
- Modelo oculto de Markov (HMM): Usa a mesma recursão de previsão e atualização para estados discretos; o filtro de Kalman é seu equivalente para estados contínuos, lineares e gaussianos.
Aplicações além do rastreamento#
- Robótica e fusão de sensores: Os robôs combinam odometria das rodas, IMUs, lidar e câmeras em uma única estimativa de pose; os métodos baseados em EKF são uma abordagem clássica para localização e mapeamento simultâneos.
- Realidade aumentada: Os headsets filtram as medições da pose da cabeça para manter os objetos virtuais estáveis com baixa latência.
- Economia e processamento de sinais: Analistas usam a suavização de Kalman para estimar tendências não observadas a partir de séries temporais ruidosas.
- Navegação: Aeronaves, navios, drones e celulares combinam GPS com sensores inerciais para manter a posição estável entre as atualizações dos satélites. A navegação também foi a primeira grande aplicação do filtro: no início da década de 1960, Stanley F. Schmidt, da NASA Ames, adaptou-o à estimativa de trajetórias não lineares para o computador de navegação Apollo.










