DD3D代码复现,docker环境下运行DD3D代码教程

      3D目标检测的主要应用场景是自动驾驶,虽然现阶段基于点云的3D检测的性能不断提升,但相比于激光雷达高昂的成本以及在复杂天气下的敏感性,研究人员将目光投向了基于单目视觉的方案,因此单目3D检测逐渐成为了研究热点。

      DD3D是一个end-to-end、单阶段的基于单目视觉的3D检测模型,由于不靠点云,精度远不及多模态,但在单目视觉领域中遥遥领先,在KITTI目前榜前三。因此复现DD3D有一定的必要性,是熟悉DD3D源码最重要的一步,接下来我将分享近期复现DD3D模型的一些方法和心得,以及遇到的各种bug的解决方法。

DD3D代码下载地址:

https://github.com/TRI-ML/dd3dhttps://github.com/TRI-ML/dd3d

运行环境:

docker:用的是ufoym/deepo镜像  

               docker pull ufoym/deepo 拉取镜像

创建容器,容器内环境为:

               Ubuntu 20.04

               Python 3.8

               Pytorch 1.10 + cuda11.3

一、数据集准备

1. 下载KITTI数据集,解压:

http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3dhttp://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d

2. 下载用于训练和评估的数据划分文件,解压:

https://tri-ml-public.s3.amazonaws.com/github/dd3d/mv3d_kitti_splits.tarhttps://tri-ml-public.s3.amazonaws.com/github/dd3d/mv3d_kitti_splits.tar

3. 在代码dd3d-main下新建目录data,在data目录下新建目录KITTI3D,整体目录如下图:

DD3D代码复现,docker环境下运行DD3D代码教程_第1张图片

 4. 直接运行会报错,提示不存在目录:“/data/KITTI3D/mv3d_kitti_splits/train.txt”,需要修改代码重新设置路径 

     修改dd3d-main / tridet / data / datasets / kitti_3d / __init__.py下的代码:

     在开头添加以下代码: 

import os
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../..'))

     将这段代码:

kwargs.update({'root_dir': os.path.join(cfg.DATASET_ROOT, KITTI_ROOT)})

     修改为:

kwargs.update({'root_dir': os.path.join(ROOT_DIR, 'data/KITTI3D')})

     就可以找到数据集了

二、pip安装各种库

1. pip安装以下各种库

pip install \
    awscli==1.20.27 \
    boto3==1.18.27 \
    coloredlogs==15.0.1 \
    hydra-core==1.1.1 \
    matplotlib==3.4.3 \
    numpy==1.20.3 \
    pandas==1.3.2 \
    requests==2.26.0 \
    scikit-image==0.18.2 \
    scipy==1.7.1 \
    seaborn==0.11.2 \
    tenacity==8.0.1 \
    tqdm==4.62.2 \
    wandb==0.12.0
pip install numba==0.54.0 Cython==0.29.24 pycocotools==2.0.2 nuscenes-devkit==1.1.7

2. pip安装mpi4py

sudo apt-get update
sudo apt install libopenmpi-dev
pip install mpi4py==3.0

3. pip安装fvcore

apt-get update && apt-get install -y git
pip install -U 'git+https://github.com/facebookresearch/fvcore'

 4. 安装detectron2(有坑)

     第一个坑:需要先安装pycocotools、fvcore

     第二个坑:detectron2需要与pytorch版本一致,目前支持最高版本Pytorch1.10,如果高于这个版本,会报错,解决方案是pytorch版本降级,降级方法自行百度,detectron2对应pytorch版本信息点击以下链接:

https://detectron2.readthedocs.io/en/latest/tutorials/install.htmlhttps://detectron2.readthedocs.io/en/latest/tutorials/install.html     可在以上链接中找自己相应版本的安装命令,由于我的版本是pytorch1.10 + cuda11.3,因此我的安装命令是:

python -m pip install detectron2 -f \
  https://dl.fbaipublicfiles.com/detectron2/wheels/cu113/torch1.10/index.html

  5. 安装pytorch3d

pip install pytorch3d

 三、下载深度预训练模型参数文件

     深度预训练模型参数文件可在github里下载,这个模型是用DDAD15M数据集训练好的Dense depth,我下载的是DLA34文件:     DD3D代码复现,docker环境下运行DD3D代码教程_第2张图片

     如果不提前下载放入代码里,代码运行时则会自动下载,但这样会超级慢。

     下载完后重命名为depth_pretrained_dla34.pth,直接放入dd3d-main目录下,需要修改代码,否则无法读取下载好的参数文件。

1. 修改dd3d-main / scripts / train.py下的代码:

     在开头添加以下代码,这段代码同时也解决了报错找不着“tridet”目录的bug,不得不说这个代码bug还是挺多的,真心累。

import os
import sys
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
ROOT_DIR = os.path.dirname(BASE_DIR)
#把这个目录加入系统路径,被加入系统路径中的所有文件中的函数都可以被调用
sys.path.append(ROOT_DIR)
sys.path.append(os.path.join(ROOT_DIR, 'tridet')) 

    将以下这段代码:

checkpoint_file = cfg.MODEL.CKPT
if checkpoint_file:
    Checkpointer(model).load(checkpoint_file)

    修改为:

# checkpoint_file = cfg.MODEL.CKPT
checkpoint_file = os.path.join(ROOT_DIR, 'depth_pretrained_dla34.pth')
if checkpoint_file:
    Checkpointer(model).load(checkpoint_file)

2. 修改 dd3d-main / scripts / visualize_dataloader.py下的代码:

    在开头添加以下代码:

import os
import sys
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
ROOT_DIR = os.path.dirname(BASE_DIR)
#把这个目录加入系统路径,被加入系统路径中的所有文件中的函数都可以被调用
sys.path.append(ROOT_DIR)
sys.path.append(os.path.join(ROOT_DIR, 'tridet')) 

3. 修改dd3d-main / configs / experiments / dd3d_kitti_dla34.yaml 下的代码:

    将 'CPKT'  注释掉,否则运行代码会自动下载预训练模型文件,超级慢!

DD3D代码复现,docker环境下运行DD3D代码教程_第3张图片

这样就可以读取下载好的参数文件了。

四、运行

1. 先跑一下 scripts / visualize_dataloader.py,这是可视化数据迭代,看看数据有没有问题。

python ./scripts/visualize_dataloader.py +experiments=dd3d_kitti_dla34 SOLVER.IMS_PER_BATCH=4

PS:这时候,可能会爆出一个大bug,会提示无法override meta_arch,跑train.py代码也是如此,就是无法重覆盖meta_arch,这个bug我弄了好久才解决掉,报错如下图:

   bug根源在dd3d_kitti_dla34.yaml文件,如下图:

 DD3D代码复现,docker环境下运行DD3D代码教程_第4张图片

    解决方法:我重写了dd3d_kitti_dla34.yaml文件,可点下面链接下载,然后复制到configs / experiments覆盖即可。

链接:https://pan.baidu.com/s/1bt1Vy79VfnP4C98tX7pgNQ 
提取码:grul 

    可在dd3d_kitti_dla34.yaml 这个配置文件修改一些参数:

    a. 修改显卡:

DD3D代码复现,docker环境下运行DD3D代码教程_第5张图片

    b. 修改批量(视自己显卡情况修改),这里有两个地方,我从64改为32:

DD3D代码复现,docker环境下运行DD3D代码教程_第6张图片

DD3D代码复现,docker环境下运行DD3D代码教程_第7张图片

    c. 修改num_worker(视自己显卡情况修改):

    有两个地方,一个在configs / common / train_dataloader.yaml,另一个在 configs / common / test_dataloader.yaml

 2. 然后跑 scripts / train.py

python ./scripts/train.py +experiments=dd3d_kitti_dla34

 五、可能会出现的bug

1. 如报错OSError: [Errno 24] Too many open files,输入以下命令:

ulimit -n 2048

 2. 如报错Pin memory thread exited unexpectedly,修改 tridet / data / build.py下的代码:

     在build_batch_data_loader()函数里,添加这句代码,

DD3D代码复现,docker环境下运行DD3D代码教程_第8张图片

    然后在build_test_dataloader()函数里,修改pin_memory =  False

DD3D代码复现,docker环境下运行DD3D代码教程_第9张图片

 3.  如报错received 0 items of ancdata,则减小批量大小,或者修改num_worker = 0。

你可能感兴趣的:(3D目标检测,计算机视觉,目标检测,深度学习,神经网络)