参考代码:CREStereo

1. 概述

介绍:双目立体匹配在像Middlebury数据上已经取得了不错的效果,但是将训练得到的匹配模型应用到实际场景下时输出效果会出现较大退化。这是因为实际运用场景情况会更加复杂,比如纤细物体的视差估计、图像矫正不够理想、双目相机的模型一致性存在问题以及多样的困难场景。这篇文章对于实际场景中存在的问题提出了一种合成数据、真实数据联合训练的多层次迭代优化双目视差估计算法加以解决,文章的主要贡献点可以总结为如下几点:

  1. 网络结构上:提出AGCL(Adaptive Group Correlation Layer),首先使用channel-group局部窗口计算local feature attention,之后在视差图解码预测的不同阶段上交替使用2D和1D的kernel实现局部搜索,此外通过学习的形式感知kernel的偏移offset实现更精准地搜索匹配;
  2. 参考RAFT中迭代优化的策略,这里文章也采用这种coarse-to-fine的迭代优化形式。除此,还可以通过在infer阶段建立图像金字塔实现级联优化,从而得到更准确的视差估计;
  3. 在现有合成数据集的基础上使用Blender针对复杂场景(如纤细物体、新的视差分布、图像光照变化等)进行仿真数据合成(数据量为20w),作为现有公开数据集数据的补充;

将文章代码中的eth3d上训练得到的模型实际进行测试也展示了其较好的泛化能力。下面是文章给出的该方法的一些效果图:

2. 方法设计

2.1 网络结构

文章设计的网络在训练和测试阶段其pipeline如下图所示:

  • 1)在训练中:首先通过一系列的attention和2D、1Dcorrelation操作refine特征,并级联优化输出视差估计结果,对应上图左边分别在stride={116,18,14}stride=\{\frac{1}{16},\frac{1}{8},\frac{1}{4}\}stride={161​,81​,41​}处得到视差估计残差Δdisparity\Delta_{disparity}Δdisparity​;
  • 2)在测试中:按照需求的不同会通过采样操作得到图像金字塔,然后将低分辨率的预测输出结果作为高分辨率的初始输入,从而达到级联优化的目的;

2.2 AGCL

实际场景下使用的双目系统可能会存在如极线未对齐、双目相机参数存在偏差等因素,从而导致与双目立体匹配的先验假设不符,自然导致实际运用存在限制。对此文章提出了AGCL(Adaptive Group Correlation Layer)模块去实现双目图像的特征关联。对于这个模块其结构为:

结合文章内容解码器部分主要包含这几个部分:基于channel-group局部特征attention模块(也就是文中的Local Feature Attention)、2D和1D维度的局部交替搜索模块。这里涉及到的模块多是采用分组的形式进行的,这样做的好处便是能够减少部分运算量。

channel-group局部特征attention:
这部分实现参考的是LoFTR论文中对与特征相关性的计算,并采用channel分组和位置编码的形式加速运算和优化特征表达。对于位置编码部分使用的是sin和cos进行编码,对于这部分可以参考:

# nets/attention/position_encoding.py#L6
class PositionEncodingSine(M.Module):...

PS:这里的实现在其实是存在一些问题的,具体可以参考仓库的issue。
对于特征添加了位置编码之后便是计算特征之间相关性用于增强特征表达了,其核心代码为:

# nets/attention/linear_attention.py#L25
# [B, L, 8, 32, 1]*[B, L, 8, 1, 32]->[B,L,8,32,32]->[B,8,32,32]
KV = F.sum(F.expand_dims(K, -1) * F.expand_dims(values, 3), axis=1)
# [B, L, 8, 32]*[B, 1, 8, 32]->[B, L, 8, 32]->[B, L, 8]
Z = 1 / (F.sum(Q * F.sum(K, axis=1, keepdims=True), axis=-1) + self.eps)
queried_values = (F.sum(# [B,L,8,32,1]*[B, 1, 8, 32, 32]*[B, L, 8, 1, 1]->[B,L,8,32]F.expand_dims(Q, -1) * F.expand_dims(KV, 1) * F.expand_dims(Z, (3, 4)),axis=3,)* v_length
)

注意上面的维度数8,328,328,32其实是输入特征被划分为了8个head,也就是在channel上8等分,L=H∗WL=H*WL=H∗W是特征图的spatial维度上的元素数量。

2D和1D维度的局部交替搜索:
这部分是使用预先定义好的kernel和dilation参数交替(按照迭代优化的奇偶次数)进行局部搜索,其参数被设置为:

# nets/corr.py#L58
if small_patch:psize_list = [(3, 3), (3, 3), (3, 3), (3, 3)]dilate_list = [(1, 1), (1, 1), (1, 1), (1, 1)]
else:psize_list = [(1, 9), (1, 9), (1, 9), (1, 9)]dilate_list = [(1, 1), (1, 1), (1, 1), (1, 1)]

注意到上面的kernel size和dilate size是4对,其实就是与文章中说到的channel分组。

通过上述kernel size和dilate size便在特征图上进行局部特征匹配(2D和1D均可用下面的表达式进行描述,区别在于kernel的形状不一样):
Corr(x,y,d)=1C∑i=1CF1(i,x,y)F2(i,x′,y′)Corr(x,y,d)=\frac{1}{C}\sum_{i=1}^CF_1(i,x,y)F_2(i,x^{'},y^{'})Corr(x,y,d)=C1​i=1∑C​F1​(i,x,y)F2​(i,x′,y′)
其中,x′=x+f(d),y′=y+g(d)x^{'}=x+f(d),y^{'}=y+g(d)x′=x+f(d),y′=y+g(d)代表的是在(x,y)(x,y)(x,y)处的局部搜索偏移量,其与kernel的设置相关。除了上述中使用预先设定好的kernel和dilate参数进行局部搜索之外,文章还提供了网络自学习局部偏移能力,也就是在上述局部搜索的前提下对每个像素设定一个偏移量,使得能够更好完成局部匹配,而不仅仅使用预先设定好的参数进行计算,具有一定的自主感知能力。其实现是通过卷积的形式(之后会经过sigmoid激活),可以参考:

# nets/crestereo.py#L40
# adaptive search
self.search_num = 9
self.conv_offset_16 = M.Conv2d(256, self.search_num * 2, kernel_size=3, stride=1, padding=1
)
self.conv_offset_8 = M.Conv2d(256, self.search_num * 2, kernel_size=3, stride=1, padding=1
)

因而计算局部相关性的时候原来的偏移量就变为了:x′′=x+f(d)+dx,y′′=y+g(d)+dyx^{''}=x+f(d)+d_x,y^{''}=y+g(d)+d_yx′′=x+f(d)+dx​,y′′=y+g(d)+dy​。也就是下图展示的情况:

2.3 损失函数

这里损失函数的设计与RAFT的形式一致,如下:
L=∑s∑i=1nγn−i∣∣dgt−μs(fis)∣∣1L=\sum_s\sum_{i=1}^n\gamma^{n-i}||d_{gt}-\mu_s(f_i^s)||_1L=s∑​i=1∑n​γn−i∣∣dgt​−μs​(fis​)∣∣1​

2.4 合成数据集

文章对现有的视差公开数据集进行分析之后,使用Blender在场景中物体形状、光照变化、视差分布等维度进行重新设计与采样,用以对现有公开数据的补充。其效果见下图 :

3. 实验结果

文章提出的多阶段(图像金字塔)推理对性能的影响:

Middlebury上的性能比较:

《CREStereo:Practical Stereo Matching via Cascaded Recurrent Network with Adaptive Correlation》论文笔记相关推荐

  1. 论文笔记之Understanding and Diagnosing Visual Tracking Systems

    Understanding and Diagnosing Visual Tracking Systems 论文链接:http://dwz.cn/6qPeIb 本文的主要思想是为了剖析出一个跟踪算法中到 ...

  2. 《Understanding and Diagnosing Visual Tracking Systems》论文笔记

    本人为目标追踪初入小白,在博客下第一次记录一下自己的论文笔记,如有差错,恳请批评指正!! 论文相关信息:<Understanding and Diagnosing Visual Tracking ...

  3. 论文笔记Understanding and Diagnosing Visual Tracking Systems

    最近在看目标跟踪方面的论文,看到王乃岩博士发的一篇分析跟踪系统的文章,将目标跟踪系统拆分为多个独立的部分进行分析,比较各个部分的效果.本文主要对该论文的重点的一个大致翻译,刚入门,水平有限,如有理解错 ...

  4. 目标跟踪笔记Understanding and Diagnosing Visual Tracking Systems

    Understanding and Diagnosing Visual Tracking Systems 原文链接:https://blog.csdn.net/u010515206/article/d ...

  5. 追踪系统分模块解析(Understanding and Diagnosing Visual Tracking Systems)

    追踪系统分模块解析(Understanding and Diagnosing Visual Tracking Systems) PROJECT http://winsty.net/tracker_di ...

  6. ICCV 2015 《Understanding and Diagnosing Visual Tracking Systems》论文笔记

    目录 写在前面 文章大意 一些benchmark 实验 实验设置 基本模型 数据集 实验1 Featrue Extractor 实验2 Observation Model 实验3 Motion Mod ...

  7. Understanding and Diagnosing Visual Tracking Systems

    文章把一个跟踪器分为几个模块,分别为motion model, feature extractor, observation model, model updater, and ensemble po ...

  8. CVPR 2017 SANet:《SANet: Structure-Aware Network for Visual Tracking》论文笔记

    理解出错之处望不吝指正. 本文模型叫做SANet.作者在论文中提到,CNN模型主要适用于类间判别,对于相似物体的判别能力不强.作者提出使用RNN对目标物体的self-structure进行建模,用于提 ...

  9. ICCV 2017 UCT:《UCT: Learning Unified Convolutional Networks forReal-time Visual Tracking》论文笔记

    理解出错之处望不吝指正. 本文模型叫做UCT.就像论文题目一样,作者提出了一个基于卷积神经网络的end2end的tracking模型.模型的整体结构如下图所示(图中实线代表online trackin ...

  10. CVPR 2018 STRCF:《Learning Spatial-Temporal Regularized Correlation Filters for Visual Tracking》论文笔记

    理解出错之处望不吝指正. 本文提出的模型叫做STRCF. 在DCF中存在边界效应,SRDCF在DCF的基础上中通过加入spatial惩罚项解决了边界效应,但是SRDCF在tracking的过程中要使用 ...

最新文章

  1. 如果你的云服务商倒闭该怎么办?
  2. 全球最权威的区块链行业报告
  3. 1万属性,100亿数据,每秒10万吞吐,架构如何设计?
  4. BZOJ 1412 [ZJOI2009]狼和羊的故事(最小割)
  5. 黑客内鬼窃取华尔街金融服务公司核心交易算法
  6. 云计算底层技术--linux上的虚拟网络设备
  7. 通讯录管理系统课设使用c编写基于链表增查删改分组文本操作随程序实时同步
  8. 为什么越有钱的人越轻松
  9. python实现编辑距离以及回溯路径
  10. Des加密后传参被特殊字符(如+)截断
  11. 智能摄像头如何防范被破解确保安全?
  12. 软件生成CAN总线,RS422,ARINC429总线物理波形。
  13. PostgresSQL弱密码导致命令执行
  14. 概率统计21——指数分布和无记忆性
  15. php c端,蛋白测序(N端,C端测序)
  16. 超详细的WMS仓储管理系统介绍——出库篇
  17. 转载《利用Windows系统自带命令手工搞定病毒》_原水_新浪博客
  18. 传感网与物联网的区别,这二者之间的具体区别到底是什么?
  19. kotlin学习(三)-------方便好用的字符串特性
  20. 一个 SPI 转串口驱动的优化

热门文章

  1. IOS端二维码小工具
  2. 超级管理员这样的特权账号存在哪些安全风险
  3. elementui表格固定列错位
  4. Apache 2.4.18 局域网不能访问解决方案
  5. 移动互联网迅猛发展,手机信息安全隐患如何消除?
  6. 【语音识别】WeNet:面向工业落地的E2E语音识别工具
  7. 【WebGIS初学到入职】第二阶段的小结
  8. 斐波那契,ACM,用表(vector)实现
  9. python中随机整数生成random.randint和random.randrange的区别
  10. 北京php服务器,php sever 服务器