monodepth-pytorch代码实现学习笔记(二)
前言
接上一篇博文,本篇博文介绍3-5部分内容
三、模型建立
算法采用encoder-decoder实现深度估计,默认模型基础为resnet18。因此,我以resnet18为主,进行了模型分析。模型调用在‘utils.py’文件中的‘get_model’函数,而模型的实现为‘models_resnet.py’文件,代码内容较为简单,不需要过多注释。根据程序,绘制了各模块的结构图,如下所示:
1. Unet模型机构
2. conv模块
3. resblock_basic模块
4. resconv_basic模块
5. upconv模块
6. get_disp模块
上述内容是resnet18模型结构的分析框图,需要注意的是,模型的默认输入尺寸为(256, 512),这也是上述分析中采用的尺寸,模型的输出为4个尺度上的视差特征图,且视差特征图的均为2,即左图视差和右图视差。
四、loss函数
代码的loss函数是在‘loss.py’文件中实现的,在这个文件中,只定义了一个MonodepthLoss类,这个类中定义了所有需要用到的函数,从forward开始执行,调用各功能包,实现loss函数,最后返回总loss值。这部分代码可以参照论文中的公式进行阅读,实现的过程比较清晰,我也在程序中做了简单的标注,参考如下:
以上是loss的全部内容,如有问题,请批评指正。
五、main函数
基于以上各个模块的介绍,最后介绍一下主程序,即文件‘main_monodepth_pytorch.py’,训练和测试的执行入口就是这个文件中的main()函数:
具体执行过程,就是调用上几节中介绍的各个功能模块,最终实现模型的训练和测试。训练模式下,输入是训练数据集,输出是训练好的模型;测试模式下,输入是待测试的数据集和训练好的模型,结果为视差值,且保存为‘disparities.npy’和‘disparities_pp.npy’文件。注意这个程序中,最终的测试结果是视差,而且范围在(0, 1),而不是深度值,深度值的转换需要相机参数。具体程序可参照:
总结
这篇博文中程序的截图多了一些,但这不是简单的把程序贴出来,那样做其实没有意义。我是通过对代码的学习,把学习的所得在代码中注释出来,希望能够对大家有所帮助,如有问题也请大家批评指正,不胜感激。
代码原作者GitHub链接: https://github.com/OniroAI/MonoDepth-PyTorch