Optical Flow

Một robot di chuyển trong hành lang thường nhận được hàng chục khung hình mỗi giây. Ở từng ảnh riêng lẻ, camera chỉ ghi lại độ sáng tại các pixel. Tuy nhiên, khi đặt hai khung hình liên tiếp cạnh nhau, các cạnh cửa, góc tường và hoa văn trên sàn đều dịch chuyển một lượng nhỏ. Chính sự dịch chuyển có cấu trúc này cho phép robot nhận ra mình đang tiến về phía trước, một vật thể đang đi ngang qua, hoặc một vùng ảnh đang tiến gần camera.

Optical flow là bài toán ước lượng chuyển động biểu kiến đó trên mặt phẳng ảnh. Kết quả không trực tiếp cho biết vật thể đã dịch chuyển bao nhiêu mét trong không gian ba chiều. Nó cho biết một điểm ảnh ở thời điểm hiện tại có khả năng đã đi đến đâu ở thời điểm kế tiếp. Dù chỉ là chuyển động hai chiều, trường thông tin này vẫn là nền tảng của visual odometry, tracking, video stabilization, motion segmentation và nhiều hệ thống nhận thức động.

Bài toán optical flow

Gọi ảnh tại thời điểm tt là I(x,t)I(\mathbf{x}, t), trong đó x=(x,y)⊤\mathbf{x} = (x,y)^\top là tọa độ pixel. Sau một khoảng thời gian nhỏ Δt\Delta t, điểm ảnh đang xét được giả sử đã dịch chuyển bởi vector Δx=(Δx,Δy)⊤\Delta \mathbf{x} = (\Delta x, \Delta y)^\top. Bài toán là tìm vector vận tốc ảnh

w(x,y,t)=[u(x,y,t)v(x,y,t)],\mathbf{w}(x,y,t) = \begin{bmatrix} u(x,y,t) \\ v(x,y,t) \end{bmatrix},

trong đó uu là vận tốc theo phương ngang và vv là vận tốc theo phương dọc trên mặt phẳng ảnh. Khi ước lượng w\mathbf{w} tại mọi pixel, ta thu được một trường vector dày đặc. Nếu chỉ tính tại một tập điểm nổi bật như corner, kết quả là một trường chuyển động thưa.

Trong ví dụ robot chạy dọc hành lang, các điểm gần tâm ảnh thường di chuyển chậm, còn các điểm ở hai bên tường trượt nhanh ra ngoài. Hình dạng của trường vector không chỉ phụ thuộc vào chuyển động của camera mà còn phụ thuộc vào độ sâu của từng điểm trong cảnh.

Chuyển động biểu kiến

Optical flow không đồng nhất với chuyển động thật của vật thể. Một điểm ba chiều có thể chuyển động nhưng hình chiếu của nó gần như đứng yên nếu nó đi thẳng theo tia nhìn. Ngược lại, một bức tường đứng yên vẫn tạo ra chuyển động mạnh trên ảnh khi camera quay.

Cũng không phải mọi thay đổi độ sáng đều là chuyển động. Bóng đổ, phản xạ, đèn nhấp nháy hoặc cơ chế tự động phơi sáng của camera có thể làm pixel thay đổi dù cấu trúc cảnh không dịch chuyển. Vì vậy, optical flow nên được hiểu là trường chuyển động biểu kiến phù hợp nhất với chuỗi ảnh và các giả định của thuật toán.

Sự phân biệt này đặc biệt quan trọng trong robotics. Optical flow là một phép đo trên ảnh; để suy ra vận tốc camera, độ sâu hoặc chuyển động ba chiều, hệ thống cần thêm mô hình hình học, thông số nội tại của camera và thường cả những nguồn đo khác.

Brightness constancy

Giả định trung tâm của optical flow là một điểm vật lý giữ độ sáng gần như không đổi trong hai khung hình liên tiếp. Nếu điểm tại (x,y)(x,y) dịch chuyển đến (x+Δx,y+Δy)(x+\Delta x, y+\Delta y), ta viết

I(x,y,t)=I(x+Δx,y+Δy,t+Δt).I(x,y,t) = I(x+\Delta x, y+\Delta y, t+\Delta t).

Vế trái là cường độ sáng của điểm ở khung hình đầu; vế phải là cường độ tại vị trí mới của cùng điểm ở khung hình sau. Đây là một giả định gần đúng, nhưng hợp lý khi khoảng thời gian giữa hai ảnh ngắn, ánh sáng ổn định và bề mặt chủ yếu là Lambertian.

Với robot trong hành lang, một góc cửa tối trên nền tường sáng thường vẫn giữ đặc trưng độ sáng sau vài phần trăm giây. Ta chưa biết góc đó đã dịch chuyển bao nhiêu, nhưng có thể tìm chuyển động làm cho mẫu cường độ quanh nó khớp tốt nhất giữa hai ảnh.

Phương trình ràng buộc optical flow

Khi chuyển động nhỏ, khai triển Taylor bậc nhất của ảnh thứ hai quanh (x,y,t)(x,y,t) cho ta

I(x+Δx,y+Δy,t+Δt)≈I(x,y,t)+IxΔx+IyΔy+ItΔt,I(x+\Delta x,y+\Delta y,t+\Delta t) \approx I(x,y,t) + I_x\Delta x + I_y\Delta y + I_t\Delta t,

trong đó IxI_x và IyI_y là đạo hàm không gian của ảnh, còn ItI_t là đạo hàm theo thời gian. Kết hợp với brightness constancy, bỏ I(x,y,t)I(x,y,t) ở hai vế rồi chia cho Δt\Delta t, ta được

Ixu+Iyv+It=0.I_xu + I_yv + I_t = 0.

Đây là phương trình ràng buộc optical flow. Vector gradient ảnh ∇I=(Ix,Iy)⊤\nabla I=(I_x,I_y)^\top cho biết hướng độ sáng thay đổi mạnh nhất. Phương trình có thể viết gọn thành

∇I⊤w=−It.\nabla I^\top \mathbf{w} = -I_t.

Thành phần của chuyển động theo hướng gradient được xác định bởi thay đổi độ sáng theo thời gian. Tuy nhiên, tại mỗi pixel chỉ có một phương trình trong khi cần tìm hai ẩn uu và vv. Một pixel riêng lẻ vì thế không đủ để xác định đầy đủ vector chuyển động.

Aperture problem

Hãy quan sát một cạnh thẳng qua một cửa sổ rất nhỏ. Khi cạnh dịch chuyển, ta chỉ nhận ra thành phần chuyển động vuông góc với cạnh; chuyển động dọc theo cạnh không làm mẫu ảnh trong cửa sổ thay đổi rõ ràng. Đây là aperture problem.

Về mặt hình học, phương trình Ixu+Iyv=−ItI_xu + I_yv = -I_t mô tả một đường thẳng trong không gian (u,v)(u,v). Mọi vector nằm trên đường đó đều giải thích được quan sát tại pixel đang xét. Muốn chọn một nghiệm duy nhất, thuật toán phải lấy thêm thông tin từ lân cận hoặc áp đặt một giả định về độ trơn của trường chuyển động.

Corner có lợi hơn edge vì cường độ thay đổi theo ít nhất hai hướng độc lập. Trong hành lang, giao điểm giữa khung cửa và chân tường có thể khóa được cả hai thành phần chuyển động, trong khi một đoạn tường thẳng dài thường chỉ cung cấp ràng buộc theo phương vuông góc với cạnh.

Lucas-Kanade

Lucas-Kanade giải aperture problem bằng giả định rằng các pixel trong một cửa sổ nhỏ có cùng chuyển động. Với NN pixel trong cửa sổ, mỗi pixel cung cấp một phương trình:

Ix(i)u+Iy(i)v=−It(i),i=1,…,N.I_x^{(i)}u + I_y^{(i)}v = -I_t^{(i)}, \qquad i=1,\ldots,N.

Xếp các phương trình thành hệ tuyến tính:

[Ix(1)Iy(1)Ix(2)Iy(2)⋮⋮Ix(N)Iy(N)]⏟A[uv]=−[It(1)It(2)⋮It(N)]⏟b.\underbrace{ \begin{bmatrix} I_x^{(1)} & I_y^{(1)} \\ I_x^{(2)} & I_y^{(2)} \\ \vdots & \vdots \\ I_x^{(N)} & I_y^{(N)} \end{bmatrix}}_{A} \begin{bmatrix}u\\v\end{bmatrix} = \underbrace{- \begin{bmatrix} I_t^{(1)}\\I_t^{(2)}\\\vdots\\I_t^{(N)} \end{bmatrix}}_{\mathbf{b}}.

Vì NN thường lớn hơn hai, nghiệm được tìm theo least squares:

w=(A⊤A)−1A⊤b.\mathbf{w} = (A^\top A)^{-1}A^\top\mathbf{b}.

Ma trận A⊤AA^\top A tổng hợp cấu trúc gradient trong cửa sổ. Nếu cả hai eigenvalue đều lớn, cửa sổ chứa biến thiên theo hai hướng và chuyển động được xác định tốt. Nếu chỉ một eigenvalue lớn, vùng đó giống một edge và vẫn còn mơ hồ. Nếu cả hai đều nhỏ, vùng ảnh gần như phẳng nên không có đủ tín hiệu để theo dõi.

Lucas-Kanade phù hợp với sparse optical flow: chọn các corner đáng tin cậy rồi theo dõi chúng qua chuỗi ảnh. Giả định chuyển động đồng nhất trong cửa sổ hoạt động tốt với vùng nhỏ và bề mặt tương đối đều, nhưng dễ sai ở biên giữa hai vật thể có chuyển động khác nhau.

Horn-Schunck

Horn-Schunck tiếp cận optical flow như một bài toán tối ưu trên toàn ảnh. Thay vì giải từng cửa sổ độc lập, phương pháp tìm trường (u,v)(u,v) vừa thỏa brightness constancy, vừa biến thiên trơn trong không gian:

E(u,v)=∬(Ixu+Iyv+It)2+α2(∥∇u∥2+∥∇v∥2) dx dy.E(u,v)= \iint \left(I_xu+I_yv+I_t\right)^2 +\alpha^2\left( \lVert\nabla u\rVert^2+ \lVert\nabla v\rVert^2 \right)\,dx\,dy.

Thành phần đầu là data term, đo mức vi phạm phương trình ràng buộc optical flow. Thành phần thứ hai là smoothness term, phạt những thay đổi quá gấp của trường vận tốc. Hệ số α\alpha cân bằng giữa việc bám sát dữ liệu ảnh và duy trì một trường chuyển động trơn.

Regularization giúp lấp chuyển động vào các vùng ít texture, nơi gradient ảnh không đủ mạnh. Đổi lại, độ trơn có thể làm nhòe ranh giới chuyển động. Chẳng hạn, khi một người đi ngang qua hành lang, vector của người và vector của bức tường không nên bị trộn với nhau, nhưng smoothness term đơn giản lại có xu hướng kéo chúng về gần nhau.

Lucas-Kanade và Horn-Schunck thể hiện hai cách bổ sung thông tin cho phương trình thiếu ràng buộc. Một bên giả định chuyển động cục bộ đồng nhất trong cửa sổ; bên kia áp đặt tính trơn trên toàn trường. Nhiều phương pháp hiện đại vẫn giữ cấu trúc data term và regularization này, dù cách mô hình hóa và tối ưu đã phức tạp hơn.

Image pyramid

Khai triển Taylor chỉ chính xác khi chuyển động giữa hai ảnh đủ nhỏ. Nếu robot quay nhanh hoặc vật thể ở gần camera, một điểm có thể dịch chuyển hàng chục pixel và phép tuyến tính hóa quanh vị trí ban đầu không còn phù hợp.

Image pyramid xử lý vấn đề này bằng cách giảm dần độ phân giải của ảnh. Ở tầng thô, chuyển động lớn trong ảnh gốc trở thành một độ dịch chuyển nhỏ hơn. Thuật toán ước lượng flow tại tầng này, phóng kết quả lên tầng kế tiếp, rồi tinh chỉnh phần sai lệch còn lại. Quá trình tiếp tục từ coarse đến fine cho đến độ phân giải gốc.

Nếu một điểm dịch chuyển 32 pixel ở ảnh gốc, sau bốn lần giảm kích thước theo hệ số hai, chuyển động chỉ còn khoảng 2 pixel. Lúc đó giả định chuyển động nhỏ trở nên hợp lý hơn. Tuy nhiên, downsampling cũng làm mất các cấu trúc nhỏ. Một vật thể mảnh có thể biến mất ở tầng thô, khiến flow khởi tạo sai và khó phục hồi ở các tầng sau.

Warping và refinement

Sau khi có flow ước lượng w\mathbf{w}, ảnh thứ hai có thể được warp ngược về hệ tọa độ của ảnh thứ nhất:

I^1(x)=I2(x+w(x)).\hat I_1(\mathbf{x}) = I_2(\mathbf{x}+\mathbf{w}(\mathbf{x})).

I2I_2 là ảnh thứ hai, còn I^1\hat I_1 là ảnh tái tạo bằng cách lấy mẫu I2I_2 tại vị trí mà flow dự đoán. Nếu flow chính xác và brightness constancy đúng, I^1\hat I_1 sẽ gần với I1I_1.

Sai khác giữa I1I_1 và I^1\hat I_1 tạo thành residual. Thuật toán có thể dùng residual này để tính một flow hiệu chỉnh, cộng nó vào ước lượng hiện tại rồi lặp lại. Warping biến bài toán chuyển động lớn thành chuỗi bài toán chuyển động nhỏ, đồng thời là cầu nối quan trọng giữa optical flow cổ điển và các mạng neural học flow theo kiểu coarse-to-fine hoặc iterative refinement.

Việc lấy mẫu thường cần nội suy vì tọa độ x+w(x)\mathbf{x}+\mathbf{w}(\mathbf{x}) không rơi đúng vào tâm pixel. Nội suy bilinear giữ phép warp liên tục theo flow, nhờ đó gradient có thể truyền qua thao tác này trong các mô hình học sâu.

Occlusion

Không phải pixel nào trong ảnh đầu cũng có điểm tương ứng ở ảnh thứ hai. Khi robot tiến về phía trước, một phần bức tường có thể đi ra ngoài khung hình. Đồng thời, vùng trước đó bị một vật thể che khuất có thể xuất hiện trở lại. Những trường hợp này tạo ra occlusion và disocclusion.

Brightness constancy không thể thỏa tại pixel bị che vì điểm tương ứng đơn giản không còn quan sát được. Nếu vẫn ép thuật toán gán flow, kết quả thường bị kéo theo các vùng lân cận hoặc trỏ đến một vị trí không có ý nghĩa vật lý.

Một kiểm tra phổ biến là so sánh forward flow từ ảnh một sang ảnh hai với backward flow theo chiều ngược lại. Với điểm nhìn thấy trong cả hai ảnh, đi xuôi bằng forward flow rồi quay lại bằng backward flow phải gần vị trí ban đầu. Sai lệch lớn là dấu hiệu của occlusion, lỗi matching hoặc vùng không đáng tin cậy.

Optical flow và scene flow

Optical flow sống trên mặt phẳng ảnh nên mỗi vector chỉ có hai thành phần (u,v)(u,v). Scene flow mô tả chuyển động ba chiều của các điểm trong cảnh và thường có ba thành phần vận tốc trong hệ tọa độ không gian.

Hai điểm có cùng vận tốc ba chiều vẫn có thể tạo optical flow khác nhau nếu chúng nằm ở độ sâu khác nhau. Với camera pinhole, chuyển động tịnh tiến của camera tạo flow có độ lớn tỷ lệ nghịch với độ sâu. Vật thể gần camera trượt nhanh hơn trên ảnh; vật thể xa dịch chuyển chậm hơn. Chuyển động quay của camera lại tạo thành phần flow không phụ thuộc trực tiếp vào độ sâu theo cùng cách.

Do đó, một trường optical flow dày đặc chứa manh mối về cả chuyển động camera và cấu trúc cảnh, nhưng không tự tách được hai yếu tố này. Để khôi phục chuyển động ba chiều, hệ thống cần camera calibration, ràng buộc rigid motion, depth, stereo hoặc nhiều khung hình.

Optical flow học sâu

Các mô hình học sâu không loại bỏ bản chất correspondence của bài toán. Chúng thay cách biểu diễn ảnh, cách tìm điểm tương ứng và cách regularize trường flow. Một kiến trúc điển hình trích xuất feature map từ hai ảnh, xây dựng một cấu trúc tương quan giữa các đặc trưng, rồi cập nhật flow qua nhiều vòng.

Feature giúp matching bền hơn so với so sánh độ sáng thô khi có thay đổi nhỏ về chiếu sáng hoặc texture. Correlation volume ghi lại mức tương đồng giữa một vị trí ở ảnh thứ nhất và nhiều vị trí ứng viên ở ảnh thứ hai. Bộ cập nhật sau đó kết hợp correlation, flow hiện tại và ngữ cảnh ảnh để dự đoán phần hiệu chỉnh.

Loss giám sát thường đo sai khác giữa flow dự đoán w^\hat{\mathbf{w}} và ground-truth w∗\mathbf{w}^{*}:

Lflow=∑xρ(w^(x)−w∗(x)),\mathcal{L}_{\text{flow}} = \sum_{\mathbf{x}} \rho\left( \hat{\mathbf{w}}(\mathbf{x})- \mathbf{w}^{*}(\mathbf{x}) \right),

trong đó ρ\rho là một hàm phạt, có thể là chuẩn L1L_1, endpoint error hoặc biến thể robust. Trong học không giám sát, photometric loss sau warping đóng vai trò gần giống brightness constancy, thường đi cùng smoothness loss và occlusion mask.

Mạng neural có thể học các prior mạnh về hình dạng, chuyển động và ngữ cảnh, nhưng vẫn chịu ảnh hưởng của domain shift. Mô hình học trên cảnh tổng hợp hoặc video đường phố có thể không giữ nguyên độ chính xác trong nhà máy, dưới nước hoặc trong môi trường thiếu sáng nếu phân bố ảnh thay đổi đáng kể.

Giới hạn

Optical flow đáng tin cậy nhất khi hai khung hình gần nhau, bề mặt có texture, ánh sáng ổn định và chuyển động không gây che khuất quá mạnh. Những điều kiện sau làm bài toán khó hơn rõ rệt:

  • Vùng phẳng hoặc họa tiết lặp lại không cung cấp correspondence duy nhất.
  • Motion blur làm mất gradient và kéo dài cấu trúc theo hướng chuyển động.
  • Ánh sáng thay đổi phá vỡ brightness constancy.
  • Bề mặt phản xạ, trong suốt hoặc không Lambertian tạo chuyển động độ sáng khác chuyển động vật lý.
  • Occlusion khiến một số correspondence không tồn tại.
  • Chuyển động lớn vượt quá miền tìm kiếm hoặc mức biểu diễn của pyramid.
  • Biên vật thể làm giả định smoothness trộn các chuyển động khác nhau.

Trong hệ robot, flow cũng không nên được dùng như một phép đo chắc chắn ở mọi pixel. Confidence, forward-backward consistency, uncertainty hoặc mask vùng động giúp hệ thống biết phần nào của trường vector có thể đưa vào visual odometry và phần nào cần loại bỏ. Giá trị của optical flow không nằm ở việc biến mọi thay đổi ảnh thành một vector, mà ở việc cung cấp một mô tả chuyển động có cấu trúc, kèm theo nhận thức rõ về những nơi mô tả đó không còn đáng tin.

Bình luận & Cảm xúc