Kalman Filter (KF)
Bộ lọc Kalman ước tính trạng thái biến đổi, chẳng hạn vị trí và vận tốc của một vật thể, bằng cách kết hợp dự đoán của model với các phép đo nhiễu. Toán học và code.
Bộ lọc Kalman (KF) là thuật toán đệ quy ước lượng trạng thái ẩn của một hệ thống biến đổi, chẳng hạn vị trí và vận tốc của một đối tượng, từ luồng phép đo nhiễu. Ở mỗi bước thời gian, bộ lọc dự đoán trạng thái tiếp theo dựa trên model mô tả cách hệ thống chuyển động, rồi hiệu chỉnh dự đoán đó bằng phép đo mới, với trọng số cho mỗi thành phần dựa trên mức độ bất định. Rudolf E. Kálmán công bố phương pháp này năm 1960; với hệ thống tuyến tính có nhiễu Gaussian, phương pháp tạo ra ước lượng có sai số bình phương trung bình nhỏ nhất. Bộ lọc được dùng trong bộ thu GPS, hệ thống dẫn đường máy bay và tàu vũ trụ, định vị robot và gần như mọi bộ theo dõi đa đối tượng trong thị giác máy tính, nơi bộ lọc làm mượt các phát hiện rung lắc và dự đoán vị trí xuất hiện tiếp theo của từng đối tượng.
Cách thức hoạt động của Bộ lọc Kalman#
Bộ lọc duy trì hai đại lượng: ước lượng trạng thái x, chẳng hạn vị trí và vận tốc, cùng ma trận hiệp phương sai P mô tả độ bất định của ước lượng đó. Mỗi chu kỳ gồm hai bước:
- Dự đoán: Model chuyển động
Fchiếu trạng thái về phía trước,x = F x, và độ bất định tăng thêm do nhiễu quá trìnhQ, đại diện cho chuyển động mà model không mô tả được:P = F P Fᵀ + Q. - Cập nhật: Một phép đo mới
zxuất hiện, liên hệ với trạng thái thông qua model đo lườngH. Bộ lọc tính phần dưz − H xvà hệ số KalmanK = P Hᵀ (H P Hᵀ + R)⁻¹, trong đóRlà nhiễu đo lường. Trạng thái được hiệu chỉnh làx + K (z − H x), còn độ bất định giảm xuống(I − K H) P.
Hệ số Kalman quyết định mức cân bằng giữa model và cảm biến. Khi phép đo chính xác so với dự đoán, hệ số tiến gần 1 và ước lượng bám theo phép đo; khi phép đo nhiễu, hệ số tiến gần 0 và ước lượng bám theo dự đoán. Vì trạng thái có thể bao gồm các đại lượng không bao giờ được đo trực tiếp, bộ lọc cũng suy ra chúng: bộ theo dõi chỉ quan sát vị trí vẫn ước lượng được vận tốc. Khi thiếu phép đo, bộ lọc bỏ qua bước cập nhật và tiếp tục dựa trên dự đoán:
Bộ lọc Kalman trong theo dõi đối tượng#
Trong theo dõi đối tượng, mỗi track có một bộ lọc Kalman riêng. Trạng thái chứa tâm và kích thước của bounding box, cùng vận tốc của chúng; model vận tốc không đổi dự đoán vị trí của box ở frame tiếp theo. Các dự đoán này được ghép với phát hiện mới bằng Intersection over Union (IoU), và mỗi phát hiện được ghép trở thành phép đo dùng để cập nhật track tương ứng. Khi đối tượng bị che khuất trong vài frame, track tiếp tục di chuyển theo quỹ đạo dự đoán, nhờ đó phát hiện xuất hiện trở lại nằm đủ gần dự đoán để giữ nguyên ID cũ.
Mọi bộ theo dõi trong chế độ track của Ultralytics YOLO đều hoạt động theo cách này: KalmanFilterXYAH của ByteTrack theo dõi trạng thái 8 chiều gồm tâm box, tỷ lệ khung hình, chiều cao và vận tốc của chúng; BoT-SORT và TrackTrack dùng biến thể chiều rộng và chiều cao; cả hai đều điều chỉnh nhiễu theo kích thước box để đối tượng lớn ở gần chấp nhận được các bước nhảy pixel lớn hơn. Cùng các bước dự đoán và cập nhật có thể viết gọn trong vài dòng NumPy cho một tọa độ của tâm box:
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")Kết quả in ra sai số căn trung bình bình phương là 4.50 px cho các phát hiện thô và 2.48 px cho các ước lượng đã lọc; vận tốc ước lượng là 2.98 px mỗi frame, gần với giá trị thực 3 px, dù vận tốc chưa từng được đo.
Các bộ lọc liên quan#
Bộ lọc Kalman tiêu chuẩn giả định model chuyển động và đo lường tuyến tính với nhiễu Gaussian. Các biến thể của bộ lọc nới lỏng những giả định này:
- Bộ lọc Kalman mở rộng (EKF): Tuyến tính hóa các model phi tuyến quanh ước lượng hiện tại bằng ma trận Jacobian ở mỗi bước; đây là lựa chọn tiêu chuẩn cho GPS và dẫn đường quán tính.
- Bộ lọc Kalman không thứ nguyên (UKF): Truyền một tập nhỏ các điểm mẫu được chọn cẩn thận qua model phi tuyến; phương pháp này thường chính xác hơn tuyến tính hóa và không cần đạo hàm.
- Bộ lọc hạt: Biểu diễn phân phối trạng thái bằng nhiều mẫu ngẫu nhiên có trọng số, nhờ đó xử lý được niềm tin phi Gaussian và đa đỉnh, chẳng hạn robot không biết mình đang ở hành lang nào trong hai hành lang, nhưng đòi hỏi chi phí tính toán cao hơn nhiều.
- Model Markov ẩn (HMM): Dùng cùng phép đệ quy dự đoán và cập nhật cho trạng thái rời rạc; bộ lọc Kalman là phiên bản tương ứng cho trạng thái liên tục, tuyến tính-Gaussian.
Ứng dụng ngoài theo dõi#
- Robot học và hợp nhất cảm biến: Robot kết hợp odometry bánh xe, IMU, lidar và camera thành một ước lượng tư thế; các phương pháp dựa trên EKF là cách tiếp cận kinh điển cho định vị và lập bản đồ đồng thời.
- Thực tế tăng cường: Kính thực tế tăng cường lọc các phép đo tư thế đầu để giữ vật thể ảo ổn định với độ trễ thấp.
- Kinh tế học và xử lý tín hiệu: Chuyên viên phân tích dùng làm mượt Kalman để ước lượng xu hướng không quan sát được từ chuỗi thời gian nhiễu.
- Dẫn đường: Máy bay, tàu thuyền, drone và điện thoại kết hợp GPS với cảm biến quán tính để vị trí ổn định giữa các lần cập nhật vệ tinh. Dẫn đường cũng là ứng dụng lớn đầu tiên của bộ lọc: vào đầu thập niên 1960, Stanley F. Schmidt tại NASA Ames đã điều chỉnh bộ lọc để ước lượng quỹ đạo phi tuyến cho máy tính dẫn đường Apollo.










