Scene Flow
Scene flow là trường chuyển động 3D của một cảnh, biểu diễn vector dịch chuyển của mọi điểm hiển thị giữa các khung hình và được ước tính từ dữ liệu stereo, RGB-D hoặc LiDAR.
Luồng cảnh là trường chuyển động ba chiều của một cảnh: với mỗi điểm bề mặt nhìn thấy được, một vector 3D biểu thị vị trí điểm đó ở khung hình này chuyển đến đâu ở khung hình kế tiếp. Sundar Vedula, Simon Baker và các cộng sự tại Đại học Carnegie Mellon đưa ra thuật ngữ này trong bài báo năm 1999 Three-Dimensional Scene Flow, định nghĩa nó là đối ứng 3D của luồng quang học. Luồng cảnh kết hợp hình học và chuyển động, cho hệ thống thị giác máy tính biết cả vị trí từng điểm lẫn tốc độ di chuyển tính bằng mét, bao gồm chuyển động về phía hoặc ra xa camera. Vì vậy, đây là tín hiệu cốt lõi cho xe tự hành và robotics, nơi cần nhận biết một chiếc xe đang nhập làn hoặc một người bước vào lộ trình dựa trên chuyển động của họ.
Luồng cảnh và Luồng quang học#
Luồng quang học là phép chiếu luồng cảnh lên mặt phẳng ảnh: nó ghi lại mỗi pixel dịch chuyển bao xa sang hai bên, lên trên hoặc xuống dưới, nhưng không cho biết chuyển động dọc theo đường ngắm của camera. Vì vậy, hai vật thể có luồng quang học giống hệt nhau vẫn có thể di chuyển rất khác nhau. Luồng cảnh khôi phục thành phần còn thiếu bằng ước lượng độ sâu tại cả hai thời điểm, chiếu ngược từng pixel dọc theo tia nhìn đến độ sâu đo được:
import numpy as np
K_inv = np.linalg.inv(np.array([[500.0, 0, 320], [0, 500.0, 240], [0, 0, 1]])) # inverse camera intrinsics
# Two objects with identical optical flow: each moves from pixel (400, 240) to (410, 240) in 0.1 s
for name, depth_before, depth_after in [("cyclist crossing", 8.0, 8.0), ("car approaching", 8.0, 6.0)]:
# Back-project each pixel along its viewing ray to the measured depth
before = depth_before * K_inv @ np.array([400, 240, 1.0])
after = depth_after * K_inv @ np.array([410, 240, 1.0])
# Scene flow is the 3D displacement of the same surface point
flow = after - before
print(f"{name}: scene flow {flow.round(2)} m, speed {np.linalg.norm(flow) / 0.1:.1f} m/s")Cả hai vật thể đều dịch 10 pixel sang phải, nhưng người đi xe đạp di chuyển ngang 0,16 m với tốc độ 1,6 m/s, trong khi ô tô tiến gần 2 m trong một phần mười giây với tốc độ 20,1 m/s. Ở khoảng cách 6 m và đang tiến đến với tốc độ 20 m/s, ô tô sẽ đến vị trí camera sau 0,3 giây.
Luồng cảnh cũng khác với theo dõi đối tượng, vốn theo dõi danh tính đối tượng dưới dạng bounding box, và theo dõi điểm, vốn theo dõi các điểm 2D được chọn qua nhiều khung hình. Ước lượng tốc độ bằng Ultralytics YOLO hoạt động ở cấp theo dõi 2D: phương pháp này theo dõi từng box được theo dõi và chuyển độ dịch chuyển pixel thành km/h bằng một tỷ lệ mét trên pixel cho toàn bộ góc nhìn; cách này phù hợp khi camera hướng xuống mặt đường và phương tiện di chuyển song song với ảnh.
Cách ước lượng Luồng cảnh#
Phương pháp phụ thuộc vào đầu vào. Camera stereo cung cấp disparity ở cả hai thời điểm cùng luồng quang học giữa các khung hình, đây là cấu hình của benchmark luồng cảnh KITTI do Moritz Menze và Andreas Geiger phát hành năm 2015, gồm 200 cảnh đường để huấn luyện và 200 cảnh để kiểm thử. Camera RGB-D và LiDAR cung cấp hai đám mây điểm, thường được hợp nhất với ảnh camera qua hợp nhất cảm biến; các mạng như FlowNet3D học cách khớp trực tiếp các điểm giữa hai đám mây. Camera đơn dựa vào độ sâu đơn ảnh được học và luồng quang học cho mỗi cặp khung hình.
Khi camera di chuyển, mọi điểm tĩnh cũng có vẻ chuyển động, vì vậy hệ thống hoàn chỉnh còn ước lượng chuyển động riêng của camera, thường thông qua SLAM thị giác hoặc odometry, rồi xem các điểm có luồng chuyển động không khớp với chuyển động đó là những điểm chuyển động độc lập. Cảnh giao thông chủ yếu gồm các vật thể cứng, nên những phương pháp như luồng cảnh đối tượng của Menze và Geiger cùng RAFT-3D gom pixel thành một số ít vật thể chuyển động cứng, giúp ổn định ước lượng trên thân xe ít họa tiết. Vùng che khuất là trường hợp khó nhất, vì các điểm xuất hiện hoặc biến mất giữa các khung hình không có điểm tương ứng để đo.
Model deep learning cần ground truth dày đặc mà cảm biến thực không thể thu thập, vì vậy quá trình huấn luyện phụ thuộc nhiều vào dữ liệu tổng hợp. Bộ dữ liệu luồng cảnh Freiburg, bao gồm FlyingThings3D, dựng hàng chục nghìn khung hình stereo với disparity, luồng quang học và biến thiên disparity chính xác; FlowNet3D, chỉ được huấn luyện trên FlyingThings3D, đã chuyển giao sang các bản quét LiDAR KITTI thực tế.
Ứng dụng thực tế#
- Robot di động: Robot hoạt động cùng người trong nhà kho và trên vỉa hè sử dụng chuyển động 3D của vật cản gần đó để dự đoán vị trí của chúng sau một giây và lập lại lộ trình tránh vật cản.
- Tái tạo cảnh động: Gaussian splatting 4D và trường bức xạ thần kinh động mô hình hóa cảnh chuyển động bằng cách học cách mỗi điểm hoặc Gaussian di chuyển theo thời gian; luồng cảnh được học này cho phép phát lại video đã ghi từ các góc nhìn mới.
- Lái xe tự hành: Luồng cảnh LiDAR tách phương tiện và người đi bộ đang di chuyển khỏi thế giới tĩnh giữa các lượt quét liên tiếp. Waymo Open Dataset bổ sung nhãn luồng cảnh vào năm 2021, với số khung hình được gán nhãn nhiều hơn khoảng 1.000 lần so với các bộ dữ liệu luồng cảnh thực tế trước đó.










