光流运动估计及FlowNet实战
点击下方卡片,关注“新机器视觉”公众号
重磅干货,第一时间送达
作者 | 李钢蛋de茶馆 编辑 | 汽车人
原文链接:https://zhuanlan.zhihu.com/p/523930853
1什么是光流?
光流是物体在连续的序列帧之间的运动,由物体和相机之间的相对运动引起。而我们如果接触过运动场(物体在三维空间的运动,运动场就是图像所有点的运动矢量组成,其中每一个运动点都是一个三维矢量),就可以把光流理解成一种二维损失速度场,其中的二维速度矢量是景物中可见的三维速度矢量在二维成像平面的投影。由定义上来看,光流不光包含了被观察物体的运动信息,还包含了有关其分割结构的信息。因为相同整体倾向于保持相同的运动趋势。
运动场与光流场的关系:
运动场只是理想的构造,用来表示二维与三维之间的一种运动关系。但实际上,我们只能基于对图像数据的测量来近似实际的真实运动场,因为不可能达到真正理想的情况。 在大多数情况下,摄像头中的每个图像点都有一个单独的运动,因此一般通过对图像数据的临域操作来局部测量(系数光流法)。一定会存在无法为某些特定类型的临域所确定的正确的运动场,它们通常被称为光流的近似值。
2光流数学表示?
在连续帧之间,我们可以将图像强度 I 表示为空间 (x,y) 和时间 t 的函数。换句话说,如果我们获取第一张图像 I(x,y,t) 并将其像素在 t 时间内移动 (dx,dy),我们将获得新图像 I(x+dx,y+dy,t+dt )。
首先,我们给定几个假定:
运动物体的亮度在很短的时间间隔内保持不变; 给定临域内的速度向量场变化是缓慢的; 保持空间一致性,及时统一子图像的像素点具有相同的运动;
之后使用泰勒展开式。
我们优化的目的是为了前后两张图尽可能相似,那么我们假设其经过扭转之后完全一致,那么就可以得到光流方程。
3光流:FlowNet预测运动
光流是预测两个图像之间运动的任务,通常是视频的两个连续帧。光流模型通常以两张图像作为输入,并预测一个“流”:流表示第一张图像中每个像素的位移,并将其映射到第二张图像中其对应的像素。光流是 (2, H, W) 维张量,其中第一个维度对应于预测光流的水平和垂直位移。
Dann Los Geht's!
%tensorflow_version 1.x
!pip3 install --quiet ml4a
首先我们加载两张图片,它们恰好是电影的连续帧。
from ml4a import image
# ml4a comes with these two sample images to demonstrate optical low
img1 = image.load_sample_image('teddybear_frame1.png')
img2 = image.load_sample_image('teddybear_frame2.png')
image.display([img1, img2])
#加载模型
from ml4a.models import flownet
# get flow from img1 to img2
flow = flownet.run(img1, img2)
# blurring the flow reduces any high-frequency noise in the raw flowmap
flow = flownet.blur(flow, blur_times=10)
可视化光流:
rgb_flow = flownet.run(img1, img2, to_rgb=True)
image.display(rgb_flow)
下面我们使用第一张图和获取的光流来预测第二张图,
from ml4a.canvas import canvas
mapping_1to2 = flownet.flow_to_mapping(-flow)
mapping_2to1 = flownet.flow_to_mapping(flow)
img2_reconstructed = canvas.map_image(img1, mapping_1to2)
img1_reconstructed = canvas.map_image(img2, mapping_2to1)
image.display(img2, title="image 2")
image.display(img2_reconstructed, title="image 2 reconstructed from image 1 + flow")
image.display(img1, title="image 1")
image.display(img1_reconstructed, title="image 1 reconstructed from image 2 + flow")
其中得到的mapping_1to2,正如前文提到的,是一个(360, 420, 2)的张量,就代表着每个像素的x,y的矢量位移。
本文仅做学术分享,如有侵权,请联系删文。