CaDDN代码调试

文章目录

  • CaDDN代码调试-我的电脑
    • 1、环境配置:
    • 2、数据集准备
    • 3、训练一个模型
  • CaDDN代码调试-云环境
    • 1、数据集打包上传
    • 2、环境配置
    • 3、错误信息
  • 成功运行
  • Tensorboard日志信息
  • 可视化demo
  • CaDDN代码调试之 docker环境的安装

CaDDN代码调试-我的电脑

CaDDN这一篇我给翻译了,链接地址
先说一下我电脑的配置:

  • HP暗影精灵5

  • 双系统:win10+ubuntu1804(后边代码调试过程在ubuntu系统中进行的)

  • 内存:8+16G

  • 硬盘:512G SSD + 1TB 机械

  • 显卡:RTX 2060 (6G)

1、环境配置:

  1. 配置cuda10.2的环境

    之前安装过cuda10.1的,调试的过程一堆问题,然后就重装了10.2,结果还是一堆问题。安装过程的话,就推荐这篇博客吧。

  2. 使用conda创建一个caddn虚拟环境

    我是推荐使用Anaconda来创建caddn虚拟环境的,因为需要python3.8的环境,直接使用系统环境后期可能会出很多问题。

    conda create -n caddn python=3.8
    
  3. 下载CaDDN代码

    git clone https://mirror.ghproxy.com/https://github.com/TRAILab/CaDDN.git
    
  4. 安装编译pcdet v0.3

    首先需要安装一个库,如torch等。使用阿里云加速

    pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
    

    : 实际代码运行过程中需要用到cudatoolkit和cudnn这两个库,而requirements.txt这个文件中没有。如果电脑环境中已经安装的话,则不用管,没有的话需要安装一下。
    本人使用conda进行安装的,命令如下:

    conda install cudatoolkit = 10.2
    conda install cudnn = 7.6.5
    

    接下来这一步可能会出错:

       python setup.py develop
    

    没有出问题的话,那就没事,如果出现了pcdet/ops/iou3d_nms/src/iou3d_cpu.cpp:12:18: fatal error: cuda.h: 这样的错误,可以参考这篇博客。

2、数据集准备

数据集的格式如下所示:

CaDDN
├── data
│   ├── kitti
│   │   │── ImageSets
│   │   │── training
│   │   │   ├──calib & velodyne & label_2 & image_2 & depth_2
│   │   │── testing
│   │   │   ├──calib & velodyne & image_2
├── pcdet
├── tools

  可以先准备少一点的数据,比如300张图片。另外深度图需要下载 depth maps。如果没有梯子,可以去CSDN下载,我把这个深度数据上传了,不过只有300张深度图,仅作科研学术交流,如有侵权,可联系我删除。

执行如下命令生成data infos信息:

python -m pcdet.datasets.kitti.kitti_dataset create_kitti_infos tools/cfgs/dataset_configs/kitti_dataset.yaml

  这里如果出现Assertion问题,可以看一看是calib还是图像的问题,ImageSets里train.txt、val.txt和test.txt与数据集中的数据是一一对应的,数据集中可以多数据,但不能没有ImageSets里包含的数据。比如在原始的train.txt中有0009这个文件,但是找不到对应标号的label文件,就会出现如下图所示的错误信息:
CaDDN代码调试_第1张图片
  可以在看出是在kitti_dataset.py的118行get_calib出现了问题,因此找到此处代码,在assert前边加上一个print,这样再次运行,就可看出是少了哪个文件了,在train.txt或者val.txt删除就ok了。

  def get_calib(self, idx):
        calib_file = self.root_split_path / 'calib' / ('%s.txt' % idx)
#         print(calib_file)
        assert calib_file.exists()
        return calibration_kitti.Calibration(calib_file)

  一个一个的找出来删除太复杂,太麻烦了,我下边写了个脚本用来自动过滤掉一些文件不全的数据,生成新的/data/kitti/ImageSets/train.txt、val.txt和test.txt。
基本思想:
不考虑时间效率、空间效率,纯粹暴力来解决;
1. 读取原始train.txt中的数据,存放列表train_txt中,如果存在则值为1,否则为0;
2. 并读取calib、image_2等文件夹文件目录,获取文件名,存放相应的变量列表中;
3. 按照train_txt或者val_txt或test_txt循环,如果index对应的各个变量值都为1,则写入到新的train.txt文件中。
test清洗代码(代码仅供参考,实际用需要修改,另外train和val.txt生成时需要新加depth_2和label_2):

import numpy as np
import glob
N = 8000

train_txt = np.zeros(N)

calib = np.zeros(N)
image_2 = np.zeros(N)
velodyne = np.zeros(N)

root_path = '/home/CaDDN/data/kitti'

with open(root_path + "/ImageSets/test.txt", "r") as f:
    for line in f.readlines():
        line = int(line.strip('\n'))
        train_txt[line] = 1

files = glob.glob(root_path+'/testing/calib/*.txt')
for file in files:
    calib[int(file.split('/')[-1].split('.')[0])] = 1

files = glob.glob(root_path+'/testing/image_2/*.png')
for file in files:
    image_2[int(file.split('/')[-1].split('.')[0])] = 1

files = glob.glob(root_path+'/testing/velodyne/*.bin')
for file in files:
    velodyne[int(file.split('/')[-1].split('.')[0])] = 1

with open("test.txt", "w") as f:
    for i in range(N):
        if (calib[i] and image_2[i] and velodyne[i] and train_txt[i]):
            f.write(str(i).zfill(6)+"\n")

3、训练一个模型

首先需要下载预训练模型 DeepLabV3 model,将其放入checkpoints文件下,其文件结构如下:

CaDDN
├── checkpoints
│   ├── deeplabv3_resnet101_coco-586e9e4e.pth
├── data
├── pcdet
├── tools

修改train.py

 parser.add_argument('--cfg_file', type=str, default='./cfgs/kitti_models/CaDDN.yaml', help='specify the config for training')

    parser.add_argument('--batch_size', type=int, default=4, required=False, help='batch size for training')
    parser.add_argument('--epochs', type=int, default=10, required=False, help='number of epochs to train for')
    parser.add_argument('--workers', type=int, default=8, help='number of workers for dataloader')
    parser.add_argument('--extra_tag', type=str, default='default', help='extra tag for this experiment')
    parser.add_argument('--ckpt', type=str, default=None, help='checkpoint to start from')
    parser.add_argument('--pretrained_model', type=str, default='../checkpoints/deeplabv3_resnet101_coco-586e9e4e.pth', help='pretrained_model')
 

主要是修改配置文件路径,batch_size、epochs、预训练模型位置信息,如下图所示,另外这些信息也可以在CaDDN.yaml文件进行修改。
CaDDN代码调试_第2张图片

Terminal命令行中注意cd到tools目录下,开始训练:

python3.8 train.py

多卡训练的命令如下所示(数字4就是有4张卡):

python3.8 -m torch.distributed.launch --nproc_per_node=4 train.py --launcher 'pytorch'

注意,一定要用python3.8,直接用python可能会出错。
然后显存不够,Out Of Memery。
CaDDN代码调试_第3张图片

CaDDN代码调试-云环境

此云环境有1块V100(4核32G),应该不会出现显存不足的问题。

1、数据集打包上传

  • 无法解压data目录下的文件
    CaDDN代码调试_第4张图片
    将其移动到share目录下,再进行解压。
cp 原文件地址  目标地址

2、环境配置

  与本地配置类似,不过云服务器中的cuda什么是安装好的,cuda是10.1版本,经测试,也可以跑CaDDN代码,所以下边没有cuda的安装步骤直接。

  • 首先测试了一块8G显存的GPU,最后还是显存不足的问题
    CaDDN代码调试_第5张图片
    CaDDN代码调试_第6张图片
    所以换了一块V100继续调试

3、错误信息

CaDDN代码调试_第7张图片
出现这种错误,以我的经验来看,解决方法有两个,可以按照下边的顺序来解决:

  1. 我用python运行出现过这种问题,应该是运行python3.8 train.py
  2. 因为使用了预训练的模型,预训练模型的model_state名字你是不知道的,但是代码里用了checkpoint[‘model_state’],我的解决办法是:
    修改CaDDN/pcdet/models/detectors/detector3d_template.py的第359行,如下所示:
 loc_type = torch.device('cpu') if to_cpu else None
        checkpoint = torch.load(filename, map_location=loc_type)
        #model_state_disk = checkpoint['model_state']

        if 'version' in checkpoint:
            logger.info('==> Checkpoint trained from version: %s' % checkpoint['version'])

        update_model_state = {}
        for key, val in checkpoint.items():
            if key in self.state_dict() and self.state_dict()[key].shape == checkpoint[key].shape:
                update_model_state[key] = val
                # logger.info('Update weight %s: %s' % (key, str(val.shape)))

        state_dict = self.state_dict()
        state_dict.update(update_model_state)
        self.load_state_dict(state_dict, False)

关于上边的解决办法,我参考了这几篇博客:

https://www.cnblogs.com/jinjunweina/p/12671833.html

成功运行

成功运行起来了,大功告成~~
CaDDN代码调试_第8张图片
训练这个真滴耗卡呀!
CaDDN代码调试_第9张图片

Tensorboard日志信息

训练完成后会有一个output文件夹,在里边可以找到一个tensorboard文件夹,此文件夹下存放了训练时的一些信息,可以用tensorboard进行可视化观察。我的tensorboard文件
运行命令:

tensorboard --logdir=output/tensorboard/ --host=127.0.0.1

CaDDN代码调试_第10张图片CaDDN代码调试_第11张图片

模型评估
Car类
CaDDN代码调试_第12张图片从我的评估结果来看,因为ckpt模型文件是从70epoch开始的,从图中可以看出,70-80epoch之间模型的3D检测结果基本是不变的。easy类达到20.36%,hard类达到12.65%,moderate类达到14.7%,与论文的结果基本一致。

Cyclist类
CaDDN代码调试_第13张图片
easy类:2.195% hard类:0.9287% moderate类:1.13%

Pedestrian类
CaDDN代码调试_第14张图片easy类:15.7% hard类:8.828% moderate类:11.38%

可视化demo

可视化之前需要安装open3d和mayavi两个库,命令如下:

pip install open3d -i https://mirrors.aliyun.com/pypi/simple
pip install vtk==9.0.1 -i https://mirrors.aliyun.com/pypi/simple
pip install mayavi==4.7.3 -i https://mirrors.aliyun.com/pypi/simple

CaDDN代码调试之 docker环境的安装

后期再来测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JB75hTKC-1639492974725)(imgs/image-20211213212330196.png)]

你可能感兴趣的:(3D目标检测,单目3D目标检测,CaDDN,Pytorch,深度估计,代码调试)