Anytime Stereo Image Depth Estimation on Mobile Devices阅读与复现笔记(1)

最近对深度学习相关的视差求解方法比较感兴趣,并主要对这篇来自ICRA2019的文章进行了阅读和仿真。我习惯带着敬畏的心学习自己不会的知识,还请大佬们轻喷。

AnyNet与PSMNet的视差计算结果比较

对于相同的计算场景,第一幅图是AnyNet计算的结果,第二张是PSMNet的结果,我们能够发现明显的速度区别。AnyNet能够在运算速度和视差计算精度之间做出权衡,并且在需要的时候直接给出当前最优的视差估计。我看到这个速度的时候是很惊讶的,所以很想复现并加以研究。
在这里插入图片描述
在这里插入图片描述

论文内容

特点总结

AnyNet最主要的特点在于对于视差的计算是分stage进行的。stage1到stage3对应的分辨率分别是输入图片的(1/16,1/8,1/4)。并且为了节省计算量,只在stage1对视差图进行全面的估计,在后续的stage中只估计视差的残差。这样做的原因是:视差估计的计算量随着图片的分辨率增加呈现立体式的增长,且随着视差搜索范围的增加线性增加。在第一个stage尽情全面的估计,能够很容易快速获得初始视差图,后续的stage通过对上一个输出的视差图上采样并且对残差进行估计就可以了,计算量也不会太大。

  1. 特征提取:使用U-Net提取特征,获取图片在不同分辨率下的特征图
  2. 视差网络:使用distance作为视差的cost volume,并且用每个视差对应的cost volume作为视差的权重,计算平均值后作为该点的视差估计值。(这样做的原因是,有时候在整个视差搜索范围中计算出的cost volume 没有较强的区分性,从而导致如果直接取cost volume最小的视差,会导致较大的误差)cost volume 定义如下: C i , j , k = ∣ ∣ P i , j L − P i , j − k R ∣ ∣ C_{i,j,k}=||P_{i,j}^L-P_{i,j-k}^R|| Ci,j,k=Pi,jLPi,jkR, C i , j ^ = ∑ k = 0 M k e x p ( − C i , j , k ) ∑ k ′ = 0 M e x p ( − C i , j , k ′ ) \hat{C_{i,j}}=\sum_{k=0}^M{k\frac{exp(-C_{i,j,k})}{\sum_{k'=0}^M{exp(-C_{i,j,k'})}}} Ci,j^=k=0Mkk=0Mexp(Ci,j,k)exp(Ci,j,k)其中 P i , j L P_{i,j}^L Pi,jL表示左像素, P i , j R P_{i,j}^R Pi,jR表示右像素, C i , j , k C_{i,j,k} Ci,j,k表示视差为 k k k时的cost volume。
  3. 残差预测:残差预测也是在视差网络中完成的,主要区别是stage2及其以后的视差估计使用的残差估计。残差估计时,视差搜索范围可以只设置为5(-2,-1,0,1,2),获得的残差与up-scale的视差相加即可得到当前的stage的视差。残差预测的方式:通过当前的视差图对右图进行修正,如果视差图完全正确的话,左右图应该一致,但是由于误差的存在,修正后的右图依旧与左图不相等。通过对两图的残差进行计算,得到一个残差视差,最终将该残差图与上采样的视差图相加即可获得本层的输出视差图。残差估计时 C i , j , k = ∣ ∣ P i , j − P i , j − k + 2 ∣ ∣ C_{i,j,k}=||P_{i,j}-P_{i,j-k+2}|| Ci,j,k=Pi,jPi,jk+2说实话,这个公式,我还不是很理解+2是为啥,欢迎小伙伴告知。
  4. SPNet:用于修正stage3输出的视差图,据说是很好地再次提高精度且计算地代价也较小

观点验证

作者用两种具有说服力地方式验证了AnyNet的优势:

  1. 首先是从性能上与当前主流的网络SPMNet、StereoNet网络以及经典的视差匹配算法GM、SGBM算法比较,结果显示AnyNet在时间一致的情况下具有较高的精确度,而在时间不设约束的情况下,获得的视差图仍然具有竞争力。从这一点上证明了AnyNet的性能优势,以下两图表示在无时间限制以及有限制时间的比较结果。在这里插入图片描述在这里插入图片描述

  2. 然后证明AnyNet的结构的合理性。作者分别从特征提取、视差网络、代价函数三个方面进行控制变量法的比较。特征提取,将U-Net替换成三个无共享权值的卷积网络;视差残差计算:将残差计算替换成直接预测视差进行比较;代价函数:将基于distance的代价函数替换成与PSMNet相同的代价函数。比较结果如图:在这里插入图片描述

复现步骤

复现平台是Windows,需要注意以下内容

  1. 修改文件路径:根据自己的数据路径对代码中相应位置进行修改
  2. 如果电脑没有GPU需要将GPU相关的代码注释、修改
  3. 数据可视化:test时对视差图进行可视化,可视化主要参考了这位博主

作者的复现指南

  1. 训练spn网络(用于后续AnyNet的使用):cd model/spn_t1 bash make.sh
  2. 用Scene Flow 预训练AnyNet:python main.py --maxdisp 192 --with_spn
  3. 使用KITTI2015对AnyNet进行微调:python finetune.py --maxdisp 192 --with_spn --datapath path-to-kitti2015/training/

对于步骤2,Scene Flow数据集很大很大,所以作者提供了他们预训练好的模型
有了预训练的模型就可以对现有的KITTI2015(or2012)进行模型测试了

python finetune.py --maxdisp 192 --with_spn --datapath path-to-kitti2012/training/ 
   --save_path results/kitti2012 --datatype 2012 --pretrained checkpoint/kitti2012_ck/checkpoint.tar 
   --split_file checkpoint/kitti2012_ck/split.txt --evaluate
python finetune.py --maxdisp 192 --with_spn --datapath path-to-kitti2015/training/ 
    --save_path results/kitti2015 --datatype 2015 --pretrained checkpoint/kitti2015_ck/checkpoint.tar 
    --split_file checkpoint/kitti2015_ck/split.txt --evaluate

用KITTI2015对Scene Flow与训练的模型进攻微调

python finetune.py --maxdisp 192 --with_spn --datapath path-to-kitti2015/training/   --pretrained checkpoint/sceneflow/sceneflow.tar

使用KITTI2012同理。

使用KITTI数据集进行微调时,数据的存放格式保持原样即可

我复现的步骤

  1. 代码下载
  2. 数据集下载
  3. 预训练模型下载
  4. 使用KITTI2015数据集对预训练模型微调(没有使用spn)
    复现结果:
    输入:
    在这里插入图片描述
    在这里插入图片描述
    剪切视野获得主要是车和路标,随着训练的进行获得如下的视差图
    70epoch:
    在这里插入图片描述
    200epoch:
    在这里插入图片描述
    300 epoch:
    在这里插入图片描述
    个人认为现在没有spn的基础上获得的结果“顿顿”的,没有作者再文章中呈现的好,但是视差图基本能够呈现出目标的特征。

后续学习代码,包括神经网络的基本函数,期待能够理清该文章的整体脉络。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值