笔记:FlowNet2PyTorch

学习 FlowNet2 的详细实现过程

FlowNetS

使用普通的 CNN 实现,只是refine过程有些不同。
输入是将两张图片叠在一起(in_channel = 2个图片*3个色彩),输出是两个叠在一起的 flow

第一阶段 不断的pooling

  • nvidia 的实现和论文中有些不同:
    • 增加了 conv6_1 这一层
详细计算过程

在这里插入图片描述

  • conv or conv_n: Conv2d + BatchNorm2d + LeakyReLU
out_conv1 = self.conv1(x)
out_conv2 = self.conv2(out_conv1)
out_conv3 = self.conv3_1(self.conv3(out_conv2))
out_conv4 = self.conv4_1(self.conv4(out_conv3))
out_conv5 = self.conv5_1(self.conv5(out_conv4))
out_conv6 = self.conv6_1(self.conv6(out_conv5))

第二阶段 不断计算refine

在这里插入图片描述

  • nvidia 的实现也是有些不同:
    • 增加 conv6 的 flow 计算
  • 步骤:
    • 本层的 flow 计算:
      • flow6 = self.predict_flow6(out_conv6)
      • 内部就是二位卷机计算,保持输入和输出大小相同
    • 将 flow 的分辨率放大两倍,为了方便参与下一层的计算
      • flow6_up = self.upsampled_flow6_to_5(flow6)
      • 内部就是反卷机计算
    • 将上一层的 activation 的分辨率放大两倍
      • out_deconv5 = self.deconv5(out_conv6)
      • 内部是 反卷机 + LeakyReLU
    • 后续的反卷机过程是接近的,只是输入层是三重结果的连接
      • concat5 = torch.cat((out_conv5,out_deconv5,flow6_up),1)
      • 三重结果分别是:第一阶段的中间结果 + 上一层的输出 + 上一层计算的 flow
      • 这里连接的顺序和原文不一样

FlowNetC

  • 输入的图片分成两个,分别进行卷机计算。
  • 和 FlowNetS 比还多了 合并、Redirect 过程
    • Redirect 过程(conv-redir):其实就是把原始图片的高层特征加入到后续的 flow 计算流程中。实际计算方法是:通过 CNN(接受域为1*1)把256维的数据压缩为32维,同时长和宽不变。
详细计算过程:

在这里插入图片描述

  • 1.将输入拆成两个图片
x1 = x[:,0:3,:,:]
x2 = x[:,3::,:,:]
  • 2.对于两张图片非别计算三次CNN
# 图片一
out_conv1a = self.conv1(x1)
out_conv2a = self.conv2(out_conv1a)
out_conv3a = self.conv3(out_conv2a)
# 图片二
out_conv1b = self.conv1(x2)
out_conv2b = self.conv2(out_conv1b)
out_conv3b = self.conv3(out_conv2b)
  • 3.合并两张图片并计算 correlation layer
    • correlation layer 是用C++实现的
# C++实现
out_corr = self.corr(out_conv3a, out_conv3b) 
# 激活方法:LeakyReLU
out_corr = self.corr_activation(out_corr)
  • 4.conv-redir
out_conv_redir = self.conv_redir(out_conv3a) # conv_redir 就是 CNN
  • 5.连接 correlation layer 和 conv-redir 的输出
in_conv3_1 = torch.cat((out_conv_redir, out_corr), 1)
  • 6.通过7个 CNN 继续增加网络的能力,同时 downsample
    • 和原文不同的是:多了 conv6_1
out_conv3_1 = self.conv3_1(in_conv3_1)
out_conv4 = self.conv4_1(self.conv4(out_conv3_1))
out_conv5 = self.conv5_1(self.conv5(out_conv4))
out_conv6 = self.conv6_1(self.conv6(out_conv5))
  • 7.接下来是 refine 过程,最后输出 flow,和 FlowNetS 比较像
flow6       = self.predict_flow6(out_conv6)
flow6_up    = self.upsampled_flow6_to_5(flow6)
out_deconv5 = self.deconv5(out_conv6)
concat5 = torch.cat((out_conv5,out_deconv5,flow6_up),1)

flow5       = self.predict_flow5(concat5)
flow5_up    = self.upsampled_flow5_to_4(flow5)
out_deconv4 = self.deconv4(concat5)
concat4 = torch.cat((out_conv4,out_deconv4,flow5_up),1)

flow4       = self.predict_flow4(concat4)
flow4_up    = self.upsampled_flow4_to_3(flow4)
out_deconv3 = self.deconv3(concat4)
concat3 = torch.cat((out_conv3_1,out_deconv3,flow4_up),1)

flow3       = self.predict_flow3(concat3)
flow3_up    = self.upsampled_flow3_to_2(flow3)
out_deconv2 = self.deconv2(concat3)
concat2 = torch.cat((out_conv2a,out_deconv2,flow3_up),1)

flow2 = self.predict_flow2(concat2)

FlowNetSD

  • 这个网络主要为了分析小距离的移动
  • 和 FlowNetS 的区别
    • downsample阶段,接受域更小,层数更多
    • 在 upconvolutions 的过程中加入一层 CNN

详细过程

  • 1.6层相似的CNN、downsample,注意层数的不同
out_conv0 = self.conv0(x)
out_conv1 = self.conv1_1(self.conv1(out_conv0)) 3*3 stride=2
out_conv2 = self.conv2_1(self.conv2(out_conv1)) 3*3 stride=2
out_conv3 = self.conv3_1(self.conv3(out_conv2)) 3*3 stride=2
out_conv4 = self.conv4_1(self.conv4(out_conv3)) 3*3 stride=2
out_conv5 = self.conv5_1(self.conv5(out_conv4)) 3*3 stride=2
out_conv6 = self.conv6_1(self.conv6(out_conv5)) 3*3 stride=2
    1. 第一次 upsample,不包含 CNN
flow6       = self.predict_flow6(out_conv6)
flow6_up    = self.upsampled_flow6_to_5(flow6)
out_deconv5 = self.deconv5(out_conv6)
  • 3.后续的 upsample,包含 CNN
concat5 = torch.cat((out_conv5,out_deconv5,flow6_up),1)
out_interconv5 = self.inter_conv5(concat5) # CNN
flow5       = self.predict_flow5(out_interconv5)
flow5_up    = self.upsampled_flow5_to_4(flow5)
out_deconv4 = self.deconv4(concat5)

concat4 = torch.cat((out_conv4,out_deconv4,flow5_up),1)
out_interconv4 = self.inter_conv4(concat4) # CNN
flow4       = self.predict_flow4(out_interconv4)
flow4_up    = self.upsampled_flow4_to_3(flow4)
out_deconv3 = self.deconv3(concat4)

concat3 = torch.cat((out_conv3,out_deconv3,flow4_up),1)
out_interconv3 = self.inter_conv3(concat3) # CNN
flow3       = self.predict_flow3(out_interconv3)
flow3_up    = self.upsampled_flow3_to_2(flow3)
out_deconv2 = self.deconv2(concat3)

concat2 = torch.cat((out_conv2,out_deconv2,flow3_up),1)
out_interconv2 = self.inter_conv2(concat2)

flow2 = self.predict_flow2(out_interconv2)

FlowNetFusion

连接 FlowNet2-CSS-ft-sd 和 FlowNetSD

  • 1.3层CNN,带有两次 downsample
out_conv0 = self.conv0(x) # in:11 out:64 3*3 stride=1
out_conv1 = self.conv1_1(self.conv1(out_conv0)) # in:64 out:128 3*3 stride=2
out_conv2 = self.conv2_1(self.conv2(out_conv1)) # in:128 out:128 3*3 stride=2
  • 2.第一次 upsample
flow2       = self.predict_flow2(out_conv2) # 计算光流
flow2_up    = self.upsampled_flow2_to_1(flow2) # 增加光流分辨率
out_deconv1 = self.deconv1(out_conv2) # 后面需要
  • 3.后面的 upsample 包含 CNN 层
concat1 = torch.cat((out_conv1,out_deconv1,flow2_up),1)
out_interconv1 = self.inter_conv1(concat1) # CNN
flow1       = self.predict_flow1(out_interconv1)
flow1_up    = self.upsampled_flow1_to_0(flow1)
out_deconv0 = self.deconv0(concat1)
  • 4.输出
concat0 = torch.cat((out_conv0,out_deconv0,flow1_up),1)
out_interconv0 = self.inter_conv0(concat0)
flow0       = self.predict_flow0(out_interconv0)

return flow0
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值