深度学习下的光流

本文解析了光流法的基本原理,探讨了displacementfield、deformationfield和opticalflow之间的关系,并通过代码展示了如何用PyTorch实现图像的光流变形。重点在于讲解如何使用grid_sample进行坐标变换和位移计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总是被导师怼 唉

  1. 一些定义是什么?
    光流(optical flow)法是运动图像分析的重要方法,它的概念是由 James J. Gibson于20世纪40年代首先提出的,是指时变图像中模式运动速度。因为当物体在运动时,它在图像上对应点的亮度模式也在运动。
    简单来说,光流只得应该是速度。但是速度是有方向的,所以我们一张256X256(后面相同)的图片采用256X256X2(分别表示水平和竖直方向上的速度)的方式来表示。
    通常情况下,为了简化我们将其直接作为位移,也就是默认其时间为1(等同于displacement)

    displacement field:就是u = X-x 其实就是代表位移
    一张图片的坐标假设为 X ,当前的坐标为x
    在这里插入图片描述

    deformation field(形变场):是指的坐标! 就是x
    下面是一些推到,帮助理解他们之间的关系
    deformation field = displacement field + X
    我们通常认为 displacement field 和 光流是可以替代的,而X通常是代表所有前一张图的坐标
    deformation field = optical flow + X

  2. 结合代码
    代码中,grid 为 X ,flow为 displacement field (optical flow),vgrid 为 deformation field
    在实现过程中因为.grid_sample函数要求输入是-1到1 所以坐标看起来很奇怪。

def warp(x,flow):
    """
    warp an image/tensor (im2) back to im1, according to the optical flow
    x: [B, C, H, W] (im2)
    flo: [B, 2, H, W] flow
    """
    B, C, H, W = x.size()
    xx = torch.arange(0, W).view(1, -1).repeat(H, 1)
    yy = torch.arange(0, H).view(-1, 1).repeat(1, W)
    xx = xx.view(1, 1, H, W).repeat(B, 1, 1, 1)
    yy = yy.view(1, 1, H, W).repeat(B, 1, 1, 1)
    grid = torch.cat((xx, yy), 1).float()

    x = x.cuda()
    grid = grid.cuda()
    # 图二的每个像素坐标加上它的光流即为该像素点对应在图一的坐标
    vgrid = Variable(grid) + flow
    vgrid[:, 0, :, :] = 2.0 * vgrid[:, 0, :, :].clone() / max(W - 1, 1) - 1.0
    # 取出光流v这个维度,原来范围是0~W-1,再除以W-1,范围是0~1,再乘以2,范围是0~2,再-1,范围是-1~1
    vgrid[:, 1, :, :] = 2.0 * vgrid[:, 1, :, :].clone() / max(H - 1, 1) - 1.0  # 取出光流u这个维度,同上
    vgrid = vgrid.permute(0, 2, 3, 1)  # from B,2,H,W -> B,H,W,2,为什么要这么变呢?是因为要配合grid_sample这个函数的使用
    output = nn.functional.grid_sample(x, vgrid, align_corners=True)
    mask = torch.autograd.Variable(torch.ones(x.size())).cuda()
    mask = nn.functional.grid_sample(mask, vgrid, align_corners=True)

    ##2019 author
    mask[mask < 0.9999] = 0
    mask[mask > 0] = 1
    # scale grid to [-1,1]
### 基于深度学习法 #### 实现原理 基于深度学习算法通过卷积神经网络(CNNs)来预测连续帧之间的像素位移场。Flownet作为早期尝试之一,引入了端到端的学习框架用于直接从图像对中回归图[^2]。该模型采用编码器-解码器结构,其中输入是一对相邻时间戳记的RGB图片;经过一系列下采样层提取特征表示之后再经由上采样的过程重建出对应位置的速度矢量。 更进一步地,在RAFT (Recurrent All-Pairs Field Transforms) 中采用了循环机制以及多尺度处理策略以提高精度并减少计算成本[^3]。具体来说: 1. **基础特征提取** 利用ResNet架构预训练权重初始化卷积滤波器参数,从而获得鲁棒性强的基础特征映射。 2. **视觉相似性相关性金字塔** 构建不同分辨率下的匹配代价体,并利用上下文信息指导最优路径搜索方向的选择。 3. **高效的相关性查找** 设计轻量化模块加速最近邻查询操作的同时保持较高召回率。 4. **迭代更新** 结合GRU单元记忆先前时刻的状态向量辅助当前决策制定程。 5. **更新块凸上采样** 对低分辨率预测结果实施亚像素级精细化调整直至达到目标尺寸规格为止。 ```python import torch.nn as nn class RAFT(nn.Module): def __init__(self, args): super(RAFT, self).__init__() # 定义特征提取器和其他组件... def forward(self, image1, image2): # 执行前向传播逻辑... return flow_predictions ``` #### 应用场景 这些先进的技术已经被广泛应用于多个领域,比如自动驾驶汽车环境感知系统中的动态障碍物检测与跟踪、医学影像分析里的器官变形监测、增强现实设备里虚拟对象的空间定位校准等实际问题求解过程中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值