monodepth2复现心得

使用paddlepaddle复现monodepth2心得

前言

从刚开始接触monodepth2现在,已经过去将近两个月,几乎天天都泡在使用paddlepaddle复现monodepth2的工作里,但是由于其中各种各样的bug,直到今天才终于复现出了其中70%的内容,也就是利用立体视觉作为数据集,进行弹幕深度估计。

历程

前前后后共进行6次复现:
第一次:直接将原论文pytorch框架改为paddlepaddle框架
结果:失败
总结:虽然原理看的明白,但是好多paddle自身框架不太懂,论文也阅读的马马虎虎。不过通过这一次转换,加深了对paddle框架的理解,同时对原论文程序顺序有了较深认识。


第二次:先仔细阅读论文,在根据自己的理解实现其中一个个功能模块,最后将功能模块根据原论文的功能实现顺序组合到一起。
结果:失败
总结:尽管loss下降了,但是得到的却不是视差图和深度图,仅仅是和原图相似结构的图片。不过这一次转换加强了代码整体框架编写能力


第三次:对比自己写的功能模块和源代码的功能模块,将源代码部分功能模块替换到自己程序中。
结果:失败
总结:loss一直保持在极低水平,甚至最后下限溢出。😥不过这一次加强了部分功能模块的运行效率,提升了功能模块的编写水平。


第四次:寻找别人复现成功的进行运行,同时精简代码并加上注释。
结果:成功😀
总结:成功运行,恢复了一定信心。同时加上注释后便于后期更改和优化。


第五次:将代码进行进一步简化,并在成功运行的基础上开始将里面的功能模块替换为自己写的。
结果:先失败后成功😀
总结:成功运行,最关键的明确了很多之前代码编写出现的问题。


第六次:自己重新编写框架,但功能模块先用别人的。成功运行后,再将里面的功能模块替换为自己写的。
结果:先失败后成功😀
总结:成功运行,进一步明确了很多不阻碍运行但是阻碍复现效果的细节问题。

问题总结

1.原论文中在计算重构损失时,有这样一段代码:

# add random numbers to break ties
identity_reprojection_loss += paddle.randn(identity_reprojection_loss.shape) * 0.00001

这段代码似乎没有什么,但是如果不加上:

paddle.seed(seed)

就会导致每一次增加的随机矩阵都是不同的,造成loss无法下降,该道理也试用与一开始数据集设置中的随机进行图片强化和水平翻转。

2.源代码数据集中内参矩阵和外姿矩阵与官方kitti给出的不一致:

我一开始发现不光这两样不一样,连图片尺寸也不一样。我本以为线性变换后会一致,但是也不对。最关键的是不用源代码给的内参和外姿矩阵,也会造成loss不下降的现象。我感觉这之中应该有什么关系,但是一至没有找到,登github也登不上,没法向开发者提问,不知道有没有大神可以解答。😀

3.读取数据的方式影响loss收敛的效果:

这一块是一个最大也是最不容易发现的bug,如果不熟悉pillow、opencv以及paddle.to_tensor()、paddle.vision.transforms.to_tensor()区别的人很难发现。我是经过了之前6轮复现,并查找相关资料才明白的。
首先是pillow、opencv区别,这两者的区别不仅仅是一个是RGB,另一个是BGR这么简单,两个本身的数据格式也不同。具体细节参见这篇文章:opencv、matplotlib、Pillow读取图像的对比

paddle.to_tensor()与paddle.vision.transforms.to_tensor()的区别就更多。百度官方给的深度学习教程上直接使用paddle.to_tensor()将图片变成张量,图片在每个通道上的取值为0~255,但是源代码中使用的是paddle.vision.transforms.to_tensor(),官方api中对它的描述是:
在这里插入图片描述
换句话说,monodepth2训练的图片是归一化后的图片。在这里我做了一个小实验对比了几种输入图片的方式:

读取方式loss时是否下降收敛
直接用pillow读取,并用transforms.to_tensor()转化
直接用opencv读取,并用transforms.to_tensor()转化
直接用opencv读取,先转化为pillow格式,再用transforms.to_tensor()转化

同时,由于源代码中需要对原图片进行下降采样,在这基础上我也对比了一下:

采样方式loss下降速度
cv2.resize
paddle.nn.functional.interpolate适中
transforms.resize
resize (pillow,参数选Image.ANTIALIAS)

最后关于pillow和opencv,在源代码上有这样一行注释:

from PIL import Image  # using pillow-simd for increased speed

或许作者早已经知道了。最后我利用笔记本电脑,训练105组图片20轮,batch_size为2的情况下的图片结果为:
在这里插入图片描述
在这里插入图片描述
虽然不及源代码几十个G的大数据,但是这样的小批量数据在训练半小时后就能达到这样一个结果,节省了大量时间和物力,提高了验证效率。
附录1:
之前一直以为 resize (pillow,参数选Image.ANTIALIAS)和opencv的resize在图片放大上的区别仅仅是影响了下降速度,知道后期看了别人的博才发现原来resize (pillow,参数选Image.ANTIALIAS)在放大的同时进行了抗锯齿操作。图像处理之高质量缩放(抗锯齿)
附录2:
有人问过其他尺寸的图片可不可以用,我感觉,用是可以用,但是效果一般。如果一定要在其他尺寸上用的话可以在源程序中更改所有与图片W、H参数相关的参数和数据,例如K值、重构函数、解码器层等等。不过也要提一下monodepth2这篇文章,我似乎发现一个小问题,但凡图片中包含人、围栏、车这些物体时,会比较准,但是不包含,例如只有楼,山地等场景,没有人、树、车时,似乎效果就很不理想。
下图我用了其他尺寸的图片,同时把monodepth2编码器层由resnet18换为了mobilenetv1:
在这里插入图片描述
在这里插入图片描述

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
Monodepth2是一个使用基于单目图像的无监督学习法完成深度估计任务的模型。它使用了SFM(Structure from Motion)模型原理,在卷积神经网络中同时训练了深度网络和位姿网络。深度网络的输入是一段视频序列的连续多帧图片,输出对应的深度图像;位姿网络的输入是目标视图和上一帧视图,输出相机运动姿态的变化。通过构建重投影图像并计算重投影误差,Monodepth2使用损失函数来反向传播更新模型参数,优化训练网络模型。\[2\] 在代码阅读方面,Monodepth2的输入部分进行了颜色增强和翻转的数据增强操作。如果选择共享编码器(encoder),则所有帧都需要输入网络;否则,只有第0帧输入网络以获得深度图。输入网络的数据进行了四种尺度的变化,最初保留了5种尺度,包括原始尺度、设定尺度、设定尺度的1/2、1/4和1/8,然后删除了原始尺度。内参矩阵也进行了四种尺度的变化,用于图像重建计算。只有设定分辨率的输入被输入到编码器和深度解码器中,使用不同的输入输出通道数得到了四个分辨率的深度图。如果有深度地面真值(depth_gt),则也作为监督信号输入到网络中以加速损失函数的收敛。\[3\] #### 引用[.reference_title] - *1* *3* [深度估计自监督模型monodepth2论文总结和源码分析【理论部分】](https://blog.csdn.net/weixin_43148897/article/details/122453979)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [单目图像深度估计——Monodepth2](https://blog.csdn.net/weixin_46591090/article/details/125387893)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值