点击上方“3D视觉工坊”,选择“星标”
干货第一时间送达
作者:路痴走不出户部巷 | 来源:知乎
https://zhuanlan.zhihu.com/p/111192056
本文仅做学术分享,如有侵权,请联系删除。
论文地址:arxiv.org/pdf/1901.0257
github: github.com/NVlabs/neura
1. Introduction
这篇论文断断续续地研读以及代码重构了很久,做一个总结(保姆级详解).
首先这篇工作的基本insight,提出这样一个观点,基于Deep Learning的深度估计的方法,应该估计的是每个像素点的深度值的概率分布,而不是某个确定的值. 接着,可以通过Bayesian等方法,随时间整合优化这些概率,以减少深度估计的不确定性并提高准确率.
论文的两个关键点:
对于每个像素点,估计它深度的概率分布DPV( Depth Probabilty Distribution ). DPV事实上提供了深度的最大似然估计和相对应的不确定性测量;
连续帧的DPV随着时间聚合优化,减少不确定性;
2. Network
整体pipeline:
网络共分为三个部分,每个部分分工明确:
1. D-Net: Estimating DPV
顾名思义,这个子网络的作用是用来估计条件DPV. DPV(Depth Probabilty Volume), 即的具体含义就是,像素点的深度值为的概率,在我们预先设定的深度范围之内. 输入是连续的局部视频帧(连续5帧),其中中间的一帧叫作参考帧(ref_frame), 其余四帧叫作源帧(src_frames). 在进行常规的特征提取操作后,得到这一组输入数据的feature, 通过各个src_frame到ref_frame的pose和在预设深度范围内的candidate_depth, 将源帧的feature都warp到参考帧. 换个说法,就是利用已知的pose,得到各个src_features在不同candidate_depth下warp到ref_view的features. 那么,这些warp得到的features再与本来的ref_feature进行L1或者L2的距离计算,并经过softmax函数则可以得到我们需要的cost volume, 这个cost volume是整个网络的隐状态.(这里的costV是一个[BS, D, H, W]的tensor,通俗一点的物理含义就是,在H×W的特征图上,每个像素点的深度值为d的概率,d是将预设的深度范围均分成D等份得到的各个candidate depth).
这部分可以表示为:
2. K-Net: Integratimg DPV over time
这个子网络的作用是将估计出的DPV随着时间聚合起来,以较少深度估计的不确定性.D-Net的输出代表条件概率分布,表示在已知第1-t帧的costV下,第t帧的cost volume.利用朴素贝叶斯定理,将当前帧t的DPV warp到下一帧(t+1)去,得到第t+1帧的DPV(相当于在已知1-t帧的DPV的情况下预测得到的第t+1帧的DPV),那么,同时还可以通过D-Net得到t+1帧的DPV(当有新的输入时).此时就可以更新得到在已知观测的情况下,第t+1帧的DPV.
做一个简单变形,式子(6)转化成:
但是利用贝叶斯定理存在一个问题,在预下一帧DPV的过程中,有用的和错误的信息都会被使用到.比方说出现遮挡时,遮挡边缘处的深度发生突变,直接使用贝叶斯定理会将这些错误的信息传递到下一帧去. 针对这个问题,最简单直接的做法是较少预测值的权重,但是在减少错误信息传播的同事也阻止了正确信息的更新.因此,采用了K-Net来学习预测的DPV和观测的DPV之间的残差. 当残差较小时,DPV几乎不更新,当有深度突变时,残差值很大,此时会被K-Net纠正. 通过这种方式,就实现了自适应改变DPV权重.
需要注意的是(也是个人看代码觉得很不好理解的一点),对与一个视频序列来说,只有第二个以及以后的局部小窗口才有这一步,而第一个小窗口,不存在上一帧预测得到的DPV. 也就是说,在K-Net中,t一定是>=2的(假设下标从1开始). 换句话说,在这个部分中得到的第t帧的DPV,不仅包含了实际的输入,还包含了第t-1帧对第t帧的DPV的预测.
3. R-Net: Upsample & Refine
这部分的功能比较简单,就是将经过feature_extrator后,分辨率变小的costV上采样回输入数据的分辨率率大小, 同时用3D conv进行refine.
4. LOSS
最终使用的是Negative Log-Likelihood(NLL) loss, 用网络输出的DPV与实际的depth进行比较. 看论文中,loss包含四项,分别是:
(1) D-Net输出的第t帧的DPV,与第t帧的gt_depth (1/4 resolution);
(2) D-Net的DPV经过R-Net refine后,与第t帧的gt_depth (input resolution);
(3) 经过K-Net的优化后得到的DPV,与第t帧的gt_depth (1/4 resolution) (t>=2);
(4) 经过K-Net的优化后得到的DPV, 再经过R-Net的refine,与第t帧的gt_depth (input resolution) (t>=2
3. Experiment
最后亮一下在KITTI数据集上的测试结果,请教过原作者,这是在1-60m范围内的结果.
最后的最后,经过一段时间的积极复现,终于把这份开源代码简化整理出来了!
推荐阅读:
重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近1000+星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、可答疑解惑、助你高效解决问题