本文详细介绍monodepth2模型在自己数据集的实战方法,包括单卡/多卡训练、推理、Onnx转换和量化评估等,关于理论部分请参见另一篇博客:深度估计自监督模型monodepth2论文总结和源码分析
一、训练过程:
(一)训练过程:
1.数据集准备:一个是要有连续帧数据(前后帧图片编号相差1)1-3W张左右,相机内参矩阵,还有可选的左右视图数据和点云代表的深度真值。
2.按照源码KITTI数据集格式生成train_files.txt和val_files.txt
3.继承MonoDataset类编写自己的数据类,主要内容是设置内参、分辨率、数据读取等
4.把option.py的dataset和split参数设置为自己的数据类,然后在trainer.py中对应到自己数据集的地址
都准备好以后直接指定模型类型就可以训练了,命令为python train.py --model_name 训练开始时,会在trainer类中初始化所有网络、data_loader,然后调用train()函数分batch训练。
(二)多卡训练:
源码只有单卡训练代码,想要实现多卡训练可以用torch.nn.parallel.DistributedDataParallel(DDP)进行改造,但比较繁琐,一是因为整个模型由四个子网络拼接而成,需要一个个设置,二是源码中很多tensor的第一维都默认为batch_size,多卡情况下假如最后一个batch的数量不足一个batch_size,这个维度的大小会报错,需要手动改成可配置的大小。
步骤主要包括:
1.参数设置和初始化,可用torch.multiprocessing.spawn开启多进程,使用cuda号作为进程编号
dist.init_process_group("nccl", rank=rank, world_size=world_size)
if opts.ddp:
world_size = opts.world_size
torch.multiprocessing.spawn(main_worker,
args=(world_size,),
nprocs=world_size,
join=True)
2.把每个子网络都用DistributedDataParallel包装起来,