[深度学习]MonoDepth2实践笔记_单目深度估计(2)

                        monodepth2模型的测试

系列   双目/单目+雷达==训练  https://me.csdn.net/ltshan139https://blog.csdn.net/avideointerfaces/article/details/105647031

          基于无监督和自监督的深度学习算法模型有好几种,未来也会越来越多。我们这里主要介绍monodepth2。它是自监督;而它的前身monodepth是无监督。 个人觉得自监督和无监督本质差不多,叫法不同而已。它们原理大体上都是通过双目测距的一个摄像头,比如左摄像头所拍得的图片来学习到与之对应右摄像头图片,并生成视差图,然后再通过视差图又反推出左摄像头图片,并和Ground Truth的左图片形成delta。随着学习的迭代进行,这个delta会慢慢变小。 当然这个原理只是我目前的理解,其表述很粗糙,也不一定对,后续随着学习的深入会对原理部分进行补充和更正。

模型测试 Monodepth2的github地址如下:

https://github.com/nianticlabs/monodepth2

其对应的paper为《Digging into self-supervised monocular depth estimation.pdf》大家可自行下载。

该开源项目已经提供训练好的各个类型的模型,如下图红框所示。

[深度学习]MonoDepth2实践笔记_单目深度估计(2)_第1张图片

 

 

        大家可以按照自己的喜好下载好一个或数个模型,当然图片测距测试时只需要一个模型即可。 我这里下载了两个模型(mono_1024x320和stereo_1024x320),来分别对 图片进行测距。

         注意,下载后模型文件是zip格式,需要解压缩到同名的目录下面。因为monodepth包括了2个网络:unet和pose,前者是求深度图的,后者是求双目间姿态的,所以一般模型训练出来后,至少有2个pth。下面是mono_640*192所包含的pth文件:

[深度学习]MonoDepth2实践笔记_单目深度估计(2)_第2张图片

 

     有了模型后,就可以开始对于某张图片来测距了。其对应命令为:

python3 test_simple.py --image_path assets/test_image.jpg --model_name mono+stereo_640x192

 python test_simple.py --image_path assets/0000000005.png --model_name mono_no_pt_640x192

 python test_simple.py --image_path assets/test_image.jpg --model_name mono+stereo_640x192

 

test_simple.py,非常简单的一个python测试脚本,其后面带两个参数,第一个为待测距的图片,“asserts/test_image.jpg”为测试图片的路径和名称,大家可以根据自己应用来进行更改;第二个为模型,如果你下载的是mono_1024x320,那么后面的模型名字就应该由"mono+stereo_640x192“改为”mono_1024x320“。 当然,为了能找到模型文件,还必须该项目根目录下面创建models子目录,然后把前面下载并已经解压缩的模型目录置于其下面。

原始图片如下:

[深度学习]MonoDepth2实践笔记_单目深度估计(2)_第3张图片

彩色化后的深度图如下所示:

[深度学习]MonoDepth2实践笔记_单目深度估计(2)_第4张图片

monodepth2的三种训练方式

根据github上的readme,单目训练时推荐用的是eigen_zhou,双目用的是eigen_full。  

[深度学习]MonoDepth2实践笔记_单目深度估计(2)_第5张图片

下面分别对这三种训练模式进行较详细解释 :

1)单目训练

       monocular是单目的意思,而双目的英文则是binocular。现在基于深度学习方法对单目图像重构出三维世界非常流行。我个人觉得这里面的基础理论是SFM(structure From Motion)。直白讲,它是依靠运动视频的图像帧序列来进行三维重建。其优势很明显,只需要一个摄像头即可,当然前提条件则是,需要摄像头本身动起来,拍一段视频流。

       在monodepth2的单目模型训练中,它缺省需要一个参数--frames_ids 0 -1 1。0代表当前输入的样本图片,-1则代表当前帧在这个视频系列中的上一帧,1则代表下一帧。

2)立体训练

       stereo字面意思为立体,这里更准确的含意则为双目。有两个重要参数:--frame_ids 0和--use_stereo。前者意味着不需要对当前输入帧来找上下帧了;后者意味要对当前帧来找它的另外一帧,比如当前帧为左摄像头拍摄得到的帧,那么其对应的另外一帧则为右摄像头的。

        这种模型比较适合带双目摄像头,且设备固定在某一个位置上。

3)单目+立体训练

      这种方法是前面两种的组合,适用于有双目摄像头,且是运动的场景。 由于它是前两种的综合体,所以训练速度会比较慢。

结论

       刚接触这个模型的同学可能会好奇到底哪种训练方式得到的模型更准确。其实从paper看,作者并没有做出优劣的比较(他觉得都挺好),反过来着重提供了针对不同场景的三种训练方式,合适的就是最好的。 

python ./train.py --model_name M_640x192 --load_weights_folder /home/ubuntu/monodepth2/monodepth2-master/models/mono+stereo_640x192  --num_epochs 15 --learning_rate 1e-5

python ./train.py --model_name M_640x192 --load_weights_folder /home/ubuntu/tmp/M_640x192/models/weights_14  --num_epochs 15 --learning_rate 1e-5

**Custom dataset**

You can train on a custom monocular or stereo dataset by writing a new dataloader class which inherits from `MonoDataset` – see the `KITTIDataset` class in `datasets/kitti_dataset.py` for an example.

e -L 2

└── 2011_09_26

    ├── 2011_09_26_drive_0022_sync

    ├── 2011_09_26_drive_0084_sync

    ├── 2011_09_26_drive_0091_sync

    └── 2011_09_26_drive_0093_sync

我们的数据:

data_image_gg2-->yizhuangkc

python train.py --model_name M_640x192inum_epochs

/home/ubuntu/monodepth2/monodepth2-master/kitti_data/yizhuangkc/data_imge/image_02/data

/home/ubuntu/monodepth2/monodepth2-master/kitti_data/yizhuangkc/data_image/image_02/data

 

resize
相机内参fx fy cx cy都要乘尺度因子k

·  crop
首先图像crop不改变焦距fx fy,但是相机主点cx cy会改变

[深度学习]MonoDepth2实践笔记_单目深度估计(2)_第6张图片

scale_factor

self.parser.add_argument("--pred_depth_scale_factor",
                         help="if set multiplies predictions by this number",
                         type=float,
                         default=1)

你可能感兴趣的:(计算机视觉,图像处理,深度学习,深度学习,运动估计)