【论文系列】光流/ LK光流/ FlowNet/ FlowNet2

今天重点介绍光流首先介绍光流的idea inspiration,传统光流的估计方法,再介绍用CNN解决光流的思路--FlowNet以及FlowNet2(个人认为只是利用stack方式堆叠FlowNetS和FlowNetC,其中更出彩的可能在数据集与更适应的数据训练方法,当然,精度和速度的效果也更为出色,解决了小displacement的估计)。Let's START!光流第一次读光流的...
摘要由CSDN通过智能技术生成

今天重点介绍光流

首先介绍光流的idea inspiration,传统光流的估计方法,再介绍用CNN解决光流的思路--FlowNet以及FlowNet2(个人认为只是利用stack方式堆叠FlowNetS和FlowNetC,其中更出彩的可能在数据集与更适应的数据训练方法,当然,精度和速度的效果也更为出色,解决了小displacement的估计)。Let's START!



光流

第一次读光流的文章是很久以前,当时有个印象很深的例子,就是当你坐火车的时候往窗外开,原本固定的刚体的物体,由于相对参考系的运动,仿佛变成了一条条川流的线,如同光在流动。而且,不同距离的物体,例如近处的相邻铁轨,远处的天和云,不远处的房屋,其运动的速度不是完全一样的,也就是说,我们可以通过不同的视觉感觉速度,而判断这个物体的远近。

光流(optical flow)最早在1940s由Gibson的The Perception of the Visual World.提出的,其定义是,由物体/相机的运动引起的在连续帧之间的视在运动模式。它是一个矢量2D场,每个矢量是一个位移矢量,代表点从第一帧到第二帧的运动。

  • 光流需要满足的条件假设

  1. 物体的像素强度在连续帧之间不会改变

  2. 相邻像素间有相似的运动

---------------------------------------------------

推导:

考虑在第一帧的像素点I(x,y,t)\left ( dx,dy \right )为在下一帧中的运动的位移,所以该点经过运动后在第二帧为I \left ( x+dx,y+dy,t+dt \right )。考虑到假设条件一,“物体的像素强度在连续帧之间不会改变”,有:

                                                      I\left ( x ,y ,t \right )= I\left ( x+dx,y+dy,t+dt \right )

将,I\left ( x+dx,y+dy,t+dt \right )泰勒展开:

I\left ( x+dx,y+dy,t+dt \right ) = I\left ( x ,y ,t \right ) +\frac{\partial I}{\partial x}*dx+\frac{\partial I}{\partial y}*dy+\frac{\partial I}{\partial t}*dt+H.O.T.

故有:

\frac{\partial I}{\partial x}*dx+\frac{\partial I}{\partial y}*dy+\frac{\partial I}{\partial t}*dt = 0 \ \overset{\div dt} {\rightarrow}\ \ \frac{\partial I}{\partial x}*\frac{ dx}{ dt}+\frac{\partial I}{\partial y}*\frac{dy}{ dt}+\frac{\partial I}{\partial t} = 0

其中\frac{ dx}{ dt},\ \frac{dy}{ dt},各代表其在x y方向的运动速度,可以看成 u,v。u= \frac{ dx}{ dt},\ v= \frac{dy}{ dt}

这样 我们就得到了光流方程

                                            f_{x}u+f_{y}v+f_{t}=0\ \ \ \leftarrow (f_{x}=\frac{\partial I}{\partial x}\, \ f_{y}=\frac{\partial I}{\partial y}\ \ f_{t}=\frac{\partial I}{\partial t})

在这个光流方程中f_{x},\, f_{y}代表的是图像在(x ,y,t )这一点的梯度,f_{t}是两帧图像块之间差值,均为已知。我们需要求解的u,v,那么如何求解呢?这里引入L-K光流法和L-K金字塔光流法。


L-K光流法

-------------------------------------------

  • 稀疏光流法: L-K光流

利用L-K法解决光流,充分利用了光流的第二个假设条件,即,相邻像素间有相似的运动。需要注意的是,L-K光流法解决的是小位移情况,所以后文将会介绍L-K金字塔光流法来搞定大位移的光流问题。

由光流方程我们可知,现需求解两个未知数u&v。

L-K方法是找一个3*3的patch,利用相邻像素间有相似的运动,所以假定这九个点都有相同的位移。这样我们就可以得到方程组:

\left\{\begin{matrix}f_{x1}u+f_{y1}v+f_{t1}=0 \\ f_{x2}u+f_{y2}v+f_{t2}=0 \\.... \\f_{x9}u+f_{y9}v+f_{t9}=0 \end{matrix}\right. \ \ \rightarrow \begin{bmatrix} f_{x1}&f_{y1} \\ f_{x2}&f_{y2} \\ ... \\ f_{x9}& f_{y9} \end{bmatrix} \cdot \begin{bmatrix} u\\ v \end{bmatrix} =- \begin{bmatrix} f_{t1}\\ f_{t2} \\ ... \\ f_{t9} \end{bmatrix}
九个方程解两个未知数,超定,可以用最小二乘法来得出近似解。A\cdot \overrightarrow{x} =\overrightarrow{b}

\overrightarrow{x}= (A^{T}A)^{-1}A^{T}(-\overrightarrow{b}) \rightarrow \begin{bmatrix} u\\v \end{bmatrix} = \begin{bmatrix} \sum f_{xi}^{2} &\sum f_{xi}f_{yi} \\ \sum f_{xi}f_{yi}& \sum f_{yi}^{2} \end{bmatrix}^{-1} \begin{bmatrix} -\sum f_{xi} f_{ti} \\ -\sum f_{yi} f_{ti} \end{bmatrix}

由此,我们解得x,但是观察

\left ( A^{T} A\right )= \begin{bmatrix} \sum f_{xi}^{2} &\sum f_{xi}f_{yi} \\ \sum f_{xi}f_{yi}& \sum f_{yi}^{2} \end{bmatrix},并不一定总是可逆的!(充要条件\pmb{ \left | G \right | \neq 0\Leftrightarrow G \ is \ invertible }

在图像中沿着两个方向都有像素变化的区域(角点,这个式子也很像harris corner的响应式),一般对应的\left ( A^{t} A\right )是可逆的,但是对于在灰度变化很小的区域,一般\left ( A^{t} A\right )是不可逆的。这限制了LK光流法的适用范围,所以我们称之为稀疏光流法(并不是所有光流都能被计算出来)

在光流跟踪中,由于可逆的充要条件\pmb{ \left | G \right | \neq 0\Leftrightarrow G \ is \ invertible },也就是要求,矩阵G的最小特征值要足够大,满足这个要求的像素点才易于光流跟踪。)

-------------------------------------------

  • 稠密光流法:迭代求解L-K光流

这里对上面的证明,再重新梳理一遍,并用迭代的方式求解光流d;连续帧I_{1},I_{2},对于I_{1}中的像素点

  • 14
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
要将FlowNet光流信号加入BiSeNetV2语义分割模型代码中,需要进行以下步骤: 1. 安装FlowNet库:首先,需要安装FlowNet库。FlowNet是一个用于计算光流的深度学习库,可以在Python中使用。FlowNet库的安装可以通过pip命令进行安装:`pip install flownet2-pytorch`。安装完成后,可以在代码中引入FlowNet库。 2. 计算光流:在代码中计算光流。可以使用FlowNet库提供的函数来计算光流,例如:`flow = flownet2(image1, image2)`,其中`image1`和`image2`是两个连续帧的图像。 3. 将光流信号加入模型:将计算得到的光流信号加入到BiSeNetV2模型中。可以将光流信号作为额外的输入通道加入到模型中,例如:`inputs = torch.cat([image, flow], dim=1)`,其中`image`是输入的图像,`flow`是计算得到的光流信号。 4. 调整模型结构:根据加入的光流信号,需要调整模型的输入通道数和输出通道数。例如,如果将光流信号作为额外的输入通道,则需要将模型的输入通道数增加1,例如:`self.conv1 = ConvBNReLU(4, 64, kernel_size=3, stride=2, padding=1)`。同时,需要调整模型的输出通道数,以保证模型的输出通道数与任务的类别数相同。例如:`self.conv8 = nn.Conv2d(128, num_classes, kernel_size=1, stride=1)`。 5. 训练模型:最后,使用加入了光流信号的模型进行训练。训练过程与原始的BiSeNetV2模型类似,但需要增加光流信号的输入。在训练过程中,可以根据需要对光流信号的权重进行调整,以提高模型的性能。 综上所述,将光流信号加入BiSeNetV2语义分割模型代码中需要进行多个步骤,包括安装FlowNet库、计算光流、将光流信号加入模型、调整模型结构和训练模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值