Optical Flow
Khám phá những kiến thức nền tảng về optical flow trong computer vision. Tìm hiểu cách motion vector hỗ trợ video understanding và cải thiện tracking trong Ultralytics YOLO26.
Luồng quang học là dạng chuyển động biểu kiến của các vật thể, bề mặt và cạnh trong một cảnh quan sát, gây ra bởi chuyển động tương đối giữa người quan sát và cảnh đó. Trong lĩnh vực thị giác máy tính, khái niệm này đóng vai trò nền tảng để hiểu các động lực học theo thời gian trong chuỗi video. Bằng cách phân tích độ dịch chuyển của pixel giữa hai khung hình liên tiếp, các thuật toán luồng quang học tạo ra một trường vector, trong đó mỗi vector biểu thị hướng và độ lớn chuyển động của một điểm cụ thể. Tín hiệu thị giác cấp thấp này cho phép các hệ thống trí tuệ nhân tạo nhận biết không chỉ những gì có trong ảnh mà còn cách chúng đang chuyển động, thu hẹp khoảng cách giữa phân tích ảnh tĩnh và khả năng hiểu video động.
Cơ chế cốt lõi của luồng quang học#
Việc tính toán luồng quang học thường dựa trên giả định bảo toàn độ sáng, theo đó cường độ của một pixel trên vật thể vẫn không đổi từ khung hình này sang khung hình tiếp theo, ngay cả khi vật thể chuyển động. Các thuật toán sử dụng nguyên tắc này để giải các vector chuyển động theo hai phương pháp chính:
- Luồng quang học thưa: Phương pháp này tính vector chuyển động cho một tập con cụ thể gồm các đặc trưng riêng biệt, chẳng hạn như góc hoặc cạnh, được phát hiện thông qua trích xuất đặc trưng. Các thuật toán như phương pháp Lucas-Kanade có hiệu quả tính toán cao và phù hợp với các tác vụ suy luận thời gian thực, trong đó chỉ cần theo dõi các điểm quan tâm cụ thể.
- Luồng quang học dày: Phương pháp này tính một vector chuyển động cho từng pixel trong khung hình. Mặc dù đòi hỏi năng lực tính toán cao hơn đáng kể, phương pháp này cung cấp bản đồ chuyển động toàn diện, cần thiết cho các tác vụ chi tiết như phân đoạn ảnh và phân tích cấu trúc. Các kiến trúc deep learning hiện đại thường vượt trội hơn các phương pháp toán học truyền thống trong việc ước tính luồng dày nhờ học các mẫu chuyển động phức tạp từ những tập dữ liệu lớn.
Luồng quang học và Theo dõi đối tượng#
Mặc dù thường được sử dụng kết hợp, việc phân biệt luồng quang học với theo dõi đối tượng là rất quan trọng. Luồng quang học là một phép toán cấp thấp mô tả chuyển động tức thời của pixel; bản thân nó không hiểu được danh tính hoặc sự tồn tại liên tục của đối tượng.
Ngược lại, theo dõi đối tượng là một tác vụ cấp cao, xác định các thực thể cụ thể và gán cho chúng một ID nhất quán theo thời gian. Các tracker nâng cao, chẳng hạn như những tracker được tích hợp trong Ultralytics YOLO26, thường thực hiện phát hiện đối tượng để tìm đối tượng, sau đó sử dụng các tín hiệu chuyển động—đôi khi được suy ra từ luồng quang học—để liên kết các kết quả phát hiện giữa các khung hình. Luồng quang học trả lời câu hỏi "những pixel này hiện đang di chuyển nhanh đến mức nào", trong khi tính năng theo dõi trả lời câu hỏi "Xe số 5 đã đi đâu?"
Các ứng dụng trong thực tế#
Khả năng ước tính chuyển động ở cấp độ pixel hỗ trợ nhiều công nghệ tinh vi:
- Phương tiện tự hành và Robot: Luồng quang học được sử dụng cho đo đạc chuyển động trực quan, cho phép robot hoặc xe ước tính chuyển động của chính nó so với môi trường xung quanh. Luồng quang học cũng hỗ trợ ước tính độ sâu và tránh chướng ngại vật bằng cách phân tích tốc độ các vật thể trong trường nhìn đang mở rộng hoặc chuyển động.
- Ổn định video: Camera và phần mềm chỉnh sửa sử dụng các vector luồng để phát hiện rung camera ngoài ý muốn. Bằng cách bù cho chuyển động tổng thể này, các hệ thống có thể ổn định cảnh quay bằng kỹ thuật số. Đây là tính năng tiêu chuẩn trên các thiết bị điện tử tiêu dùng hiện đại như smartphone và camera hành trình.
- Nhận dạng hành động: Trong phân tích thể thao và an ninh, việc phân tích luồng pixel theo thời gian giúp các hệ thống nhận diện các hành động phức tạp của con người. Ví dụ, các model ước tính tư thế có thể được bổ sung dữ liệu luồng để phân biệt một người đang đi bộ hay chạy dựa trên tốc độ chuyển động của các chi.
- Nén video: Các tiêu chuẩn như mã hóa video MPEG phụ thuộc nhiều vào việc ước tính chuyển động. Thay vì lưu trữ từng khung hình đầy đủ, codec lưu trữ luồng quang học (các vector chuyển động) và phần chênh lệch (phần dư) giữa các khung hình, giúp giảm đáng kể kích thước tệp khi streaming và lưu trữ.
Ví dụ triển khai#
Ví dụ sau đây minh họa cách tính luồng quang học dày bằng thư viện OpenCV, một công cụ tiêu chuẩn trong hệ sinh thái thị giác máy tính. Đoạn mã này sử dụng thuật toán Farneback để tạo bản đồ luồng giữa hai khung hình liên tiếp.
import cv2
import numpy as np
# Simulate two consecutive frames (replace with actual image paths)
frame1 = np.zeros((100, 100, 3), dtype=np.uint8)
frame2 = np.zeros((100, 100, 3), dtype=np.uint8)
cv2.rectangle(frame1, (20, 20), (40, 40), (255, 255, 255), -1) # Object at pos 1
cv2.rectangle(frame2, (25, 25), (45, 45), (255, 255, 255), -1) # Object moved
# Convert to grayscale for flow calculation
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# Calculate dense optical flow
flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# Compute magnitude and angle of 2D vectors
mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
print(f"Max motion detected: {np.max(mag):.2f} pixels")Đối với các ứng dụng cấp cao yêu cầu duy trì danh tính đối tượng thay vì chỉ chuyển động thô của pixel, người dùng nên cân nhắc các chế độ theo dõi có sẵn trong Ultralytics YOLO11 và YOLO26. Các model này trừu tượng hóa sự phức tạp của việc phân tích chuyển động, cung cấp sẵn ID và quỹ đạo đối tượng mạnh mẽ cho các tác vụ từ giám sát giao thông đến phân tích bán lẻ.









