作者:泡椒味的口香糖 | 来源:3D视觉工坊
在公众号「3D视觉工坊」后台,回复「原论文」可获取论文pdf和代码链接。
添加微信:dddvisiona,备注:三维重建,拉你入群。文末附行业细分群。
0. 笔者个人体会
扩散模型这两年在图像/视频的生成、编辑、恢复,还有文本驱动上应用越来越多,以Stable Diffusion为代表的AI绘画更是火出天际。
那么扩散模型能不能扩展到其他领域呢?最近,NeurlPS 2023的一篇文章就探索了扩散模型在光流估计和单目深度估计方向的应用,而且效果非常好。整篇文章其实没有提出什么新架构或新方法,但是得出了一个很重要的结论:"即便不使用光流和深度估计的专用架构和损失函数,只使用一个简单的扩散模型也可以取得很好的效果"。个人感觉这篇文章的最大意义在于促进多模态融合,比如扩散模型是不是也可以用在其他任务上?不同领域的模型和损失函数是不是可以交换?这种思考是很有意思的。这里也推荐「3D视觉工坊」新课程基于深度学习的三维重建MVSNet系列 [论文+源码+应用+科研]
1. 效果展示
先来看看模型的具体效果,也就是文章所提的扩散模型对光流和深度估计的价值。
这篇文章提出的模型DDVM,对于高反射表面、半透明、动态物体这些挑战性场景的光流和深度估计格外好使。
这篇文章还提出了一个由粗到精的优化策略(主要是为了加速),优化后的结果在细节和模糊区域效果更好。
效果很好,不幸的是文章并没有开源,但是这种思想很有借鉴意义。
2. 摘要
去噪扩散概率模型以其令人印象深刻的保真度和多样性改变了图像生成。我们表明,它们在估计光流和单目深度方面也很出色,令人惊讶的是,没有针对这些任务的特定任务架构和损失函数。与传统的基于回归的方法的点估计相比,扩散模型还能够进行蒙特卡罗推断,例如,光流和深度的不确定性和模糊性。通过自监督的预训练、用于监督训练的合成和真实数据的组合使用、用于处理有噪声的不完整训练数据的技术创新(填充和逐步展开去噪扩散训练)以及简单形式的由粗到细的细化,可以训练用于深度和光流估计的最新扩散模型。大量的实验集中在相对于基准的定量性能、消融、模型捕捉不确定性和多模态的能力,以及估算缺失值。我们的模型DDVM(去噪扩散视觉模型)在室内NYU基准上获得了0.074的最先进的相对深度误差,在KITTI光流基准上获得了3.26%的Fl-all异常率,比最好的公开方法好大约25%。这里也推荐「3D视觉工坊」新课程基于深度学习的三维重建MVSNet系列 [论文+源码+应用+科研]。
3. 算法解析
还是先解释一下什么是扩散模型。
扩散模型也是一种生成模型,包括两个过程:前向过程(扩散过程)和反向过程。扩散过程是不停对图像添加高斯噪声,直至图像完全变成随机噪音。相对的,反向过程就是去噪,如果知道反向过程的每一步的真实分布,逐渐去噪就能生成一个真实的样本,所以反向过程也就是生成数据的过程。扩散模型就相当于把VAE的向量编码过程改变为添加噪声,把VAE的解码变为去噪。因此,扩散模型既不会涉及GAN中复杂的对抗训练,又比VAE更强大一点。
传统的光流估计和单目深度估计网络有什么问题?
模型本身是没有问题的,但是整个网络和损失函数的设计过程,需要涉及到这两个方向的大量特定架构。比如现在自监督单目深度估计的框架基本就固定,就是pose网络+depth网络的组合。
有没有一种简单且通用的模型来替代呢?
这也是这篇文章的核心思想,不针对光流和单目深度估计设计任何特定架构,而是使用一个简单且通用的模型直接完成两个任务!
具体是怎么实现的呢?
整个扩散模型(DDVM)的输入是目标图像的噪声版本(深度+光流)以及调节信号(一个RGB图像用于深度,两个RGB图像用于光流)。在给定RGB图像、噪声标签和时间步长的情况下,训练MLP来模拟噪声的条件分布。而且,可以在训练期间选择性地展开去噪步骤(停止梯度),以弥补yt的训练和推理之间的分布差距。
既然没有使用两个任务的专用框架,那么训练数据的选择就变得至关重要。对于光流和深度估计这种稠密估计任务来说,带真值的数据很少,因此作者使用了大量的合成数据集。
对于光流任务来说,作者本来只使用了AutoFlow这个一个合成数据集。但因为扩散模型自身的表征能力很大程度上分给的光流的形状估计,而不是求解对应关系。因此,仅在AutoFlow上训练模型远远不够。因此,作者还使用了FlyingThings3D(FT)、Kubric(KU)、TartanAir(TA)这三个数据集。
对于深度估计任务来说,分成室内和室外两个模型分别训练。室内模型在ScanNet和SceneNet RGB-D混合数据集上训练,室外模型在Waymo开放数据集上训练。
最后,由于直接训练高分辨率模型很慢,并且需要占用大量显存。因此DDVM还提出了一个Coarse-to-fine的优化策略,也就是先粗略估计光流场,然后分patch进行细化。
整个方法的pipeline其实没有太多可以谈的点,更多的是这种跨模态融合的思想!
4. 实验结果
去噪模型的backbone直接使用了预训练的Efficient UNet网络。注意,由于扩散模型的输入输出是[-1,1],因此还需要对深度和光流进行归一化。对深度估计实验来说,是现在Waymo预训练,然后在NYU v2上进行验证。对于光流估计实验来说,是在KITTI和Sintel上进行zero-shot泛化。评估指标就还是光流和深度估计的通用指标。
实验结果,先看深度估计,在NYU v2上实现了0.074的SOTA绝对相对误差,这个效果非常好。
光流估计也是,取得了SOTA效果。为了公平比较,还在AF+FT+KU+TA这个混合数据集上重新训练了RAFT模型。
DDVM还在AutoFlow、FlyingThings、HD1K、KITTI、Sintel、VIPER这几个数据集上进行了微调。在Sintel和KITTI上与SOTA光流方法对比,DDVM明显优于所有现有的光流方法(甚至包括使用双目输入的场景流方法)。DDVM实现了一个3.26%的Fl-all。
由粗到精训练策略的效果对比,极大地改善了估计的光流场的细粒度。
最后这个实验很有意思,验证所提模型的深度估计和深度补全(不是空洞补全)的效果。首先使用一个文本-图像模型生成卧室图像,使用DDVM估计深度并采样,将点投影到3D点云中。然后移动相机,从这个点云中迭代地渲染图像和深度图(有洞),并填补图像空洞(还是使用一个现有的图像修复模型),最后使用DDVM来计算缺失的深度并进行投影。感觉这个实验很好验证了两次深度估计的一致性,因为很多模型两次投影的结果要么尺度不一致,要么非常不连续。这里也推荐「3D视觉工坊」新课程基于深度学习的三维重建MVSNet系列 [论文+源码+应用+科研]。
5. 总结
今天分享的这篇文章介绍了扩散模型在光流估计和单目深度估计的应用,很有意思的是这篇文章直接使用了最简单的扩散模型,没有针对两个任务设计特定的架构或损失函数,最后效果也非常好。个人认为这篇文章最大的意义在于,提出了扩散模型可能是稠密视觉任务的一个简单且通用的框架。将扩散模型进一步扩展到其他任务,应该也是一个可以尝试的方向。