关于光流估计的基础知识,请参考这篇文章,传送门

在了解光流之后,大家可能会意识到一个严肃的问题:光流数据标注极其复杂,常用的输入大小(368, 496)下,需要对 368 * 496 = 191456 个像素点进行标注,费时费力。

所以在光流估计领域,使用的数据集通常分为两类:大型合成数据集和小型真实场景数据集。

本文将对光流估计所用的主流数据集一一介绍并将光流进行可视化。

光流数据集的文件结构

注意:该文件结构,借鉴了目前主流框架RAFT的数据集存放格式(也是主流的格式,目前很多光流估计模型的数据集存放格式都和RAFT保持一致)。

├── datasets
    ├── Sintel
        ├── test
        ├── training
    ├── KITTI
        ├── testing
        ├── training
        ├── devkit
    ├── FlyingChairs_release
        ├── data
    ├── FlyingThings3D
        ├── frames_cleanpass
        ├── frames_finalpass
        ├── optical_flow

AutoFlow

(论文结果显示使用该数据集可以达到更快的拟合,更好的结果,只不过算力要求更高了)

官网:https://autoflow-google.github.io/

论文地址:https://arxiv.org/pdf/2104.14544.pdf

CVPR2021年又提出了一个AutoFlow,该数据集也是一个合成数据集,但是会根据模型的训练效果,对数据集合成方法进行反馈。如下图所示:

在这里插入图片描述

这个数据集是动态生成的,并不是固定的,所以没有下载链接。

在模型训练过程中,使用该数据集训练,然后在其他数据集的验证集做验证。

(AutoFlow的代码目前只有TensorFlow,暂时没有深入了解,所有信息只来自论文

FlyingChairs 系列

FlyingChairs 1

下载地址:FlyingChairs

论文地址: FlowNet: Learning Optical Flow with Convolutional Networks

“飞椅”是一个具有光流地面真实性的合成数据集。它由22872个图像对和相应的流场组成。

图像显示了随机背景和移动的3D椅子模型,椅子和背景都会映射到平面图像中。

飞椅中图片是.ppm格式,光流是.flo格式。所有的文件都在 data 文件夹下。

飞椅数据集提供了一个train-validation split txt,里面的每一行为1或者2,1代表训练集,2代表验证集(大概500张),也有一些模型是1:6划分数据集。

在这里插入图片描述
在这里插入图片描述

@InProceedings{DFIB15,
  author    = "A. Dosovitskiy and P. Fischer and E. Ilg and P. H{\"a}usser and C. Haz{\i}rba{\c{s}} and V. Golkov and P. v.d. Smagt and D. Cremers and T. Brox",
  title     = "FlowNet: Learning Optical Flow with Convolutional Networks",
  booktitle = "IEEE International Conference on Computer Vision (ICCV)",
  month     = " ",
  year      = "2015",
  url       = "http://lmb.informatik.uni-freiburg.de/Publications/2015/DFIB15"
}

FlyingChairs 2

下载地址:FlyingChairs2

论文地址:Occlusions, Motion and Depth Boundaries with a Generic Network for Disparity, Optical Flow or Scene Flow Estimation

FlyingChairs2是使用了一代作者的代码重新创建了整个数据集,包括反向流、运动边界和遮挡的问题。目前提到的飞椅主要是指FlyingChairs2.

@InProceedings{DFIB15,
  author    = "A. Dosovitskiy and P. Fischer and E. Ilg and P. H{\"a}usser and C. Haz{\i}rba{\c{s}} and V. Golkov and P. v.d. Smagt and D. Cremers and T. Brox",
  title     = "FlowNet: Learning Optical Flow with Convolutional Networks",
  booktitle = "IEEE International Conference on Computer Vision (ICCV)",
  month     = " ",
  year      = "2015",
  url       = "http://lmb.informatik.uni-freiburg.de/Publications/2015/DFIB15"
}
@InProceedings{ISKB18,
  author    = "E. Ilg and T. Saikia and M. Keuper and T. Brox",
  title     = "Occlusions, Motion and Depth Boundaries with a Generic Network for Disparity, Optical Flow or Scene Flow Estimation",
  booktitle = "European Conference on Computer Vision (ECCV)",
  month     = " ",
  year      = "2018",
  url       = "http://lmb.informatik.uni-freiburg.de/Publications/2018/ISKB18"
}

ChairsSDHom

下载地址:ChairsSDHom

论文地址:FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks.

论文中提到,虽然在Sintel的验证集上效果较好,但在实际应用中的局限性已经很明显。尤其是模型无法准确地地估计小运动。这个很不合理,因为对于传统方法来说,小动作更容易被识别出来,基于深度学习的方法并没有理由识别不出来小动作。因此,FlowNet2的作者检查了训练数据,并将其与UCF101数据集进行了比较(因为UCF101更贴近真实世界数据)。虽然FlyingChairs与Sintel(该数据集通常被用作光流验证集,下面会介绍)相似,但和UCF101来说是不同的:

  • Sintel是一部动作片,因此包含了许多传统方法难以实现的快速移动;
  • 而我们在UCF101数据集中看到的位移要小得多,大多小于1像素。

因此,FlowNet2的作者们创建了一个类似Chairs视觉风格的数据集,但位移非常小,位移直方图更像UCF101。还添加了同质背景或仅由颜色梯度组成的案例, 这就是ChairsSDHom。

@InProceedings{IMKDB17,
  author    = "E. Ilg and N. Mayer and T. Saikia and M. Keuper and A. Dosovitskiy and T. Brox",
  title     = "FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks",
  booktitle = "IEEE Conference on Computer Vision and Pattern Recognition (CVPR)",
  month     = "Jul",
  year      = "2017",
  url       = "http://lmb.informatik.uni-freiburg.de//Publications/2017/IMKDB17"
}

ChairsSDHom extended

下载地址:ChairsSDHom extended

论文地址:Occlusions, Motion and Depth Boundaries with a Generic Network for Disparity, Optical Flow or Scene Flow Estimation

扩展版本包含相同的光流和图像,但也包括其他风格,其在Occlusions, Motion and Depth Boundaries with a Generic Network for Disparity, Optical Flow or Scene Flow Estimation用于训练网络。(个人感觉区别不大)

@InProceedings{IMKDB17,
  author    = "E. Ilg and N. Mayer and T. Saikia and M. Keuper and A. Dosovitskiy and T. Brox",
  title     = "FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks",
  booktitle = "IEEE Conference on Computer Vision and Pattern Recognition (CVPR)",
  month     = "Jul",
  year      = "2017",
  url       = "http://lmb.informatik.uni-freiburg.de//Publications/2017/IMKDB17"
}
@InProceedings{ISKB18,
  author    = "E. Ilg and T. Saikia and M. Keuper and T. Brox",
  title     = "Occlusions, Motion and Depth Boundaries with a Generic Network for Disparity, Optical Flow or Scene Flow Estimation",
  booktitle = "European Conference on Computer Vision (ECCV)",
  month     = " ",
  year      = "2018",
  url       = "http://lmb.informatik.uni-freiburg.de/Publications/2018/ISKB18"
}

Scene Flow Datasets

下载地址:Scene Flow Datasets

论文地址:A Large Dataset to Train Convolutional Networks for Disparity, Optical Flow, and Scene Flow Estimation

光流估计可以作为一个有监督的学习任务,并且可以用卷积网络解决。FlowNet的训练是通过一个大型的合成数据集(就是上文提到的FlyingChairs)实现的。该论文将卷积网络光流估计的概念扩展到视差和场景流估计,提出了三个具有足够真实感、变化性和大小的合成立体视频数据集。

与Sintel相比,Scene Flow Datasets足够大,便于卷积网络的训练,并且它为场景流提供了基本真实感。特别地,它包括用于双向视差的立体彩色图像和地面真值、双向光流和视差变化、运动边界和对象分割。此外,还提供了完整的相机校准、3D点位置和RGBD数据。

论文的实验结果如下图所示:

在这里插入图片描述

关于Scene Flow Datasets的三个数据集的大小信息如下图所示:

在这里插入图片描述

@InProceedings{MIFDB16,
  author    = "N. Mayer and E. Ilg and P. H{\"a}usser and P. Fischer and D. Cremers and A. Dosovitskiy and T. Brox",
  title     = "A Large Dataset to Train Convolutional Networks for Disparity, Optical Flow, and Scene Flow Estimation",
  booktitle = "IEEE International Conference on Computer Vision and Pattern Recognition (CVPR)",
  year      = "2016",
  note      = "arXiv:1512.02134",
  url       = "http://lmb.informatik.uni-freiburg.de/Publications/2016/MIFDB16"
}

FlyingThings3D

FlyingThings3D数据收集的主要部分包括沿着随机3D轨迹飞行的日常物体,生成了大约25000个立体帧。FlyingThings3D不是专注于特定的任务(如KITTI)或非常注意复合实际情景(如Sintel),而是依赖随机性和大量渲染资产来生成比任何现有数据集都多几个数量级的数据,而且不存在重复或过拟合的风险。数据生成快速、全自动,并为整个场景流任务生成密集、准确的地面真实信息。创建此数据集的动机是为了促进大型卷积网络的训练,这将从大量的卷积网络中受益。

本人有幸使用过下载过FlyingThings3D,令人遗憾的是我存储空间不够了。示例图如下所示:

在这里插入图片描述

Monkaa

第二部分来自动画短片Monkaa,包含非刚性和软结构运动,以及视觉方向特别具有挑战性的毛发。Monkaa不追求符合实际场景。

作者选择了一些合适的电影场景,并使用Monkaa的部分和片段创建了全新的场景。为了增加数据量,作者在多个版本中渲染了自己制作的场景,每个版本都对相机的旋转和运动路径进行了随机修改。

Driving

从驾驶汽车的角度来看,Driving主要是一个自然主义的动态街道场景,类似于KITTI数据集。它和FlyingThings3D数据集使用了相同的汽车模型,还使用3D Warehouse中的树和路灯模型。

示例图如下所示:

在这里插入图片描述

Sintel

下载地址:Sintel

论文地址:A Large Dataset to Train Convolutional Networks for Disparity, Optical Flow, and Scene Flow Estimation

A data set for the evaluation of optical flow derived from the open source 3D animated short film

该数据集来自开源3D动画短片Sintel,主要是为了验证模型的好坏,而不是训练,数据集、指标和评估网站是公开的。

http://sintel.is.tue.mpg.de/

@inproceedings{Butler:ECCV:2012,
title = {A naturalistic open source movie for optical flow evaluation},
author = {Butler, D. J. and Wulff, J. and Stanley, G. B. and Black, M. J.},
booktitle = {European Conf. on Computer Vision (ECCV)},
editor = {{A. Fitzgibbon et al. (Eds.)}},
publisher = {Springer-Verlag},
series = {Part IV, LNCS 7577},
month = oct,
pages = {611--625},
year = {2012}
}

在这里插入图片描述

在这里插入图片描述

渲染过程。按行从顶部开始:反照率过程:平坦、无阴影的曲面随时间呈现恒定反照率。清洁过程:包括平滑着色和镜面反射的照明增加了真实感。最终过程:具有所有效果的完全渲染,包括由于摄影机景深(第1列)和运动(第2列和第3列)而产生的模糊,以及大气效果(第3列和第4列)。最后的过程类似于原始渲染的电影;有关更改的描述,请参见[4]。

KITTI

下载地址:KITTI 2012 / 2015

论文地址:

KITTI2012 Are we ready for Autonomous Driving?The KITTI Vision Benchmark Suite

KITTI2015 Object Scene Flow for Autonomous Vehicles

KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集。该数据集用于评测立体图像(stereo),光流(optical flow),视觉测距(visual odometry),3D物体检测(object detection)和3D跟踪(tracking)等计算机视觉技术在车载环境下的性能。KITTI包含市区、乡村和高速公路等场景采集的真实图像数据,每张图像中最多达15辆车和30个行人,还有各种程度的遮挡与截断。KITTI包括389对立体图像和光流图,

示例图如下所示:

在这里插入图片描述

HD1K

HD1K是一个合成数据集并标注了光流。该数据集由海德堡图像处理合作实验室与Robert Bosch GmbH密切合作创建。

下载地址:HD1K

示例图如下所示:
在这里插入图片描述

光流可视化

通过光流的介绍,我们已经知道了,每一个像素点,对应一个光流坐标,就如同在平面直角坐标系一样,可视化展示方法,如下图所示:

在这里插入图片描述

# 引入必要的包
import numpy as np
from PIL import Image
import re
import cv2
# 读取.flo文件,.flo文件是本质是一个三维数组,通道数是2
def readFlow(fn):
    with open(fn, 'rb') as f:
        magic = np.fromfile(f, np.float32, count=1)
        if 202021.25 != magic:
            print('Magic number incorrect. Invalid .flo file')
            return None
        else:
            w = np.fromfile(f, np.int32, count=1)
            h = np.fromfile(f, np.int32, count=1)
            # print 'Reading %d x %d flo file\n' % (w, h)
            data = np.fromfile(f, np.float32, count=2*int(w)*int(h))
            # Reshape data into 3D array (columns, rows, bands)
            # The reshape here is for visualization, the original code is (w,h,2)
            return np.resize(data, (int(h), int(w), 2))
# 制作颜色罗盘
def make_colorwheel():
    RY = 15
    YG = 6
    GC = 4
    CB = 11
    BM = 13
    MR = 6

    ncols = RY + YG + GC + CB + BM + MR
    colorwheel = np.zeros((ncols, 3))
    col = 0

    # RY
    colorwheel[0:RY, 0] = 255
    colorwheel[0:RY, 1] = np.floor(255*np.arange(0,RY)/RY)
    col = col+RY
    # YG
    colorwheel[col:col+YG, 0] = 255 - np.floor(255*np.arange(0,YG)/YG)
    colorwheel[col:col+YG, 1] = 255
    col = col+YG
    # GC
    colorwheel[col:col+GC, 1] = 255
    colorwheel[col:col+GC, 2] = np.floor(255*np.arange(0,GC)/GC)
    col = col+GC
    # CB
    colorwheel[col:col+CB, 1] = 255 - np.floor(255*np.arange(CB)/CB)
    colorwheel[col:col+CB, 2] = 255
    col = col+CB
    # BM
    colorwheel[col:col+BM, 2] = 255
    colorwheel[col:col+BM, 0] = np.floor(255*np.arange(0,BM)/BM)
    col = col+BM
    # MR
    colorwheel[col:col+MR, 2] = 255 - np.floor(255*np.arange(MR)/MR)
    colorwheel[col:col+MR, 0] = 255
    return colorwheel


# 将flow读取出来的两个维度,找到颜色轮盘上对应的颜色
def flow_uv_to_colors(u, v, convert_to_bgr=False):
    flow_image = np.zeros((u.shape[0], u.shape[1], 3), np.uint8)
    colorwheel = make_colorwheel()  # shape [55x3]
    ncols = colorwheel.shape[0]
    rad = np.sqrt(np.square(u) + np.square(v))
    a = np.arctan2(-v, -u)/np.pi
    fk = (a+1) / 2*(ncols-1)
    k0 = np.floor(fk).astype(np.int32)
    k1 = k0 + 1
    k1[k1 == ncols] = 0
    f = fk - k0
    for i in range(colorwheel.shape[1]):
        tmp = colorwheel[:,i]
        col0 = tmp[k0] / 255.0
        col1 = tmp[k1] / 255.0
        col = (1-f)*col0 + f*col1
        idx = (rad <= 1)
        col[idx]  = 1 - rad[idx] * (1-col[idx])
        col[~idx] = col[~idx] * 0.75   # out of range
        # Note the 2-i => BGR instead of RGB
        ch_idx = 2-i if convert_to_bgr else i
        flow_image[:,:,ch_idx] = np.floor(255 * col)
    return flow_image
# 输入的flow_uv是从.flo中读取出来的3为矩阵,通道数为2
def flow_to_image(flow_uv, clip_flow=None, convert_to_bgr=False):
    u = flow_uv[:,:,0]
    v = flow_uv[:,:,1]
    rad = np.sqrt(np.square(u) + np.square(v))
    rad_max = np.max(rad)
    epsilon = 1e-5
    u = u / (rad_max + epsilon)
    v = v / (rad_max + epsilon)
    return flow_uv_to_colors(u, v, convert_to_bgr)
# 在work下,有两个.ppm 一个.flo文件,后者是光流文件,我们用这个光流文件做示例,展示一下可视化效果。
gt_flo = readFlow('work/00001_flow.flo')                
gt_flo = flow_to_image(gt_flo)
cv2.imwrite('work/gt_flo.png', gt_flo)
True
img=Image.open('work/gt_flo.png')
'work/gt_flo.png', gt_flo)
True
img=Image.open('work/gt_flo.png')
img.show()

在这里插入图片描述

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐