【视频检测】FlowNet: Learning Optical Flow with Convolutional Networks

文章来源:https://arxiv.org/pdf/1504.06852.pdf

Network Architecture

作者从两个思路来设计网络,一种是更为通用的(这个网络用于其他领域比如语义分割也行),将两张图像拼接到一起(concate)作为输入,经由单个网络输出,名为FlowNetSimple;另一种能体现出计算Optical Flow 的特点(即计算两张图像的变化),作两路输入提取到两路特征图,之后再做进一步的操作,名为FlowNetCorr。
【视频检测】FlowNet: Learning Optical Flow with Convolutional Networks

FlowNetCorr

这部分引用 https://blog.csdn.net/Jason_mmt/article/details/82789163的解释

得到两张特征图后要比较二者之间的联系。定义了correlation layer.
两个特征图分别为f1,f2: w * h * c, 然后correlation层比较这两个特征图各个块。比如以x1为中心的一块和以x2为中心的一块,它们之间的联系用以下公式计算,
【视频检测】FlowNet: Learning Optical Flow with Convolutional Networks
其中块长为K:= 2k+1,块的大小为 K*K。x为向量。
该公式和卷积的操作是一样的,以x1为中心的patch和以x2为中心的patch,对应位置相乘然后相加,这就是卷积核在图片上的操作啊,只是卷积网络里是和filter之间进行卷积,且它的weight是不需训练或不可训练。计算这两块之间的联系计算复杂度是 c * K * K,而f1上每个块都要与f2上所有块计算联系,f1上有w * h个块(每个像素点都可以做一个块的中心点),f2上也有w * h个块,所有整个计算复杂度是c * K * K * ( w * h) * ( w * h),这里是假设每个块在下一张图上时,可以移动任何位置。但是这样计算复杂度太高了,所以我们可以约束位移范围为d(上下左右移动d),就是每个块只和它附近D: 2d+1的位置块计算联系,而且以x1为中心的块去和它附近D范围计算联系时,还可以加上步长,就是不必和D范围的每个点都进行计算,可以跳着。
我们先假设没有步长,这样每次和D范围内一个点计算联系就得到一个 w * h * 1的 特征图,然后和D内的所有点即D * D个点,得到 w * h * D^2个特征图
之后是放大部分。
【视频检测】FlowNet: Learning Optical Flow with Convolutional Networks
这里的放大和fcn十分类似,一边向后unconv,一边直接在小的特征图上预测,然后把结果双线性插值然后concat在unconv后的特征图上,然后接着往后传,重复四次后,得到的预测光流分辨率依然是输入的1/4,再重复之前的操作已没有太多提升,所以可以直接双线性插值得到和输入相同分辨率的光流预测图。

  • 比较早的东西了,感觉没有深究的必要,重点应放在后面的几个版本。