立体匹配--Dispnet(2016)

文章目录

    • [1. 历史背景与开创性意义](#1. 历史背景与开创性意义)
      • [1.1 传统方法的局限](#1.1 传统方法的局限)
      • [1.2 FlowNet的突破(2015)](#1.2 FlowNet的突破(2015))
      • [1.3 DispNet的贡献(2016)](#1.3 DispNet的贡献(2016))
    • [2. 网络架构详解](#2. 网络架构详解)
      • [2.1 总体架构:编码器-解码器 + 跳跃连接](#2.1 总体架构:编码器-解码器 + 跳跃连接)
      • [2.2 编码器层规格](#2.2 编码器层规格)
      • [2.3 解码器层规格](#2.3 解码器层规格)
      • [2.4 跳跃连接机制](#2.4 跳跃连接机制)
    • [3. 两种架构变体](#3. 两种架构变体)
      • [3.1 DispNet (DispNetSimple)](#3.1 DispNet (DispNetSimple))
      • [3.2 DispNetCorr (带相关层)](#3.2 DispNetCorr (带相关层))
    • [4. 相比FlowNet的改进](#4. 相比FlowNet的改进)
      • [4.1 解码器中增加卷积层](#4.1 解码器中增加卷积层)
      • [4.2 1D相关替代2D相关](#4.2 1D相关替代2D相关)
      • [4.3 多尺度损失权重调度](#4.3 多尺度损失权重调度)
    • [5. 核心思想总结](#5. 核心思想总结)

立体匹配端到端神经网络的开创者,在flownet基础上把2D预测改成1D预测,基本上与flownet架构保持了一致,采用编码解码结构,这一点和初期语义分割网络差不多,编码是为了获取更加抽象的featuremap,解码上采样是为了恢复每个像素的属性。
《FlowNet: Learning Optical Flow with Convolutional Networks》
Dispnet:
《A Large Dataset to Train Convolutional Networks for Disparity, Optical Flow, and Scene Flow Estimation》

1. 历史背景与开创性意义

1.1 传统方法的局限

在DispNet出现之前,视差估计主要依赖传统流水线:

复制代码
左右图像 → 特征提取 → 代价计算 → 代价聚合 → 视差优化 → 后处理

代表方法:

方法 特点 速度
SGM (半全局匹配) 手工设计的匹配代价 + 半全局优化 ~1.1秒/帧
MC-CNN (Žbontar & LeCun) CNN做patch级匹配代价,仍需交叉代价聚合+SGM后处理 ~67秒/帧

关键问题: 这些方法都不是端到端的------CNN仅负责局部特征匹配,视差的全局估计仍依赖手工设计的后处理流程。

1.2 FlowNet的突破(2015)

FlowNet 首次证明:密集像素级对应关系(光流)可以用单个CNN端到端学习。

核心思想:

  • 用编码器-解码器架构替代整个传统流水线
  • 编码器逐步缩小特征图、增大感受野,学习多尺度抽象特征
  • 解码器通过上卷积逐步恢复分辨率,输出密集光流场
  • 跳跃连接将编码器的细节信息传递给解码器

1.3 DispNet的贡献(2016)

DispNet 将FlowNet的思想从光流迁移到视差估计,是首个端到端CNN视差估计网络:

  • ✅ 速度快约1000倍(0.06s vs MC-CNN的67s)
  • ✅ 精度接近当时SOTA(KITTI 2015排名第二)
  • ✅ 证明了合成数据(FlyingThings3D)可以有效训练视差网络

2. 网络架构详解


flownet编码器


flownet 解码器


dispnet网络结构

2.1 总体架构:编码器-解码器 + 跳跃连接

复制代码
输入图像对 (左, 右)
       │
       ▼
┌─────────────────────────────────────────┐
│           编码器(收缩部分)               │
│  conv1 → conv2 → conv3a/b → conv4a/b   │
│  → conv5a/b → conv6a/b                  │
│  总下采样因子: 64x                        │
│  感受野逐层增大,提取多尺度抽象特征          │
└──────────────┬──────────────────────────┘
               │
               ▼
┌─────────────────────────────────────────┐
│           解码器(扩展部分)               │
│  upconv6 + iconv6 → upconv5 + iconv5   │
│  → upconv4 + iconv4 → upconv3 + iconv3 │
│  → upconv2 + iconv2 → upconv1 + iconv1 │
│  逐步上采样恢复分辨率                      │
│  每级与编码器对应层做跳跃连接(拼接)        │
└──────────────┬──────────────────────────┘
               │
               ▼
         pr1: 最终视差预测
    (分辨率为输入的 1/2)

关键设计原则: 没有信息瓶颈------即使中间特征图很小,信息也可以通过跳跃连接从编码器直接传到解码器对应层级。

2.2 编码器层规格

层名 核大小 Stride 通道数 (输入/输出) 输入分辨率 输出分辨率 说明
conv1 7×7 2 6/64 768×384 384×192 输入为左右图拼接(6通道)
conv2 5×5 2 64/128 384×192 192×96
conv3a 5×5 2 128/256 192×96 96×48
conv3b 3×3 1 256/256 96×48 96×48 不降采样
conv4a 3×3 2 256/512 96×48 48×24
conv4b 3×3 1 512/512 48×24 48×24
conv5a 3×3 2 512/512 48×24 24×12
conv5b 3×3 1 512/512 24×12 24×12
conv6a 3×3 2 512/1024 24×12 12×6
conv6b 3×3 1 1024/1024 12×6 12×6 最深层

注:

  • 分辨率以输入768×384为例
  • 每个卷积层后跟ReLU激活
  • 卷积核从7×7 → 5×5 → 3×3逐渐缩小
  • 通道数逐层翻倍至1024

2.3 解码器层规格

解码器每一级的结构为:上卷积(upconv) → 拼接(跳跃连接+上一级预测) → 卷积(iconv)

层名 核大小 Stride 通道数 (输入/输出) 输入分辨率 输出分辨率 说明
pr6+loss6 3×3 1 1024/1 12×6 12×6 最粗预测
upconv5 4×4 2 1024/512 12×6 24×12
iconv5 3×3 1 1025/512 24×12 24×12 拼接: upconv5 + conv5b + pr6上采样
pr5+loss5 3×3 1 512/1 24×12 24×12
upconv4 4×4 2 512/256 24×12 48×24
iconv4 3×3 1 769/256 48×24 48×24
pr4+loss4 3×3 1 256/1 48×24 48×24
upconv3 4×4 2 256/128 48×24 96×48
iconv3 3×3 1 385/128 96×48 96×48
pr3+loss3 3×3 1 128/1 96×48 96×48
upconv2 4×4 2 128/64 96×48 192×96
iconv2 3×3 1 193/64 192×96 192×96
pr2+loss2 3×3 1 64/1 192×96 192×96
upconv1 4×4 2 64/32 192×96 384×192
iconv1 3×3 1 97/32 384×192 384×192
pr1+loss1 3×3 1 32/1 384×192 384×192 最终预测

说明: 解码器的每一层拼接三部分:上卷积结果 + 编码器对应层特征 + 上一级视差预测的上采样。最终输出pr1的分辨率为输入的1/2。

2.4 跳跃连接机制

复制代码
编码器                    解码器
conv6b ──────────────→ (直接输入解码器起始)
conv5b ──── 拼接 ────→ iconv5 (与 upconv5 输出拼接)
conv4b ──── 拼接 ────→ iconv4
conv3b ──── 拼接 ────→ iconv3
conv2  ──── 拼接 ────→ iconv2
conv1  ──── 拼接 ────→ iconv1

作用: 编码器低层保留了空间细节(边缘、纹理),解码器高层提供语义理解。拼接后让网络在每个尺度都能同时利用细节和语义信息。


3. 两种架构变体

3.1 DispNet (DispNetSimple)

文中着重体现了DispNetSimple。

复制代码
左图 ──┐
       ├── 拼接为 6 通道 → 编码器 → 解码器 → 视差图
右图 ──┘

特点:

  • 两张图像直接在通道维度拼接,送入统一的编码器
  • 网络自行学习如何从拼接输入中提取匹配信息
  • 架构简单,但需要网络自己"发现"左右图的对应关系

3.2 DispNetCorr (带相关层)

文中提了一句DispNetCorr ,这是根据flownet推测的。

复制代码
左图 → conv1 → conv2 ──→ 特征图 f_L ──┐
                                      ├── 1D 相关层 → 拼接 → 后续编码器 
右图 → conv1 → conv2 ──→ 特征图 f_R ──┘                   → 解码器 
       (共享权重)                                        → 视差图

特点:

  • 两张图像分别通过共享权重的conv1、conv2提取特征
  • 在特征图上执行1D水平相关(因为极线校正后视差只在水平方向)
  • 相关层无可学习参数,是纯粹的模板匹配操作

1D相关层的数学定义:

给定特征图 f 1 f_1 f1和 f 2 f_2 f2,位置 x 1 x_1 x1和 x 2 x_2 x2之间的相关值为:

c ( x 1 , x 2 ) = ∑ o ∈ [ − k , k ] ⟨ f 1 ( x 1 + o ) , f 2 ( x 2 + o ) ⟩ c(x_1, x_2) = \sum_{o \in [-k, k]} \langle f_1(x_1 + o), f_2(x_2 + o) \rangle c(x1,x2)=o∈[−k,k]∑⟨f1(x1+o),f2(x2+o)⟩

其中 K = 2 k + 1 K = 2k+1 K=2k+1是块大小。本质上是两个特征块的内积(余弦相似度的非归一化版本)。

DispNet 1D相关 vs FlowNet 2D相关:

特性 FlowNet (2D相关) DispNet (1D相关)
搜索方向 水平 + 垂直 仅水平
搜索范围 最大位移 d=20, stride=2 最大位移 d=40, stride=1
对应输入像素 ±40 像素 (因stride=2) ±160 像素 (conv2后4x下采样)
计算量 O ( w × h × D 2 ) O(w \times h \times D^2) O(w×h×D2) O ( w × h × D ) O(w \times h \times D) O(w×h×D)
输出大小 w × h × ( 2 D + 1 ) 2 w \times h \times (2D+1)^2 w×h×(2D+1)2 w × h × ( 2 D + 1 ) w \times h \times (2D+1) w×h×(2D+1)

结论: DispNet利用了视差估计的1D特性,以更低的计算代价覆盖了更大的位移范围和更精细的采样。


4. 相比FlowNet的改进

4.1 解码器中增加卷积层

方法 解码器结构 效果
FlowNet upconv → 拼接 → (直接到下一级) 基准
DispNet upconv → 拼接 → iconv(额外卷积) → (到下一级) KITTI 2015 上EPE相对下降约15%

分析: 额外的卷积层让网络能更好地正则化视差预测,减少噪声和伪影,生成更平滑的视差图。

4.2 1D相关替代2D相关

  • 视差只存在于水平方向(极线约束),因此1D相关即可
  • 计算量从 O ( D 2 ) O(D^2) O(D2)降到 O ( D ) O(D) O(D)
  • 同时覆盖更大位移范围

4.3 多尺度损失权重调度

FlowNet的训练方式: 所有层的损失同时激活

DispNet的训练方式: 采用渐进式损失调度

复制代码
阶段 1: 只激活 loss6(最粗分辨率 12×6)
        其他loss权重为0
        ↓
阶段 2: 逐步激活 loss5, loss4, ...
        ↓
阶段 3: 激活 loss1(最细分辨率)
        停用低分辨率损失

原理:

  • 由于跳跃连接的存在,如果所有损失同时激活,底层会收到来自多个尺度的混合梯度
  • 渐进式调度让网络先学习粗略结构,再逐步精细化
  • 类似于课程学习(curriculum learning)的思想

5. 核心思想总结

方面 要点
核心创新 首次将端到端CNN应用于视差估计,替代传统多阶段流水线
架构基础 编码器-解码器 + 跳跃连接(继承自FlowNet)
关键改进 1D相关层、解码器额外卷积、渐进式损失调度
速度优势 比当时SOTA快约1000倍(0.06s/帧)
训练数据 合成数据(FlyingThings3D)足以训练出泛化性好的网络
局限性 最终输出仍为1/4分辨率;微调后泛化能力下降;边缘处不够锐利
历史地位 端到端视差估计的开创者,后续所有深度学习视差方法的基础

相关推荐
章鱼丸-3 小时前
DAY 42 Grad-CAM 与 Hook 函数
pytorch·深度学习·计算机视觉
这张生成的图像能检测吗3 小时前
(论文速读)FDGLM:面向多场景工业故障诊断的深度数字双动力大视觉语言模型
人工智能·深度学习·计算机视觉·故障诊断·视觉语言大模型·问答模型
格林威3 小时前
Baumer相机铝型材表面划伤长度测量:实现损伤量化评估的 5 个关键技术,附 OpenCV+Halcon 实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·工业相机
AI人工智能+4 小时前
银行卡识别技术结合AI与深度学习,实现了从图像采集到结构化输出的全流程自动化处理
深度学习·计算机视觉·ocr·银行卡识别
DisonTangor4 小时前
【小红书拥抱开源】rednote-hilab团队开源SOTA级性能OCR模型——dots.mocr
人工智能·计算机视觉·开源·ocr
格林威4 小时前
Baumer相机铝箔表面针孔检测:提升包装阻隔性的 7 个核心策略,附 OpenCV+Halcon 实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·工业相机
badhope5 小时前
2025年3月AI领域纪录:从模型开源到智能体价值重估——风云变幻DLC
人工智能·python·深度学习·计算机视觉·数据挖掘
辰痕~5 小时前
李飞飞·斯坦福CS231n计算机视觉课程
计算机视觉
不懒不懒5 小时前
【OpenCV 计算机视觉四大核心实战:从背景建模到目标跟踪】
人工智能·python·opencv·机器学习·计算机视觉