struct2depth数据预处理、训练及遇到的问题

前言

struct2depth是一种从单目视频中无监督地学习深度和自我运动(ego-motion)的方法,通过对3D物体运动进行建模、在线优化(on-line refinement)和通过新颖的损失函数来提高运动物体的处理效果,从而在深度估计和ego-motion估计上均获得了最新的state-of-the-art。该方法主要在以下论文中介绍:
V. Casser, S. Pirk, R. Mahjourian, A. Angelova, Depth Prediction Without the Sensors: Leveraging Structure for Unsupervised Learning from Monocular Videos, AAAI Conference on Artificial Intelligence, 2019
https://arxiv.org/pdf/1811.06152.pdf
项目地址:https://sites.google.com/view/struct2depth
开源代码地址:https://github.com/amanrajdce/struct2depth_pub
本人基于开源的struct2depth代码,进行数据的预处理,在自己的服务器上进行训练。

训练过程

1、数据预处理

使用的数据集是KITTI,可以使用这个链接将数据集下载下来。
下面对数据集进行相应处理,来构建用于训练的数据集形式。

1.1 Mask(掩膜)图像数据生成

文章训练的时候预先为图像中的物体生成了mask,并保存成mask图像,以提高算法在动态物体存在情况的工作效果,并对动态物体的运动进行建模,同时估计出动态物体的运动。
Mask(掩膜)是利用Mask_RCNN生成的,因此首先下载编译Mask_RCNN,这里不多做介绍,直接按照官方git进行操作即可。
对Mask_RCNN官方程序中samples/demo.ipynb与mrcnn/visualize.py进行修改,利用Mask_RCNN对所下载的要用于训练的KITTI数据集中的图像生成语义mask,并保存成灰度mask图像,相同灰度mask代表不同帧中同一物体,将灰度mask图像放在kitti_raw_seg中。
用gen_data_kitti_seg.py对kitti_raw_seg中图像数据进行处理,生成训练所需要的图像尺寸416 x 128,并将相邻三张图像合成一张(图像尺寸1248 x 128),生成训练所需要的图像形式,保存为**-fseg.png,到struct2depth_train文件夹中,示例图像如下所示:
在这里插入图片描述

1.2 Kitti_raw数据集处理

接着利用gen_data_kitti.py将kitti_raw文件处理保存到struct2depth_train文件夹中,生成训练所需要的图像尺寸416*128,将相邻三张图像合成一张(图像尺寸1248 x 128),并生成相机参数文件**_cam.txt,示例图像如下所示:
在这里插入图片描述

1.3 train.txt文件生成

之后利用gen_traintxt.py从struct2depth_train生成train.txt文件,放在struct2depth_train文件夹中,train.txt文件中每一行包含文件名以及图像名,每一个要训练的图像都会在train.txt文件中出现,train.txt文件如下所示。
在这里插入图片描述

1.4 用于训练的数据集形式

到此构建了可以用于训练的数据集struct2depth_train,struct2depth_train中包含多个图像文件夹,每个文件夹中都应该有特定图像名对应的三个文件,即原图像resize之后的文件**.png,mask图像文件**-fseg.png和相机参数文件**_cam.txt,如下所示:
struct2depth_train/train.txt
struct2depth_train/2011_09_26_drive_0001_sync_02/0000000001.png
struct2depth_train/2011_09_26_drive_0001_sync_02/0000000001-fseg.png
struct2depth_train/2011_09_26_drive_0001_sync_02/0000000001_cam.txt
struct2depth_train/2011_09_26_drive_0001_sync_02/0000000002.png
struct2depth_train/2011_09_26_drive_0001_sync_02/0000000002-fseg.png
struct2depth_train/2011_09_26_drive_0001_sync_02/0000000002_cam.txt
。。。。。。。。。。。。。。。。。。。。。

2、开始训练

运行run_train_kitti.sh脚本进行训练,脚本内容如下:

ckpt_dir="/media/whu/DATA/xingchen/struct2depth_results/models/model_1031"
data_dir="/media/whu/DATA/xingchen/struct2depth_train/" # Set for KITTI
#imagenet_ckpt="resnet_pretrained/model.ckpt"
pretrained_ckpt="/home/whu/xingchen/struct2depth_pub/models/struct2depth_model_kitti/model-199160"

python train.py \
  --logtostderr \
  --checkpoint_dir $ckpt_dir \
  --data_dir $data_dir \
  --architecture resnet \
  --batch_size 1 \
  --pretrained_ckpt $pretrained_ckpt \
  --handle_motion true
  #--imagenet_ckpt $imagenet_ckpt \
  #--imagenet_norm true \

其中,ckpt_dir指训练得到的checkpoint的存放地址,可自主定义,data_dir是用于训练的数据集位置,这里是struct2depth_train,imagenet_ckpt与pretrained_ckpt只需要定义一个,imagenet_ckpt可以用resnet-18预训练模型,从这个链接将pytorch的resnet-18预训练模型转换为tensorflow的resnet-18预训练模型,就可以使用了;也可以定义pretrained_ckpt,指利用作者给的预训练模型来进行训练,可从作者项目官方网站下载,这两种方式本人都是训练过,均可以获得不错的效果。
本人使用的GPU是2080ti*2,环境cuda10.0。
运行脚本后就可以开始训练了,其中有些参数比如学习率、损失函数权重等可以根据自身需求去修改。
文中用到的一些代码作者官方git并没有提供,之后我会整理发出来。
用训练的模型在自己采集的室内数据集中进行测试,这个室内数据集中有一个显著的移动物体,所以对于深度估计来说还是不小的挑战,目前来看还是有个不错的效果,不过目前是用kitti数据集进行训练得到的模型,还需要在室内数据集进行训练,进一步提高效果。
Alt
Alt

遇到的问题

1.报错ValueError: list.remove(x): x not in list
解决方法:将util.py 中 201、215行中进行修改,将原本的not_loaded改为ckpt_var_names。
2.该算法对于显存的要求较高,可能会出现CUDA_ERROR_OUT_OF_MEMORY: out of memory
解决方法:减少一次训练所使用的图像数量,或者采用多GPU的方式进行训练,比如用CUDA_VISIBLE_DEVICES=0,1 python train.py命令进行训练。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值