当前位置: 首页 > news >正文

计算机视觉5——运动估计和光流估计

一、运动估计

(一)运动场(Motion Field)

  1. 定义与物理意义
    运动场是三维场景中物体或相机运动在二维图像平面上的投影,表现为图像中每个像素点的运动速度矢量。其本质是场景点三维运动(平移、旋转、缩放等)通过透视投影在图像平面的映射,反映了物体在空间中的相对运动关系。例如,当相机向前移动时,图像中近处物体的运动场矢量较大,远处物体的矢量较小,且方向背离相机光心。

  2. 数学建模与投影关系
    设场景点坐标为 r o = ( x , y , z ) r_o = (x, y, z) ro=(x,y,z),其三维运动速度为 v o = ( v x , v y , v z ) v_o = (v_x, v_y, v_z) vo=(vx,vy,vz),相机焦距为 f f f,则图像点运动速度 v i = ( u , v ) v_i = (u, v) vi=(u,v) 可通过针孔相机模型推导得出:
    v i = f ( r o ⋅ z ) ⋅ v o − ( v o ⋅ z ) ⋅ r o ( r o ⋅ z ) 2 = f ( r o × v o ) × z ( r o ⋅ z ) 2 v_{i}=f \frac{\left(r_{o} \cdot z\right) \cdot v_{o}-\left(v_{o} \cdot z\right) \cdot r_{o}}{\left(r_{o} \cdot z\right)^{2}} = f \frac{\left(r_{o} \times v_{o}\right) \times z}{\left(r_{o} \cdot z\right)^{2}} vi=f(roz)2(roz)vo(voz)ro=f(roz)2(ro×vo)×z
    其中, r o ⋅ z r_o \cdot z roz 表示场景点深度, r o × v o r_o \times v_o ro×vo 为叉乘运算。该公式表明,图像点速度与场景点的深度成反比(近处物体运动更快),且与运动方向相关。例如,当场景点沿相机光轴方向( v z v_z vz)运动时,图像点速度会呈现放射状分布。

  3. 典型运动场景分析

    • 相机平移:图像中所有点的运动场矢量指向平移反方向,且幅度随深度增加而减小。
    • 相机旋转:运动场呈现旋转对称分布,中心点(光心投影)运动矢量为零。
    • 物体缩放:当物体靠近或远离相机时,运动场矢量从中心向外扩散或向中心汇聚。

(二)光流(Optical Flow)

  1. 定义与直观理解
    光流是图像中亮度模式的表观运动,即相邻两帧图像中同一物体点的像素位移矢量 ( u , v ) (u, v) (u,v)。例如,视频中行走的人,其像素在连续帧中的位移构成光流场。光流不直接等于运动场,但在理想条件下(亮度不变、无遮挡)可近似表示运动场。

  2. 光流的双重属性

    • 局部性:每个像素的光流仅依赖于其邻域的亮度变化,适用于局部运动分析。
    • 全局性:整体光流场反映场景的运动结构,可用于场景理解(如自动驾驶中的障碍物检测)。

(三)运动场与光流的关系

  1. 理想等价性
    当场景满足以下条件时,光流等于运动场:

    • 物体表面亮度恒定且均匀;
    • 相机曝光瞬间完成,无运动模糊;
    • 场景点深度一致(如平面场景)。
      此时,光流直接对应场景点的二维投影运动。
  2. 非理想情况对比

    • 有运动场无光流(亮度不变但模式不变)
      例:固定光源下的旋转球体,表面亮度模式(如纯色)不随旋转改变,光流估计为零,但实际存在运动场(球面切线方向运动)。
    • 无光运动场有光流(亮度变化但物体静止)
      例:固定球体被移动的聚光灯照射,像素亮度随光照变化而变化,光流检测到伪运动,但物体实际未移动。
    • 孔径问题导致的不一致
      当观察窗口仅包含单一方向边缘(如水平线),光流只能检测到垂直于边缘的运动分量,平行分量丢失,导致光流与实际运动场方向不一致。

二、光流估计(Optical Flow Estimation)

(一)定义与目标

给定连续两帧图像 I ( x , y , t ) I(x, y, t) I(x,y,t)(t时刻)和 I ( x , y , t + 1 ) I(x, y, t+1) I(x,y,t+1)(t+1时刻),光流估计的核心目标是计算每个像素点 ( x , y ) (x, y) (x,y)的位移矢量 ( u , v ) (u, v) (u,v),使得:
I ( x , y , t ) = I ( x + u , y + v , t + 1 ) I(x, y, t) = I(x+u, y+v, t+1) I(x,y,t)=I(x+u,y+v,t+1)
该问题本质是通过图像亮度变化推断像素运动,是一个典型的逆问题,需依赖先验假设求解。

(二)关键假设

  1. 亮度一致性假设(Brightness Constancy Assumption)

    • 数学表达
      I ( x , y , t ) = I ( x + u , y + v , t + 1 ) I(x, y, t) = I(x+u, y+v, t+1) I(x,y,t)=I(x+u,y+v,t+1)
    • 物理意义:假设物体表面反射率不变,且光照条件稳定,同一物体点在不同帧中的亮度值相同。这是光流估计的基石,但在实际中易受光照变化、物体遮挡、镜面反射等因素破坏。
  2. 小运动假设(Small Motion Assumption)

    • 假设两帧间像素位移 ( u , v ) (u, v) (u,v) 足够小(通常小于1像素),使得泰勒展开的高阶项可忽略,仅保留一阶线性项。若运动幅度过大(如快速运动物体),该假设失效,需通过迭代或金字塔方法补偿。
  3. 空间连续性假设(Spatial Continuity Assumption)

    • 假设相邻像素的运动矢量相似,即像素 ( x , y ) (x, y) (x,y)的光流 ( u , v ) (u, v) (u,v)与邻域像素的光流差异较小。该假设通过引入平滑约束,将单像素的欠定问题转化为邻域的超定问题。

(三)光流基本方程推导

  1. 泰勒展开与线性近似

对于 I ( x + u , y + v , t + 1 ) I(x+u, y+v, t+1) I(x+u,y+v,t+1) ( x , y , t ) (x, y, t) (x,y,t)处进行一阶泰勒展开:
I ( x + u , y + v , t + 1 ) = I ( x , y , t ) + I x u + I y v + I t + O ( u 2 , v 2 , u v ) I(x+u, y+v, t+1) = I(x, y, t) + I_x u + I_y v + I_t + \mathcal{O}(u^2, v^2, uv) I(x+u,y+v,t+1)=I(x,y,t)+Ixu+Iyv+It+O(u2,v2,uv)

忽略高阶小项 O ( u 2 , v 2 , u v ) \mathcal{O}(u^2, v^2, uv) O(u2,v2,uv),结合亮度一致性假设 I ( x , y , t ) = I ( x + u , y + v , t + 1 ) I(x, y, t) = I(x+u, y+v, t+1) I(x,y,t)=I(x+u,y+v,t+1),得到光流基本方程:
I x u + I y v + I t = 0 I_x u + I_y v + I_t = 0 Ixu+Iyv+It=0

其中:

  • I x = ∂ I ∂ x I_x = \frac{\partial I}{\partial x} Ix=xI为空间x方向梯度
  • I y = ∂ I ∂ y I_y = \frac{\partial I}{\partial y} Iy=yI为空间y方向梯度
  • I t = ∂ I ∂ t I_t = \frac{\partial I}{\partial t} It=tI为时间梯度
  • ∇ I = [ I x , I y ] T \nabla I = [I_x, I_y]^T I=[Ix,Iy]T表示空间梯度矢量

这个方程表明,在时间间隔 Δ t \Delta t Δt内,图像亮度变化 I t I_t It可以表示为空间梯度 ∇ I \nabla I I与像素位移 ( u , v ) (u,v) (u,v)的点积。

  1. 向量形式与几何意义

光流基本方程可表示为:
∇ I ⋅ [ u , v ] T + I t = 0 \nabla I \cdot [u, v]^T + I_t = 0 I[u,v]T+It=0

几何上,该方程表明光流矢量 [ u , v ] [u, v] [u,v]位于以 − I t / ∇ I -I_t / \nabla I It/∇I为法向量的直线上,即光流矢量在梯度方向上的投影为 − I t / ∣ ∇ I ∣ -I_t / |\nabla I| It/∣∇I,垂直于梯度方向的分量无法确定,导致孔径问题。

(四)孔径问题(Aperture Problem)

  1. 问题本质与数学解释
    当观察窗口内的图像模式为均匀区域( ∇ I = 0 \nabla I = 0 I=0)或单一方向边缘(如水平线, ∇ I = [ I x , 0 ] T \nabla I = [I_x, 0]^T I=[Ix,0]T),光流方程无法唯一确定 ( u , v ) (u, v) (u,v)
  • 均匀区域:梯度为零,方程退化为 0 ⋅ u + 0 ⋅ v + I t = 0 0 \cdot u + 0 \cdot v + I_t = 0 0u+0v+It=0,无解(若 I t ≠ 0 I_t \neq 0 It=0)或无穷解(若 I t = 0 I_t = 0 It=0)。
  • 边缘区域:梯度方向为 θ \theta θ,光流方程仅约束垂直于边缘的运动分量 u cos ⁡ θ + v sin ⁡ θ = − I t / ∣ ∇ I ∣ u \cos\theta + v \sin\theta = -I_t / |\nabla I| ucosθ+vsinθ=It/∣∇I,平行于边缘的分量自由,导致多解。
  1. 经典示例:理发店三色柱错觉
    三色柱表面为垂直条纹,当柱子旋转时,观察窗口(孔径)仅包含垂直条纹,光流检测到的运动方向为水平方向(垂直于条纹),而实际运动方向为切线方向(包含垂直分量),形成感知运动与实际运动的差异。孔径形状(如圆形、矩形)和条纹方向决定了感知运动的主导方向,圆形孔径下感知运动方向为条纹法线方向。

(五)Lucas Kanade方法(Lucas-Kanade Method)

  1. 核心思想:邻域约束求解欠定问题
    Lucas Kanade(LK)方法假设像素邻域内的运动矢量相同,将单像素的1个方程扩展为邻域的(n)个方程(通常取5x5邻域,(n=25)),通过最小二乘法求解超定方程组,增强解的稳定性。

  2. 数学推导步骤

  • 步骤1:构建超定方程组
    设邻域内第 i i i个像素点 p i = ( x i , y i ) p_i = (x_i, y_i) pi=(xi,yi)满足光流方程:
    I x ( p i ) u + I y ( p i ) v = − I t ( p i ) , i = 1 , 2 , … , n I_x(p_i) u + I_y(p_i) v = -I_t(p_i), \quad i = 1, 2, \dots, n Ix(pi)u+Iy(pi)v=It(pi),i=1,2,,n

写成矩阵形式:
A d = b A \mathbf{d} = \mathbf{b} Ad=b
其中
A = [ I x ( p 1 ) I y ( p 1 ) I x ( p 2 ) I y ( p 2 ) ⋮ ⋮ I x ( p n ) I y ( p n ) ] A = \begin{bmatrix} I_x(p_1) & I_y(p_1) \\ I_x(p_2) & I_y(p_2) \\ \vdots & \vdots \\ I_x(p_n) & I_y(p_n) \end{bmatrix} A= Ix(p1)Ix(p2)Ix(pn)Iy(p1)Iy(p2)Iy(pn)
d = [ u v ] \mathbf{d} = \begin{bmatrix} u \\ v \end{bmatrix} d=[uv]
b = − [ I t ( p 1 ) I t ( p 2 ) ⋮ I t ( p n ) ] \mathbf{b} = -\begin{bmatrix} I_t(p_1) \\ I_t(p_2) \\ \vdots \\ I_t(p_n) \end{bmatrix} b= It(p1)It(p2)It(pn)

  • 步骤2:最小二乘求解
    超定方程的最优解为最小化误差平方和:
    d ^ = arg ⁡ min ⁡ d ∥ A d − b ∥ 2 \hat{\mathbf{d}} = \arg\min_{\mathbf{d}} \| A \mathbf{d} - \mathbf{b} \|^2 d^=argmindAdb2

d \mathbf{d} d求导并令导数为零,得正规方程:
A T A d = A T b A^T A \mathbf{d} = A^T \mathbf{b} ATAd=ATb

其中, A T A A^T A ATA为二阶矩矩阵(Structure Tensor):
A T A = [ ∑ I x 2 ∑ I x I y ∑ I x I y ∑ I y 2 ] A^T A = \begin{bmatrix} \sum I_x^2 & \sum I_x I_y \\ \sum I_x I_y & \sum I_y^2 \end{bmatrix} ATA=[Ix2IxIyIxIyIy2]
A T b = − [ ∑ I x I t ∑ I y I t ] A^T \mathbf{b} = -\begin{bmatrix} \sum I_x I_t \\ \sum I_y I_t \end{bmatrix} ATb=[IxItIyIt]

A T A A^T A ATA可逆时,解为:
d = ( A T A ) − 1 A T b \mathbf{d} = (A^T A)^{-1} A^T \mathbf{b} d=(ATA)1ATb

  1. 适用条件:特征值分析
    二阶矩矩阵 A T A A^T A ATA 的特征值 ( λ 1 , λ 2 ) (\lambda_1, \lambda_2) (λ1,λ2) 决定了光流解的稳定性:

    • 角点区域 ( λ 1 ≈ λ 2 ) (\lambda_1 \approx \lambda_2) (λ1λ2) 且值较大,矩阵良态,解唯一且稳定(适合LK方法)。
    • 边缘区域 ( λ 1 ≫ λ 2 ) (\lambda_1 \gg \lambda_2) (λ1λ2) ( λ 2 ≫ λ 1 ) (\lambda_2 \gg \lambda_1) (λ2λ1),矩阵病态,仅能确定一个方向的运动(孔径问题)。
    • 平滑区域 ( λ 1 ≈ λ 2 ≈ 0 ) (\lambda_1 \approx \lambda_2 \approx 0) (λ1λ20),矩阵不可逆,无法求解(无梯度信息)。
  2. 失效场景与改进策略

场景1:大幅运动( ∣ u ∣ , ∣ v ∣ > 1 |u|, |v| > 1 u,v>1 像素)

  • 问题:小运动假设(泰勒展开一阶近似)失效,导致线性化误差显著。
  • 解决方案
    1. 迭代精修(Iterative Refinement)

      • 初始化光流 ( u 0 , v 0 ) = ( 0 , 0 ) (u_0, v_0) = (0, 0) (u0,v0)=(0,0),通过迭代优化逐步逼近真实位移:
        d k = ( A T A ) − 1 A T b k , b k = − [ I t ( x + u k − 1 , y + v k − 1 ) ] \mathbf{d}_k = (A^T A)^{-1} A^T \mathbf{b}_k, \quad \mathbf{b}_k = -\left[ I_t(x+u_{k-1}, y+v_{k-1}) \right] dk=(ATA)1ATbk,bk=[It(x+uk1,y+vk1)]
      • 核心思想:每次迭代后对图像进行扭曲(Warping),重新计算残差 b k \mathbf{b}_k bk,直至收敛。
    2. 由粗到细金字塔方法(Coarse-to-Fine Pyramid)

      • 步骤
        1. 构建高斯金字塔(多尺度图像层),从最粗分辨率开始估计光流。
        2. 将粗尺度的光流上采样并作为下一层的初始值,逐层优化至原始分辨率。
      • 优势:将大位移分解为多层小位移,避免局部极小值并扩大捕捉范围。

场景2:光照变化(亮度一致性假设失效)

  • 问题:因光照变化导致 I ( x , y , t ) ≠ I ( x + u , y + v , t + 1 ) I(x, y, t) \neq I(x+u, y+v, t+1) I(x,y,t)=I(x+u,y+v,t+1),数据项误差增大。
  • 解决方案
    1. 特征点匹配

      • 检测稳定特征点(如Harris角点、SIFT),对特征邻域应用LK方法,减少对全局亮度一致的依赖。
    2. 鲁棒损失函数

      • 替换L2损失为对异常值不敏感的损失函数:
        • L1范数 E data = ∑ ∣ I x u + I y v + I t ∣ E_{\text{data}} = \sum |I_x u + I_y v + I_t| Edata=Ixu+Iyv+It
        • Huber损失
          L ( e ) = { 1 2 e 2 if  ∣ e ∣ ≤ δ , δ ( ∣ e ∣ − 1 2 δ ) otherwise. L(e) = \begin{cases} \frac{1}{2} e^2 & \text{if } |e| \leq \delta, \\ \delta (|e| - \frac{1}{2} \delta) & \text{otherwise.} \end{cases} L(e)={21e2δ(e21δ)if eδ,otherwise.
    3. 多帧约束

      • 前向-后向一致性检查:计算前向光流 ( u f , v f ) (u_f, v_f) (uf,vf) 和后向光流 ( u b , v b ) (u_b, v_b) (ub,vb),剔除不满足 ∥ ( u f + u b , v f + v b ) ∥ < ϵ \| (u_f + u_b, v_f + v_b) \| < \epsilon (uf+ub,vf+vb)<ϵ 的不可靠点。

(六)光流平滑性约束(Smoothness Constraint)

1. 动机:抑制噪声与不连续解

仅依赖邻域约束可能导致光流场出现噪声或局部不连续,需引入全局约束强制光流在空间上平滑变化,尤其在无纹理区域(如天空、墙面)维持一致性。

2. 数学模型

基本平滑项(Basic Smoothness Term)

惩罚光流 ( u , v ) (u, v) (u,v) 的梯度变化,使相邻像素的光流尽可能接近:
E smooth = ∑ x , y ( ( ∂ u ∂ x ) 2 + ( ∂ u ∂ y ) 2 + ( ∂ v ∂ x ) 2 + ( ∂ v ∂ y ) 2 ) E_{\text{smooth}} = \sum_{x, y} \left( \left( \frac{\partial u}{\partial x} \right)^2 + \left( \frac{\partial u}{\partial y} \right)^2 + \left( \frac{\partial v}{\partial x} \right)^2 + \left( \frac{\partial v}{\partial y} \right)^2 \right) Esmooth=x,y((xu)2+(yu)2+(xv)2+(yv)2)

图像梯度加权平滑项(Gradient-Weighted Smoothness Term)

在边缘区域降低平滑约束(避免模糊边界),在平滑区域增强约束(抑制噪声):
E smooth = ∑ x , y w ( ∇ I ) ( ( ∂ u ∂ x ) 2 + ( ∂ u ∂ y ) 2 + ( ∂ v ∂ x ) 2 + ( ∂ v ∂ y ) 2 ) E_{\text{smooth}} = \sum_{x, y} w(\nabla I) \left( \left( \frac{\partial u}{\partial x} \right)^2 + \left( \frac{\partial u}{\partial y} \right)^2 + \left( \frac{\partial v}{\partial x} \right)^2 + \left( \frac{\partial v}{\partial y} \right)^2 \right) Esmooth=x,yw(I)((xu)2+(yu)2+(xv)2+(yv)2)
其中权重函数:
w ( ∇ I ) = 1 1 + ∣ ∇ I ∣ 2 w(\nabla I) = \frac{1}{1 + |\nabla I|^2} w(I)=1+∣∇I21

  • 边缘区域 ∣ ∇ I ∣ |\nabla I| ∣∇I 大): w ( ∇ I ) w(\nabla I) w(I) 较小,放松平滑约束。
  • 平滑区域 ∣ ∇ I ∣ |\nabla I| ∣∇I 小): w ( ∇ I ) w(\nabla I) w(I) 较大,强制平滑。

3. 与数据项的联合优化

光流估计的完整能量函数为数据项和平滑项的加权和:
E = E data + α E smooth E = E_{\text{data}} + \alpha E_{\text{smooth}} E=Edata+αEsmooth

  • 数据项(基于亮度恒定假设):
    E data = ∑ p ∈ 邻域 ( I x u + I y v + I t ) 2 E_{\text{data}} = \sum_{p \in \text{邻域}} (I_x u + I_y v + I_t)^2 Edata=p邻域(Ixu+Iyv+It)2
  • 平衡参数 α \alpha α:需通过实验或学习确定,控制平滑强度。

(七)光流可视化

  1. 彩色轮盘编码(Color Wheel Encoding)
    光流方向和幅度的可视化通常采用HSV颜色空间:

    • 色调(Hue):编码运动方向,0°(红色)表示向右,90°(绿色)表示向上,180°(蓝色)表示向左,270°(黄色)表示向下,中间角度对应混合颜色。
    • 饱和度(Saturation):编码运动幅度,饱和度越高表示位移越大。
    • 亮度(Value):通常设为常数,或根据梯度强度调整,突出高纹理区域的光流。
  2. 示例:相机平移光流场
    当相机向右平移时,光流场的色调分布为左侧区域偏蓝(向左运动),右侧区域偏红(向右运动),中心区域色调过渡自然;饱和度随距离相机光心的距离增加而升高(远处物体运动幅度小,饱和度低;近处物体运动幅度大,饱和度高)。

(八)光流估计评价标准

1. 角度误差(Angular Error, AE)

  • 定义:估计光流 ( u , v ) (u, v) (u,v) 与真值光流 ( u GT , v GT ) (u_{\text{GT}}, v_{\text{GT}}) (uGT,vGT) 的夹角,衡量方向一致性:
    A E = cos ⁡ − 1 ( 1 + u u GT + v v GT 1 + u 2 + v 2 1 + u GT 2 + v GT 2 ) AE = \cos^{-1} \left( \frac{1 + u u_{\text{GT}} + v v_{\text{GT}}}{\sqrt{1 + u^2 + v^2} \sqrt{1 + u_{\text{GT}}^2 + v_{\text{GT}}^2}} \right) AE=cos1(1+u2+v2 1+uGT2+vGT2 1+uuGT+vvGT)
  • 范围 [ 0 , π ] [0, \pi] [0,π],值越小表示方向越接近(理想情况为 0 0 0)。

2. 端点误差(Endpoint Error, EE)

  • 定义:估计光流与真值光流的欧氏距离,反映位移精度:
    E E = ( u − u GT ) 2 + ( v − v GT ) 2 EE = \sqrt{(u - u_{\text{GT}})^2 + (v - v_{\text{GT}})^2} EE=(uuGT)2+(vvGT)2
  • 物理意义:直接测量像素点的定位误差,单位为像素(值越小越准确)。

3. 插值误差(Interpolation Error, IE)

  • 定义:将第二帧图像通过光流扭曲(Warp)到第一帧后,与第一帧的像素均方根误差:
    I E = 1 N ∑ ( x , y ) ( I ( x , y , t ) − I warped ( x , y , t ) ) 2 IE = \sqrt{\frac{1}{N} \sum_{(x, y)} \left( I(x, y, t) - I_{\text{warped}}(x, y, t) \right)^2} IE=N1(x,y)(I(x,y,t)Iwarped(x,y,t))2
    其中扭曲图像 I warped I_{\text{warped}} Iwarped 定义为:
    I warped ( x , y , t ) = I ( x + u , y + v , t + 1 ) I_{\text{warped}}(x, y, t) = I(x+u, y+v, t+1) Iwarped(x,y,t)=I(x+u,y+v,t+1)
  • 意义:评估光流对帧间亮度变化的还原能力(IE 越小越一致)。

(九)光流真值获取(Ground-Truth Acquisition)

  1. 合成数据集(Synthetic Datasets)

    • 方法:通过计算机图形学生成虚拟场景,精确控制相机和物体运动,直接计算光流真值。
    • 典型数据集
      • Flying Chairs:合成椅子在不同背景中的运动,包含22,872对训练图像,光流真值通过三维模型投影计算。
      • Middlebury:早期经典数据集,包含静态场景中物体的平移、旋转、缩放运动,真值通过立体匹配和三维重建生成。
  2. 物理实验获取

    • 设备:使用高精度运动平台(如六自由度机械臂)固定相机或物体,记录连续帧并通过激光测距仪或结构光获取深度信息,结合三维运动参数计算真实光流。
    • 优势:真值精度高,可模拟真实场景中的光照变化和遮挡,用于验证算法的鲁棒性。

(十)基于深度学习的光流估计

  1. 传统方法的局限性

    • 依赖手工设计的特征(如梯度、二阶矩矩阵),对复杂场景(如非刚性运动、大位移、低纹理)鲁棒性不足。
    • 优化过程计算量大,难以满足实时性需求(如自动驾驶需要100+ FPS)。
  2. FlowNet系列(2015-2017)

    • FlowNet(ICCV 2015)

      • 结构:首个端到端卷积神经网络,采用U-Net架构,包含收缩路径(Conv1-Conv5)和解码路径(Deconv1-Deconv5),通过跳跃连接融合多尺度特征。
      • 创新点:引入匹配代价体(Cost Volume),计算参考帧与目标帧在不同位移下的特征相似性。例如,FlowNetS架构中,对每个像素点,在±4像素范围内计算17x17的代价体,通过3D卷积提取匹配特征。
      • 训练:使用合成数据集Flying Chairs,损失函数为端点误差(EE)的均值,开启深度学习在光流领域的先河。
    • FlowNet2.0(CVPR 2017)

      • 改进:提出级联网络(Cascade Network),将FlowNet与另一个细化网络结合,先估计粗光流,再通过扭曲操作细化,提升大位移场景的精度;引入循环一致性损失(Cycle Consistency Loss),确保前向光流与后向光流的一致性。
  3. PWC-Net(CVPR 2018)

    • 核心设计
      • 金字塔特征提取:构建图像金字塔,从低分辨率层(粗尺度)到高分辨率层(细尺度)逐步估计光流,适应大幅运动。
      • 可变形扭曲(Deformable Warping):使用可变形卷积对目标帧特征进行扭曲,增强非刚性运动的适应性。
      • 代价体与3D卷积:在每个金字塔层计算局部代价体(Local Cost Volume),通过3D卷积高效提取匹配特征,降低计算复杂度。
    • 性能:在Middlebury数据集上首次超越传统方法,且推理速度达到25 FPS(GTX 1080),兼顾精度与实时性。
  4. 无监督光流学习(Unsupervised Learning)

    • 核心思想:无需光流真值,仅利用单目视频训练,通过光度损失和几何约束优化网络。
    • 损失函数设计
      • 光度重建损失(Photometric Reconstruction Loss)
        L photo = ∑ t ∑ x , y ∣ I t ( x , y ) − I t + 1 ( x + u , y + v ) ∣ L_{\text{photo}} = \sum_{t} \sum_{x, y} \left| I_t(x, y) - I_{t+1}(x+u, y+v) \right| Lphoto=tx,yIt(x,y)It+1(x+u,y+v)
        强制估计光流扭曲后的图像与原图像一致。
      • 平滑损失(Smoothness Loss)
        L smooth = ∑ x , y ( ∣ ∇ u ∣ + ∣ ∇ v ∣ ) ⋅ e − ∣ ∇ I ∣ L_{\text{smooth}} = \sum_{x, y} \left( |\nabla u| + |\nabla v| \right) \cdot e^{-|\nabla I|} Lsmooth=x,y(∣∇u+∣∇v)e∣∇I
        利用图像梯度加权,避免边缘区域的过度平滑。
    • 代表方法
      • UnFlow(ECCV 2016):提出双向光流一致性约束,即前向光流与后向光流的复合应等于恒等变换,提升无监督训练的稳定性。
      • GeoNet(CVPR 2018):结合几何先验(如平面扫描),通过生成对抗网络(GAN)优化光流估计,适应无纹理场景。
  5. 当前挑战与前沿方向

    • 挑战:复杂光照变化(如夜间运动)、透明/反射物体(如玻璃、水面)、多运动目标(如拥挤场景)的光流估计。
    • 前沿
      • 自监督学习与对比学习:利用大量无标注视频数据,通过对比损失学习通用光流特征。
      • 多模态融合:结合RGB、深度、惯性传感器数据,提升光流估计的鲁棒性。
      • 轻量化模型:设计高效网络架构(如MobileFlow),满足移动端实时应用需求。

总结与未来展望

光流估计作为计算机视觉的基础任务,从早期基于梯度的LK方法到当前的深度学习模型,经历了从手工特征到数据驱动的范式转变。传统方法依赖严格假设,在理想场景下高效准确,但对复杂环境鲁棒性不足;深度学习方法通过端到端训练,显著提升了复杂场景的性能,但仍面临数据依赖强、物理解释性弱等问题。未来研究需在以下方向突破:

  1. 无监督与自监督学习:减少对合成数据的依赖,利用真实世界视频提升泛化能力。
  2. 多尺度与多任务融合:结合语义分割、目标跟踪等任务,构建统一的运动理解框架。
  3. 实时性与轻量化:设计高效网络结构,推动光流算法在移动设备和嵌入式系统中的应用。
  4. 物理可解释性:将光流估计与三维重建、动力学模型结合,赋予算法更强的场景理解能力。

通过持续创新,光流估计将在自动驾驶、视频分析、机器人视觉等领域发挥更关键的作用,成为连接二维图像与三维世界的桥梁。

相关文章:

计算机视觉5——运动估计和光流估计

一、运动估计 &#xff08;一&#xff09;运动场&#xff08;Motion Field&#xff09; 定义与物理意义 运动场是三维场景中物体或相机运动在二维图像平面上的投影&#xff0c;表现为图像中每个像素点的运动速度矢量。其本质是场景点三维运动&#xff08;平移、旋转、缩放等&a…...

8. RabbitMQ 消息队列 + 结合配合 Spring Boot 框架实现 “发布确认” 的功能

8. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能 文章目录 8. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能1. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能1.1 回退消息 2.备用交换机3. API说…...

铰链损失函数 Hinge Loss和Keras 实现

一、说明 在为了了解 Keras 深度学习框架的来龙去脉&#xff0c;本文介绍铰链损失函数&#xff0c;然后使用 Keras 实现它们以进行练习并了解它们的行为方式。在这篇博客中&#xff0c;您将首先找到两个损失函数的简要介绍&#xff0c;以确保您在我们继续实现它们之前直观地理解…...

【Tips】Cloudflare用户与网站之间的中介

Cloudflare是一家提供多种网络服务的公司&#xff0c;旨在帮助网站和应用程序提高性能、安全性和可靠性。它为全球网站、应用程序和网络提供一系列网络安全、性能优化和可靠性服务。Cloudflare 的核心使命是让互联网更加安全、快速和可靠。 以下是其主要服务介绍&#xff1a;…...

PDF 转图片,一行代码搞定!批量支持已上线!

大家好&#xff0c;我是程序员晚枫。今天我要给大家带来一个超实用的功能——popdf 现在支持 PDF 转图片了&#xff0c;而且还能批量操作&#xff01;是不是很激动&#xff1f;别急&#xff0c;我来手把手教你玩转这个功能。 1. 一行代码搞定单文件转换 popdf 的核心就是简单暴…...

可以使用费曼学习法阅读重要的书籍

书本上画了很多线&#xff0c;回头看等于没画出任何重点。 不是所有的触动都是有效的。就像你曾经看过很多好文章&#xff0c;当时被触动得一塌糊涂&#xff0c;还把它们放进了收藏夹&#xff0c;但一段时间之后&#xff0c;你就再也记不起来了。如果让你在一本书上画出令自己…...

基于Flask的笔记本电脑数据可视化分析系统

【Flask】基于Flask的笔记本电脑数据可视化分析系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python语言进行编写&#xff0c;以Flask为后端框架&#xff0c;利用Echarts实现数…...

JavaScript基础--17-数组的常见方法

数组的方法清单 数组的类型相关 方法描述备注Array.isArray()判断是否为数组toString()将数组转换为字符串Array.from(arrayLike)将伪数组转化为真数组Array.of(value1, value2, value3)创建数组&#xff1a;将一系列值转换成数组 注意&#xff0c;获取数组的长度是用length…...

TDengine 从入门到精通(2万字长文)

第一章&#xff1a;走进 TDengine 的世界 TDengine 是个啥&#xff1f; 如果你首次接触 TDengine&#xff0c;心里可能满是疑惑&#xff1a;这究竟是个什么东西&#xff0c;能派上什么用场&#xff1f;简单来讲&#xff0c;TDengine 是一款开源、高性能且云原生的时序数据库&…...

ctfshow VIP题目限免(前10题)

目录 源码泄露 前台JS绕过 协议头信息泄露 robots后台泄露 phps源码泄露 源码压缩包泄露 版本控制泄露源码 版本控制泄露源码2 vim临时文件泄露 cookie泄露 源码泄露 根据题目提示是源代码泄露&#xff0c;右键查看页面源代码发现了 flag 前台JS绕过 发现右键无法使用了&…...

PyTorch中的各种损失函数的详细解析与通俗理解!

目录 1. 前言 2. 回归任务中的损失函数 2.1 L1损失&#xff08;Mean Absolute Error, MAE&#xff09; 2.2 平方损失&#xff08;Mean Squared Error, MSE&#xff09; 2.3 平滑L1损失&#xff08;Smooth L1 Loss&#xff09; 3. 分类任务中的损失函数 3.1 交叉熵损失&a…...

leetcode53-最大子数组和

leetcode 53 思路 本题使用贪心算法&#xff0c;核心在于对每一个元素进行遍历&#xff0c;在遍历过程里&#xff0c;持续更新当前的子数组和以及最大子数组和 假设 sum 是当前的子数组和&#xff0c;max 是到目前为止最大的子数组和遍历数组时&#xff0c;计算每个位置的当…...

解决Long类型前端精度丢失和正常传回后端问题

在 Java 后端开发中&#xff0c;可能会遇到前后端交互过程中 Long 类型精度丢失的问题。尤其是在 JavaScript 中&#xff0c;由于其 Number 类型是双精度浮点数&#xff0c;超过 16 位的 Long 类型值就会发生精度丢失。 问题背景 假设有如下实体类&#xff1a; public class…...

Green Coding规范:从循环语句到数据库查询的节能写法

本文系统化阐述绿色编码的工程实践方案&#xff0c;通过重构循环控制结构、优化集合操作范式、改进数据库访问模式三大技术路径&#xff0c;实现典型业务系统降低28.6%的CPU指令周期消耗。基于对JVM和SQL解释器的指令级分析&#xff0c;提出循环展开的黄金分割法则、位图索引加…...

Spring Boot整合Elasticsearch

摘要&#xff1a;本文手把手教你如何在Spring Boot项目中整合Elasticsearch&#xff08;ES&#xff09;&#xff0c;并实现基本的CRUD与搜索操作。包含版本选择、配置、代码示例及常见问题解决。 一、环境准备 1.1 软件版本 Spring Boot: 3.xElasticsearch: 8.x&#xff08;推…...

2025年渗透测试面试题总结- 某四字大厂面试复盘扩展 一面(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 某四字大厂面试复盘扩展 一面 一、Java内存马原理与查杀 二、冰蝎与哥斯拉原理对比&#xff08;技术演…...

java基础自用笔记:文件、递归、常见的字符集、IO流

文件 递归 递归文件夹寻找某个文件&#xff0c;要先判断是否有权限进入文件夹&#xff08;若无权限返回null&#xff09;然后再判断文件数量是否不为0 常见的字符集 IO流 字节流 文件字节输入流 当读取到最后一个字节的时候&#xff0c;装在buffer[0]中&#xff0c;如果后面没…...

关于计算机网络的一些疑问

目录 1. HTTP/1.x 中的“队头阻塞”&#xff08;Head-of-Line Blocking&#xff09;问题解释什么是队头阻塞&#xff1f;其他相关概念&#xff1a; 2. HPACK 算法是什么&#xff1f;HPACK 的作用&#xff1a;HPACK 的特点&#xff1a;HPACK 提升性能的原因&#xff1a; 3. 如何…...

超大规模数据场景(思路)——面试高频算法题目

目录 用4KB内存寻找重复元素 从40个亿中产生不存在的整数【位】 如果只让用10MB空间存储&#xff1f; 初次遍历 二次遍历 用2GB内存在20亿个整数中查找出现次数最多的数【分块】 从亿万个URL中查找问题【分块 堆】 40亿个非负整数中找出现两次的数【位 不过多个位哈】 …...

高级:性能优化面试题深度剖析

一、引言 在Java应用开发中&#xff0c;性能优化是确保系统高效运行的关键。面试官通过相关问题&#xff0c;考察候选人对性能优化的理解和实践经验。本文将深入探讨Java应用性能优化的方法&#xff0c;包括JVM调优、数据库优化等&#xff0c;结合实际开发场景&#xff0c;帮助…...

【软件】在 macOS 上安装和配置 Apache HTTP 服务器

在 macOS 上安装 Apache HTTP 服务器的步骤&#xff1a; 1.安装 Apache HTTP 服务器 macOS 系统可能已经预装了 Apache HTTP 服务器。你可以通过终端检查它是否已经安装&#xff1a; httpd -v如果系统提示command not found&#xff0c;说明 Apache 未安装。你可以通过 Home…...

数据结构之链表

定义&#xff1a;在计算机科学中&#xff0c;链表是数据元素的线性集合&#xff0c;其每个元素都指向下一个元素&#xff0c;元素存储上并不连续。 链表分类&#xff1a;单向链表&#xff08;每个元素知道下一个元素是谁&#xff09;、双向链表&#xff08;每个元素知道其上一…...

基于Python的懂车帝汽车数据爬虫分析与可视化系统

【Python】基于Python的懂车帝汽车数据爬虫分析与可视化系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 &#x1f697;&#x1f525;【视频简介】&#x1f525;&#x1f697; 大家好&…...

setInterval问题以及前端如何实现精确的倒计时

一、为什么setInterval不能实现 原因有两&#xff1a;1、js是单线程&#xff0c;基于事件循环执行其他任务&#xff08;这里建议读者可以多去了解一下浏览器线程与事件循环相关知识&#xff09; 2、setinterval是每隔delay时间&#xff0c;把逻辑放到任务队列中&#xff0c;而…...

Python爬虫教程010:使用scrapy爬取当当网数据并保存

文章目录 3.6 爬取当当网数据3.6.1 创建项目3.6.2 查找要爬取的数据对象3.6.3 保存数据3.6 爬取当当网数据 3.6.1 创建项目 【1、创建项目】: scrapy startproject scrapy_dangdang_095【2、创建爬虫文件】 cd scrapy_dangdang_095\scrapy_dangdang_095\spiders scrapy ge…...

达芬奇预设:复古16mm胶片质感老式电影放映机转场过渡+音效

达芬奇预设&#xff1a;复古16mm胶片质感老式电影放映机转场过渡音效 特征&#xff1a; DaVinci Resolve 宏 8 过渡 幻灯片投影仪效果 可在任何帧速率和分辨率下工作 教程包括 系统要求&#xff1a; 达芬奇 Resolve 18.0...

Spring MVC 的请求处理流程是怎样的?

Spring MVC 请求处理流程的大致可分为以下几个步骤&#xff1a; 1. 请求到达 DispatcherServlet: 所有请求首先到达 DispatcherServlet&#xff08;前端控制器&#xff09;。DispatcherServlet 是 Spring MVC 的核心&#xff0c;它负责接收请求&#xff0c;并将请求委派给其他…...

PyTorch 实现图像版多头注意力(Multi-Head Attention)和自注意力(Self-Attention)

本文提供一个适用于图像输入的多头注意力机制&#xff08;Multi-Head Attention&#xff09;PyTorch 实现&#xff0c;适用于 ViT、MAE 等视觉 Transformer 中的注意力计算。 模块说明 输入支持图像格式 (B, C, H, W)内部转换为序列 (B, N, C)&#xff0c;其中 N H * W多头注…...

STM32单片机入门学习——第17节: [6-5] TIM输入捕获

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.06 STM32开发板学习——第17节: [6-5] TIM输入捕获 前言开发板说明引用解答和科普一…...

P8819 [CSP-S 2022] 星战 Solution

Preface 不可以&#xff0c;总司令 的来源. Description 给定一张 n n n 点 m m m 边的有向图 G G G&#xff0c;有 q q q 次操作分四种&#xff1a; 1 u v&#xff1a;使边 u → v u\to v u→v 失活.2 u&#xff1a;使点 u u u 的所有入边失活.3 u v&#xff1a;使边…...

【spring02】Spring 管理 Bean-IOC,基于 XML 配置 bean

文章目录 &#x1f30d;一. bean 创建顺序&#x1f30d;二. bean 对象的单例和多例❄️1. 机制❄️2. 使用细节 &#x1f30d;三. bean 的生命周期&#x1f30d;四. 配置 bean 的后置处理器 【这个比较难】&#x1f30d;五. 通过属性文件给 bean 注入值&#x1f30d;六. 基于 X…...

Llama 4架构解析与本地部署指南:MoE模型在170亿参数下的效率突破

Meta最新发布的Llama 4系列标志着开源大语言模型(LLM)的重大演进,其采用的混合专家(MoE)架构尤为引人注目。 两大核心模型——Llama 4 Scout(170亿参数含16专家)和Llama 4 Maverick(170亿参数含128专家)——展现了Meta向高效能AI模型的战略转型,这些模型在挑战传统扩…...

`docker run --restart no,always,on-failure,unless-stopped`笔记250406

docker run --restart no,always,on-failure,unless-stopped 笔记250406 docker run --restart 用于配置容器的自动重启策略&#xff0c;当容器意外退出时&#xff0c;Docker 会根据策略自动重新启动容器。这是确保服务高可用的重要参数。 语法 docker run --restart <策略…...

stl的VS的string的内部实现,引用计数的写实拷贝,编码

本章目标 1.stl的vs的string的内部实现 2.引用计数的写实拷贝 3.编码 1.stl的string的内部实现 我们先来看一个例子 string s1; cout<<sizeof(s1)<<endl;我们知道类的内存管理也是遵循内存对齐的规则的. 我们假设当前机器的环境是32位的.string类的内部有三个成…...

Docker 从入门到进阶 (Win 环境) + Docker 常用命令

目录 引言 一、准备工作 1.1 系统要求 1.2 启用虚拟化 二、安装Docker 2.1 安装WSL 2 2.2 安装Docker Desktop 2.3检查是否安装成功 三、配置Docker 3.1 打开Docker配置中心 四、下载和管理Docker镜像 4.1 拉取镜像 4.2 查看已下载的镜像 4.3 运行容器 4.4 查看正…...

C# Winform 入门(12)之制作简单的倒计时

倒计时效果展示 控件展示 以下均是使用label来形成的 label 的 BorderStyle&#xff1a;Fixed3D ForeColor&#xff1a;Red Blackground&#xff1a;Black label 的属性 Name&#xff1a; txtyear txtmonth txtday txttime txtweek txtDays txtHour txtM…...

基于springboot+vue的漫画天堂网

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

leetcode每日一题:最大整除子集

题目 368. 最大整除子集 给你一个由 无重复 正整数组成的集合 nums &#xff0c;请你找出并返回其中最大的整除子集 answer &#xff0c;子集中每一元素对 (answer[i], answer[j]) 都应当满足&#xff1a; answer[i] % answer[j] 0 &#xff0c;或 answer[j] % answer[i] …...

【Unity】animator检测某state动画播放完毕方法

博主对动画系统很不熟&#xff0c;可能使用的方法比较曲折&#xff0c;但是我确实没找到更有效的方法了。 unity的这个animator在我看来简直有毛病啊&#xff0c;为什么那么难以获取某状态动画的信息呢&#xff1f;&#xff1f;&#xff1f; 想要知道动画播完没有只有用norma…...

玄机-应急响应-webshell查杀

题目要求&#xff1a; 要求获取四个flag webshell查杀&#xff1a; 常见的webshell&#xff1a; PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode() ASP: Execute(), Eval(), CreateObject() JSP: Runtime.getRuntime().exec() websh…...

小菜Go:Ubuntu下Go语言开发环境搭建

前置要求Ubuntu环境搭建 文章推荐 此处推荐一个比较好的文章&#xff0c;基本按部就班就欧克~ 安装虚拟机&#xff08;VMware&#xff09;保姆级教程&#xff08;附安装包&#xff09;_vmware虚拟机-CSDN博客 安装可能遇到的问题 虚拟机安装遇到的问题如&#xff1a;Exception…...

多功能指示牌是否支持多语言交互?

嘿&#xff0c;朋友们&#xff01;你们知道吗&#xff1f;叁仟多功能指示牌在多语言交互方面可太厉害了&#xff0c;下面就为大家热情介绍一些常见的实现方式和相关说明哦&#xff01; 显示多语言文字&#xff1a;哇哦&#xff0c;在众多国际化的超棒场所&#xff0c;像那充满…...

2025ArkTS语言开发入门之前言

2025ArkTS语言开发入门之前言&#xff08;一&#xff09; 引言 要想学好一门语言&#xff0c;必先会下载对应的编辑器/集成开发环境&#xff0c;ArkTS也是如此&#xff0c;下面我带着大家去下载并安装ArkTS语言的集成开发环境——Dev Eco Studio。 下载 来到华为开发者联盟…...

Python高级爬虫+安卓逆向1.1-搭建Python开发环境

目录 引言&#xff1a; 1.1.1 为什么要安装Python? 1.1.2 下载Python解释器 1.1.3 安装Python解释器 1.1.4 测试是否安装成功 1.1.5 跟大神学高级爬虫安卓逆向 引言&#xff1a; 大神薯条老师的高级爬虫安卓逆向教程&#xff1a; 这套爬虫教程会系统讲解爬虫的初级&…...

深入理解MySQL:核心特性、优化与实践指南

MySQL是一个开源的关系型数据库管理系统(RDBMS)&#xff0c;由瑞典MySQL AB公司开发&#xff0c;目前属于Oracle公司。它是目前世界上最流行的开源数据库之一&#xff0c;广泛应用于各种规模的Web应用和企业系统中。 目录 一、核心特点 关系型数据库&#xff1a; 开源免费&am…...

38常用控件_QWidget的enable属性(2)

实现用另一个按钮切换之前按钮的“可用”状态 在同一个界面中,要求不同的控件的 objectName 也是必须不同的.(不能重复&#xff09; 后续就可以通过 ui->objectName 方式来获取到对应的控件对象了 ui->pushButton // 得到了第一个按钮对应的对象 ui->pushButton 2 //…...

如何单独指定 Android SDK tools 的 monitor.bat 使用特定 JDK 版本

核心概念与背景介绍 在 Android 开发过程中&#xff0c;Android SDK Tools 提供了许多实用工具&#xff0c;其中 monitor.bat 是 Windows 下用于启动 Android Device Monitor 的批处理文件。Device Monitor 可以帮助我们查看日志、内存、线程等运行信息。 JDK 与 monitor.bat …...

【代码随想录 字符串1】 344.反转字符串

自己的 class Solution {public void reverseString(char[] s) {int mid s.length /2;int j1;for (int i 0; i < mid; i) {char tem s[i];s[i] s[s.length -j];s[s.length -j] tem;j;}s.toString();} }双指针 class Solution {public void reverseString(char[] s) {…...

gogs私服对应SSH 协议配置

一、使用非特权端口&#xff08;推荐&#xff09; 1. 修改 Gogs 配置文件 sudo nano /home/git/gogs/custom/conf/app.ini 找到 [server] 部分&#xff0c;修改为&#xff1a; [server] START_SSH_SERVER true SSH_PORT 2222 # 改为1024以上的端口 2. 重启 Gogs sud…...

蓝桥与力扣刷题(74 搜索二维矩阵)

题目&#xff1a;给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff…...