【论文阅读】PatchmatchNet
【论文阅读】PatchmatchNet
2022/06/07
论文:PatchmatchNet: Learned Multi-View Patchmatch Stereo(2020)
论文试图解决什么问题
由于3D CNN通常耗费时间和内存,因此一些方法在特征提取期间对输入进行下采样,并以低分辨率计算成本量和深度图。然而,以低分辨率提供深度图会损害准确性。本文将patchmatch的算法结合到cascade中,旨在减少高分辨率多视图立体的内存消耗和运行时间。
论文解决方案关键点
应用了迭代的多尺度Patchmatch算法。对某个像素点A,找到其相邻像素点B, C, D, E,BCDE分别又有对应的深度值,则将这些深度值作为A的深度值候选,如果有cost更低的则采用。采用后再在该新深度值的附近取值,看是否有更加合适的深度值,迭代至结束。
adaptive propagation,neighbor的选取不再是固定的pattern,而是自适应尽可能选出同一表面上的点。
在evaluation时,也使用类似的自适应算法,而不是对整个cost volume进行3D regularization。
论文的主要贡献
在性能几乎不变的情况下,速度至少快了2.5倍,内存消耗至少小了2倍。
论文的数据集和开源代码
除了DTU和Tanks&Temples以外,还在ETH3D上进行测试。
背景
当给定一些图像以及对应的相机参数(包括内参和外参)时,multi-view stereo (MVS)主要用来把场景以点云或mesh的方式进行重建。在传统方法中,许多方法(譬如COLMAP、Gipuma、ACMM等)基于PatchMatch算法进行深度图的估计。PatchMatch算法主要包括三个步骤:
- Initialization:每个像素随机初始化深度值;
- Propagation:把每个像素的depth hypothesis传播到周围像素;
- Evaluation:对每个像素,从所有的hypotheses中选取cost最小的作为估计值。
在Initialization以后,PatchMatch在Propagation和Evaluation之间循环,直至结果收敛。PatchMatch利用了深度图的空间相关性,通过随机初始化和传播过程避免了对所有可能的深度值进行验证,所以对memory要求比较低。
而目前,基于深度学习的方法在各个MVS benchmark上面有了很好的表现。MVSNet是一个十分具有代表性的方法,它在预先给定的深度范围内采样D个depth hypotheses,然后基于plane-sweeping stereo和differential warping构建cost volume,使用3D U-Net进行regularization得到probability volume,最后使用soft argmin(求期望)得到深度的估计。在后续的诸多工作中,由于3D convolution十分昂贵,一些方法(R-MVSNet、D2HC-RMVSNet等)通过使用RNN对cost volume进行sequentially regularization,对显存进行了很好的限制,但是增加了运行时间。另一些方法(CasMVSNet、UCS-Net、CVP-MVSNet等)使用cascade cost volume进行coarse-to-fine的估计,显存和时间都大幅缩减,并且有更好的表现。
整体网络结构
PatchmatchNet是一种以learning-based Patchmatch为主体的cascade结构,主要包含基于FPN的多尺度特征提取,嵌入在cascade结构中的learning-based Patchmarch以及spatial refinement模块(用来上采样至原图大小)。整体的网络流程如下图所示,大致包含三个步骤:
- 进行多尺度的特征提取;
- 先使用最低分辨率的特征图构建包含所有深度范围(0-192)的cost volume,进行代价聚合和深度回归得到初始深度图;
- 根据初始深度图,利用PatchMatch算法,构建一个包含较小的深度搜索范围的cost volume,以减少计算量和内存。
注:设原图的分辨率为[W, H],则在stage k,深度图的分辨率为[W2k,H2k][\dfrac{W}{2^k}, \dfrac{H}{2^k}][2kW,2kH]
整个网络的结构基于coarse-to-fine的范式,输入的主视图+辅助视图组首先经过一个多尺度的特征提取器生成三个尺度的特征。之后在每个尺度的特征图上分别进行patchmatch迭代优化生成当前尺度的深度图,上采样之后作为下个尺度patchmatch的初始深度图。分辨率最高的尺度上生成深度预测结果之后,还会上采样并经过refine步骤得到最终的预测结果。
Multi-scale Feature Extraction
FPN(Feature Pyramid Network)金字塔多尺度特征提取。
Learning-based Patchmatch
Patchmatch模块的结构如下图所示,大体包含三个环节Initiazation, Propogation, Evaluation。
整个流程具体如下:
Initialization:在第一个iteration(stage 3的第一个),随机初始化Df个sample(为保证sample尽可能分布到整个depth range,将depth range划分为多个区间,在每个区间随机采样);
Local perturbation:在第一个iteration后,以前一个iteration得到的(自身像素而非临块)深度估计值为中心,在一个小邻域内采样(local refinement);
adaptive propagation:基于特征,对每个像素,将adaptively sampled neighbors(自适应临块)的depth hypothesis传递过来;
differentiable warping:在得到所有depth hypotheses后(前三个步骤),进行differentiable warping,将source features warp到reference view;
matching cost computation:对每个像素和每个depth hypothesis,进行matching cost的计算,使用Pixel-wise view weight(在第一个iteration估计得到,因为第一个iteration的samples能比较好的分布在整个depth range)对所有source views的costs进行aggregation【需要注意的是,在这个步骤,我们只使用了 [1 × 1 × 1 ] 的卷积,而没有使用大部分方法的3D U-Net,原因有两方面:一是coarse-to-fine结构以及adaptive propagation使得不同像素的hypotheses都不相同,cost volume不规则;二是为了提升效率,具体可参见supplementary】;
adaptive spatial cost aggregation:对每个像素和每个depth hypothesis,自适应采样一些邻域内的像素进行cost aggregation;
depth regression:得到所有costs以后,用softmax得到每个hypothesis对应的概率,然后求期望得到估计值。
1. Adaptive Propogation / 创新点
对于Patchmatch,大部分传统方法(譬如Gipuma)使用固定的pattern选取neighbors,进行propagation。但是,深度图的空间一致性往往只对一个表面上的像素成立(周围的neighbors有相似的深度值)。所以,我们希望在采样neighbors的过程中,只采样和当前像素在同一表面上的neighbors,这样的话可以加快算法的收敛速度,提升精度。具体效果如下:
其中,(a) RGB (b)static pattern (c)adaptive pattern。
对于边缘的点(黄色),所有的采样点尽可能分布在边界内部。对于untextured area上的点(红色),采样点分布的比较分散,因为untextured area上的估计往往有比较大的ambiguity,比较分散的采样可以降低ambiguity。
自适应传播的具体实现
基于Deformable Convolution Networks的思想:简单的说就是在原来的基础上加上一个偏置offest,假设当前像素的坐标为(x,y),则其上方像素坐标为(x,y+1),传统的传播就直接使用这个坐标来传播,自适应传播则要加上一个偏置,即传播的像素不是(x,y+1)而是(x+offestx,y+offesty)。这些偏置是使用2D卷积从参考图中学习到的,每个像素都有其不同的偏置,通过这些偏置,窗口就不再限定于正方形了。
该2D卷积层的输入为reference feature,输出为每个像素p的K个neighbors的additional 2D offset,得到hypothesis临块集合D§。临块集合以所有像素的临块作为元素,每个元素包含三个部分,像素p坐标、固定offset(3×3,棋盘状的pattern)、additional 2D offset,以确定临块的位置。
实验结果如下:
2. Adaptive Evaluation
自适应评估模块执行以下步骤:单应转换、cost volume计算、自适应空间成本聚合(3Dregularization)和深度回归。
① Differentiable Warping
warping的公式如下,K是相机的内参矩阵,R是旋转,t是平移。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMhvVtDu-1655095360855)(https://note.youdao.com/yws/res/15144/WEBRESOURCEd9ae22de0cbc8784be02ef66d4aeb320)]
值得注意的是,此处只对每个像素的depth hypothesis(每个像素不同)进行单应转换,而不是对所有192个深度都转换,因此cost volume是不规则的。
② Matching Cost Computation
- 用group-wise correlation计算一对ref-src的相似度volume;
- 用pixel-wise view weight来聚合N-1个视图的volume。
相似性的计算公式如下图所示,i是视图索引,j是深度,C是通道数,F0是参考图的特征,Fi是视图的特征。公式的意思是将特征在通道维度上分成G组,然后点乘,每个组取均值,即类似于Groupwise correlation Net构建cost volume的方法。
计算完成后Si的维度为Si∈RW×H×D×GS_i \in R^{W \times H \times D \times G}Si∈RW×H×D×G`
③ Adaptive Spatial Cost Aggregation / 创新点
传统MVS算法通常在一个空间窗口上对cost信息进行聚合,这样做可以提升匹配的鲁棒性同时起到隐式平滑的作用。这个步骤在之前的learning-based方法中主要是通过3D CNN对cost volume进行正则来完成的。而在本文中,多尺度特征提取器已经从空间域的一个大感受野聚合了邻近信息,作者抛弃了繁重的3D CNN,手动对cost volume中的每个体素进行邻居信息聚合。作者采取的方式同Adaptive Propagation步骤类似,同样用了一个2D CNN来预测主视图特征每个像素位点上的offset。得到offset之后,对于cost volume在深度维度的每个cost map进行spatial cost aggregation,具体公式如下:
采用上述空间cost信息聚合的方式,一定程度上等价于对cost volume用3D CNN进行正则,训练完成之后offset的分布如下:
④ 深度预估
采用soft argmin方法。
Depth Map Refinement
我们发现将Patchmatch应用于尺寸[W/2, H/2]就足够了,然后再上采样到[W, H],而不需要对最细分辨率(stage 0)应用。最终深度图D的尺寸为[W, H]。
然后再利用原RGB图像对深度图进行优化(Refinement)。
基于MSG-Net,我们设计了一个深度残差网络。为了避免对某个深度比例产生偏差,我们将输入深度贴图预缩放到范围[0, 1]中,并在优化后将其转换回来。
我们的优化网络学习输出一个残差,将该残差添加到来自Patchmatch 估计上采样后的深度图D中,以获得优化的深度图Dref。该网络独立地从D和和I0(原图)中提取特征映射FD和FI,并对FD进行反卷积,以根据图像大小对特征图进行上采样。在两个特征图(深度图和原图像)的叠加上应用多个2D卷积层,以提供深度残差(depth residual)。
Loss Function
损失函数考虑了所有尺度深度估计中的损失,与相同分辨率的GT计算损失后再叠加:
此处应用平滑的L1 Loss,其中i, k指代Patchmatch在stage k(k = 1,2,3)的迭代次数i;Lref是最后优化深度图的损失。
附录
PatchMatch算法
论文:《PatchMatch: A Randomized Correspondence Algorithm for Structural Image Editing(2009)》
目的:PatchMatch算法可以在两张图片之间快速寻找对应的Patch/像素,以实现图像修复、图片融合、去水印等功能。
算法步骤
初始化、传播、搜索。
假设我们要找的是A蓝色块(patch)对应到B中的Patch。
初始化:对于A中的每个patch,都有B中的一个patch与之对应,它们之间的联系用“偏移量(offset)”表示。初始时,给A中每个patch都随机初始化一个offset到B中。
传播:对于A中的蓝色块,我们找出其邻块(红、绿块),再红、绿块的偏移量找出它们对应B中的红、绿虚线框patch。采用最高相似度(或最低匹配成本)原则,计算A蓝色块与B蓝、红、绿色块的相似度,如果与红色的相似度最高,则将采用红色块的偏移量(不是直接用红色块),由上图(b)可见蓝色块的新偏移量和红色块相同。(迭代次数为奇数则向上、左传播,为偶数则向下、右传播。)
搜索:以上一步中的A对应到B的新patch为中心,在某个半径为R的矩形搜索框范围内,随机查找几个框,计算与A蓝色块相似度,如果有更小的,就更新偏移量。然后以新的patch为中心,半径缩小一半,继续重复搜索更相似的patch,直至半径为1。
依据的思想
大数定律:随机初始化时,样本足够多的时候,部分样本会得到一个很好的初始化值。
图像的连续性:图像的某个区域与其邻域一般有很强的相关性,因此可以根据其邻域的匹配结果来更有针对性地快速搜索。
广义PatchMatch算法
论文:《The Generalized PatchMatch Correspondence Algorithm(2010)》
目的:改进patchmatch,使图像每个像素可以获得多个对应关系,也就是多个offest,在传播和随机搜索方面也做了一定的改进。
算法步骤
随机初始化:给图像中每一个像素随机初始化k个offset。
传播:k-patchmatch与patchmatch类似,只不过每一个邻域要计算k个匹配代价,然后选取最优值更新。需要注意的是,为避免出现重复,k-patchmatch构建了一个哈希表来快速识别已经在 k 列表中的候选,以防止重复条目。
随机搜索:在 k 个最近邻中的每一个周围进行随机搜索,取 n 个样本,总共得到 nk 个样本。 如果候选者的距离更好,则堆中最差的offest将被逐出。
其它改进: 这部分是在某些具体应用中使用的,所以没有加在算法步骤中。对于某些应用,例如对象检测、去噪或超分辨率,可能需要在一系列可能的旋转或尺度上匹配patch。在不失一般性的情况下,将图像 A 中的直立未缩放patch a 与图像 B 中围绕其中心旋转和缩放的patch b 进行比较。
【论文阅读】PatchmatchNet相关推荐
- 论文阅读工具ReadPaper
对于搞科研的同学们来说,看论文是要经历的第一关,尤其是要读好多篇论文的时候,更是着实令人头大. 这不,最近无意中发现了个在线论文阅读网站:readpaper.com,号称「论文阅读笔记神器,硕博科研学 ...
- 多目标跟踪:CVPR2019论文阅读
多目标跟踪:CVPR2019论文阅读 Robust Multi-Modality Multi-Object Tracking 论文链接:https://arxiv.org/abs/1909.03850 ...
- 快速人体姿态估计:CVPR2019论文阅读
快速人体姿态估计:CVPR2019论文阅读 Fast Human Pose Estimation 论文链接: http://openaccess.thecvf.com/content_CVPR_201 ...
- Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读
Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读 Action4D: Online Action Recognition in the Crowd and Clutter 论文链接 ...
- 深度学习点云语义分割:CVPR2019论文阅读
深度学习点云语义分割:CVPR2019论文阅读 Point Cloud Oversegmentation with Graph-Structured Deep Metric Learning 摘要 本 ...
- 3D目标检测论文阅读多角度解析
3D目标检测论文阅读多角度解析 一.前言 CNN(convolutional neural network)在目标检测中大放异彩,R-CNN系列,YOLO,SSD各类优秀的方法层出不穷在2D图像的目标 ...
- 3D目标检测论文阅读摘要
3D目标检测论文阅读摘要 2D Object Detection 的研究已经非常成熟了,代表作品有RPN系列的FasterRCNN,One Shot系列的YOLOv1-YOLOv3,这里推荐一个2D ...
- 目标检测——Faster R-CNN论文阅读
论文阅读--Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks 文章目录 论文阅读--Faste ...
- 【独家】深度学习论文阅读路线图
如果你是深度学习领域的一名新手,可能会遇到的第一个问题是"应该从哪篇论文开始读起呢?" 这里给出了深度学习论文阅读路线图! 路线图按照下面四个准则构建而成: 从提纲到细节 从经典到 ...
最新文章
- mac OS Sierra支持破解程序
- Vue中绑定值与字符串拼接以及结合三目表达式实现是否为空判定的使用
- java简单纸牌游戏_2020年最佳2人棋盘游戏:拼凑,Kingdomino等
- vue路由切换时内容组件的滚动条回到顶部
- c++ sleep函数_我们如何在C,C ++中控制/安排线程的执行?
- django上课笔记6-MVC,MTV架构-中间件-初识Form组件
- NUC1445 Euclid's Game【博弈】
- Android CountDownTimer示例
- Linux和win7双系统时间错误问题
- OOP之C#设计及其UML(反向工程)
- excel数据处理_如何用excel做仓库管理软件?这样做很好用,有权限和流程
- cocos2d-x中制作动画
- 解决java下载文件中文文件名乱码问题(ie,谷歌,火狐)
- 图书馆管理系统需求规格说明书
- HTML div表格排版,畅谈DIV排版和table排版的区别
- js学习笔记----JavaScript中DOM扩展的那些事
- JVM---数据存储和访问(类文件结构)
- Fast and Provably Good Seedings for k-Means阅读笔记
- el-table闪动问题
- 累涨超200%成华尔街新宠 Fastly借边缘云有望冲上“云”霄?
热门文章
- 英语时态:一般、否定疑问句、现表将来
- html页面边框的简单设置方法
- 用计算机看影碟是数字化过程,2012年上海市高中《信息科技》学业水平考试1-5(含答案)...
- python实例练习(15)搜索关键词自动提交
- left join和left semi join的联系和区别
- Android 炫酷进度条
- 用webgl绘制一个彩色旋转立方体
- php fpm 错误日志在哪,php fpm如何开启错误日志
- C\C ++语言 文件备份实验
- 腾讯云和阿里云,百度云,华为云服务器哪个的性能比较稳定,没有出现经常崩溃现象呢?