monodepth-pytorch代码实现学习笔记(一)

monodepth-pytorch代码实现学习笔记(一)

    • 前言
    • 一、前期准备
      • 1. 数据集
      • 2. 训练与测试
    • 二、数据预处理
      • 1. data_loader.py
        • 1.1 __init__(self,root_dir,mode,transform=None)函数
        • 1.2 __len__(self)函数
        • 1.3 __getitem__(self,idx)
      • 2. transforms.py
        • 2.1 图像增广函数:
        • 2.2 5个类:
      • 3. utils.py
    • 总结

前言

大家好!好久没有更新博文,主要是因为事情太多(就是懒)。最近在做基于深度学习的图像测距的项目,由于监督学习需要大量的标注数据集,工作量大,成本高,我主要研究无监督的图像测距方法,重点研究了“Unsupervised Monocular Depth Estimation with Left-Right Consistency”文章的算法。

具体的原理这里就不赘述了,CSDN上面比较容易找到,想看的同学可以参考https://blog.csdn.net/bofu_sun/article/details/89206531,个人觉得写得很好。博主除了原理的讲解外,还详细分析了源代码的实现过程。源代码是基于tf实现的,由于本人常用的是pytorch,就详细的学习了一下monodepth-pytorch版本的代码(链接在这里:https://github.com/OniroAI/MonoDepth-PyTorch)。目前已经用自己的数据集成功实现训练和测试。为了给以后的自己一个参考,准备将这段时间的学习过程记录于此,也希望能够吸引到志同道合的小伙伴一起在学海无涯苦作舟。

废话了一堆,现在进入主题,本系列博文主要分为5个部分进行阐述:

  1. 前期准备
  2. 数据预处理
  3. 模型建立
  4. loss函数
  5. main函数

一、前期准备

在进行代码分析之前,需要先将代码运行起来。原模型采用KITTI数据集进行训练,但该数据集过于庞大,而且与本人所做方向相关性小,因此,此处采用自己的数据集进行训练测试。

在运行代码之前,需要了解程序整体架构,并且按照工程格式完成各部分的准备工作,如数据集存放位置,预训练模型下载并存储等。

1. 数据集

该模型的数据集载入程序的编写采用标准KITTI数据集的存放格式,因此将自己数据集按照KITTI数据集的格式进行存放,双目摄像头所采集的同一图像的左图和右图分别存放至“image_02/data”和“image_03/data”文件夹下,具体格式参考如下:

The folder contains subfolders with following folders “image_02/data” for left images and “image_03/data” for right images. Such structure is default for KITTI dataset

data
├── kitti
│ ├── 2011_09_26_drive_0001_sync
│ │ ├── image_02
│ │ │ ├─ data
│ │ │ │ ├── 0000000000.png
│ │ │ │ └── …
│ │ ├── image_03
│ │ │ ├── data
│ │ │ │ ├── 0000000000.png
│ │ │ │ └── …
│ ├── …
├── models
├── output
├── test
│ ├── left
│ │ ├── test_1.jpg
│ │ └── …

2. 训练与测试

训练(train)和测试(test)程序作者写到了一个.py文件中,即“mian_monodepth_pytorch.py”,同时作者也给出了jupyter的训练与测试调试程序“Monodepth.ipynb”。在本篇博文中,主要以“mian_monodepth_pytorch.py”分析为主。若想直接采用作者训练好的模型进行测试,需要下载.pth格式的weights数据,作者提供了下载地址:
https://my.pcloud.com/publink/show?code=XZb5r97ZD7HDDlc237BMjoCbWJVYMm0FLKcy

上述模型训练参数为:

model: ‘resnet18_md’
epochs: 200,
learning_rate: 1e-4,
batch_size: 8,
adjust_lr: True,
do_augmentation: True

Monodepth-Pytorch代码结构比较清晰,根据上述要求配置好相关数据和文件即可运行(前提是运行环境已经搭建完成),后续笔记将详细记录各个模块原理及实现。

原Github链接:https://github.com/OniroAI/MonoDepth-PyTorch

二、数据预处理

程序运行的第一步是载入训练图像数据,在数据进入模型参与运算前,需要对其进行预处理。算法中实现图像载入功能的文件为“data_loader.py”,文件中的KittiLoader类用于实现数据的读取和载入,在实现具体功能的过程中,该类还调用了其他的一些功能子类,具体代码在文件“utils.py”和“transfroms.py”中。

1. data_loader.py

这个文件中是KittiLoader(Dataset)的定义。class KittiLoader(Dataset)中包含3个成员函数:“init(self,root_dir,mode,transform=None)”,“len(self)”和“getitem(self,idx)”,下面分别进行介绍:

1.1 init(self,root_dir,mode,transform=None)函数

这个函数是KittiLoader类的初始化函数,共有3个参数,分别是:
(1)root_dir:图像存储根目录,这个参数需要用户手动输入且没有默认值,这个 目录是“image02/data”和“image03/data”的上一级目录
(2)mode:模式选择,train or test
(3)transform:图像增广函数,python中一切皆是对象,此处传入transform函数,该函数的具体实现在“transforms.py”中,稍后详细介绍。
初始化函数的主要作用是获得所有图像文件路径,并按照升序排序,同时载入图像增广类和程序运行模式。具体实现方式请参照:

monodepth-pytorch代码实现学习笔记(一)_第1张图片

1.2 len(self)函数

这个函数功能比较简单,获得图像数量。

1.3 getitem(self,idx)

这个函数是按照图像路径读取图像,若mode为train,则读取一对左、右图图像,存储到sample中,若有载入transform,则进行增广处理,增广后存储到sample;若mode为test,则读取左图图像,存储到left_image中,若有载入transform,则进行增广处理,增广后存储到left_image。具体实现请参照:

monodepth-pytorch代码实现学习笔记(一)_第2张图片

2. transforms.py

2.1 图像增广函数:

image_transforms(mode=‘train’,augment_parameters=[0.8,1.2,0.5,2.0,0.8,1.2],do_augmentation=True,transformations=None,size=(256,512))
这个函数返回的是图像增广器,当被载入KittiLoader中时,对KittiLoader的图像数据进行增广操作,返回增广后数据。下面介绍一下各个参数的含义:

(1)mode:
设定train or test模式,不同模式下数据增广操作不同,具体后面介绍,默认为train模式。

(2)augment_parameters:
图像增强参数,包括对比度,亮度,颜色增强,参数格式为[gamma_low, gamma_high, brightness_low, brightness_high, color_low, color_high], 默认值:[0.8,1.2,0.5,2.0,0.8,1.2]

(3)do_augmentation:
是否进行图像增强(对比度,亮度,颜色),默认为True

(4)transformations:
用户自己定义的图像增广操作,默认为None

(5)size:
Resize的尺寸,默认为(256,512)

函数具体实现请参考:

monodepth-pytorch代码实现学习笔记(一)_第3张图片monodepth-pytorch代码实现学习笔记(一)_第4张图片

2.2 5个类:

在2.1小节中图像增广函数的实现主要靠调用了各种增广方法的类来完成,这一小节主要介绍类的实现。图像增广所用到的5各类中,均采用了“call”函数,因此图像增广函数可以像条用函数一样来使用类。下面按照增广函数中的调用顺序进行介绍:

(1)class ResizeImage(object):

monodepth-pytorch代码实现学习笔记(一)_第5张图片
(2)class RandomFlip(object):

monodepth-pytorch代码实现学习笔记(一)_第6张图片
(3)class ToTensor(object):

monodepth-pytorch代码实现学习笔记(一)_第7张图片
(4)class AugmentImagePair(object):

monodepth-pytorch代码实现学习笔记(一)_第8张图片monodepth-pytorch代码实现学习笔记(一)_第9张图片monodepth-pytorch代码实现学习笔记(一)_第10张图片
(5)class DoTest(object):

monodepth-pytorch代码实现学习笔记(一)_第11张图片

3. utils.py

上述部分分别介绍了KittiLoader类和图像增广相关函数,而“mian_monodepth_pytorch.py”文件中的训练和测试主程序是通过调用“prepare_dataloader”函数完成数据载入的。“prepare_dataloader”函数的具体实现又是通过调用KittiLoader类和图像增广相关函数实现数据的载入。这部分内容将介绍“utils.py”文件中“prepare_dataloader”函数的具体实现过程。

有了KittiLoader类和图像增广相关函数的基础,“prepare_dataloader”函数的实现就不难理解了,函数返回了数据集图像数量和pytorch格式的loader,具体实现如下:

monodepth-pytorch代码实现学习笔记(一)_第12张图片
monodepth-pytorch代码实现学习笔记(一)_第13张图片
monodepth-pytorch代码实现学习笔记(一)_第14张图片
以上是数据预处理的相关内容,数据通过loader送入模型进行训练。

总结

这篇博文就先介绍前2部分,后续部分会尽快更新。请各位大佬批评指正。如有违规请及时告知,我会尽快修改。

代码原作者GitHub链接: https://github.com/OniroAI/MonoDepth-PyTorch

你可能感兴趣的:(monodepth-pytorch代码实现学习笔记(一))