Dosovitskiy等人的Pytorch实施Fownet。
该存储库是Alexey Dosovitskiy等人的Flownet的火炬实施。在Pytorch。在此处查看火炬实施
该代码主要来自官方Imagenet示例。它尚未对多个GPU进行测试,但是它应该像原始代码一样工作。
该代码使用飞行椅数据集提供了一个培训示例,并提供了数据增强。将来可能会添加场景流数据集的实现。
目前提供了两个神经网络模型,以及它们的批处理规范变化(实验):
多亏了Kaixhin,您可以在此处下载验证版的Flownets(来自Caffe,而不是来自Pytorch)。该文件夹还包含从头开始训练的网络。
直接将下载的网络馈送到脚本中,即使您的桌面环境告诉您,您也无需取消压缩。
这些网络期望BGR输入(与Pytorch中的RGB相比)。但是,BGR顺序不是很重要。
这些模块可以使用pip安装
pytorch >= 1.2
tensorboard-pytorch
tensorboardX >= 1.4
spatial-correlation-sampler>=0.2.1
imageio
argparse
path.py
或者
pip install -r requirements.txt首先,您需要下载飞行椅数据集。它是〜64GB大,我们建议您将其放入SSD驱动器中。
main.py提供的默认超参数与CAFFE培训脚本相同。
python main.py /path/to/flying_chairs/ -b8 -j8 -a flownets我们建议您使用j(数据线程数)将j设置为高,如果您使用数据指导以避免数据加载以减慢培训。
为了进一步的帮助,您可以输入
python main.py -hTensorboard-Pytorch用于记录。要可视化结果,只需键入
tensorboard --logdir=/path/to/checkpoints模型可以在此处下载在Pytorch文件夹中。
除非指定,否则对模型进行了默认选项的培训。不使用颜色翘曲。
| 拱 | 学习率 | 批量大小 | 时期尺寸 | 文件名 | 验证EPE |
|---|---|---|---|---|---|
| 飞弹 | 1E-4 | 8 | 2700 | flownets_epe1.951.pth.tar | 1.951 |
| FOWNETS BN | 1E-3 | 32 | 695 | flownets_bn_epe2.459.pth.tar | 2.459 |
| FLOWNETC | 1E-4 | 8 | 2700 | flownetc_epe1.766.pth.tar | 1.766 |
注意:Fownetts BN花了更长的时间来训练,并获得了更糟的成绩。强烈建议您不要将其用于飞行椅子数据集。
预测是由Fownets做出的。
光流的确切代码 - >颜色地图可以在此处找到
| 输入 | 预言 | 地面图 |
|---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
如果您需要在图像上运行网络,则可以在此处下载验证的网络,并在图像对文件夹上启动推理脚本。
您的文件夹需要在同一位置将所有图像对配对,并具有名称模式
{image_name}1.{ext}
{image_name}2.{ext}
python3 run_inference.py /path/to/images/folder /path/to/pretrained至于main.py脚本,可以提供一个帮助菜单。
为了在输入和目标之间具有连贯的转换,我们必须定义采用输入和目标的新变换,因为每次调用随机变换时都会定义一个新的随机变量。
为了允许数据增强,我们考虑了输入的旋转和翻译及其在目标流图上的结果。这是一套要照顾的事情,以实现适当的数据增强
如果您在IMG1上应用转换,则必须对流图应用相同,以获取流量连贯的原点点。
给定对IMG2应用的翻译(tx,ty) ,我们将拥有
flow[:,:,0] += tx
flow[:,:,1] += ty
带有变焦参数的IMG1和IMG2上应用的量表alpha乘以相同的量
flow *= alpha
在两个图像上施加了一个角度的旋转, theta还以相同的角度旋转流量矢量( flow[i,j] )
for_all i,j flow[i,j] = rotate(flow[i,j], theta)
rotate: x,y,theta -> (x*cos(theta)-x*sin(theta), y*cos(theta), x*sin(theta))
让我们考虑从图像中心的角度theta旋转。
我们必须根据其着陆的坐标来对每个流量矢量进行修改。在每个坐标(i, j)上,我们有:
flow[i, j, 0] += (cos(theta) - 1) * (j - w/2 + flow[i, j, 0]) + sin(theta) * (i - h/2 + flow[i, j, 1])
flow[i, j, 1] += -sin(theta) * (j - w/2 + flow[i, j, 0]) + (cos(theta) - 1) * (i - h/2 + flow[i, j, 1])