【MMDetection3D实战4】利用mmdet3d进行训练

news2024/11/17 3:49:38

文章目录

    • 1. 介绍
      • 1.1 训练流程
      • 1.2 测试及验证
    • 2. 训练过程演示
      • 2.1 准备数据集并处理
      • 2.2 加载并修改配置文件
      • 2.3 启动训练
      • 2.4 测试

1. 介绍

1.1 训练流程

MMDetection3D(mmdet3d)和OpenMMlab其他代码库是一样的,在训练的时候需要准备好一个配置文件,在配置文件中定义好所使用的数据模型优化器一系列参数,对于单GPU我们可以使用tools/train.py config.py 启动训练。

因为mmdet3d提供了一系列标准的配置文件,通常情况下我们只需要继承这些标准配置文件,然后做一些简单的修改就可以。这些修改包括(数据路径、训练参数相关的修改)。注意的是,即便我们用的是标准的kitti数据集,在训练前我们还是需要利用mmdet3d提供的工具处理下数据,将零散的标注数据(标定+标注+图片路径等)形成一个完整的标注文件,方便程序在训练的时候进行读取。训练的流程总结如下:

  • (1) 下载并整理数据

    • 标准数据集:
     python tools/create_data.py   kitti --root-path  ./data/kitti --out-dir ./data/kitti --extra-tag kitti
    
    • 自定义数据集
      整理成支持的数据格式,如KITTI或nuscenes
  • (2) 修改配置文件(数据路径相关、训练参数相关)

  • (3) 启动训练

    • 单机单卡: 使用tools/train.py config启动训练
    • 多机多卡用: 使用tools/dist_train.sh(多卡)、tools/slurm_train.sh(多机多卡)

1.2 测试及验证

训练结束后,可以对模型进行测试验证,利用tools/test.py通过传不同参数,让模型保存测试结果或者对结果可视化,具体参数的使用可参考mmdet3d的相关使用文档

python tools/test.py myconfig.py work_dirs latest.pth
  • 通过--show --show-dir tmp 参数,可视化预测结果
  • 显示预测的指标: --eval mAP
  • 保存测试结果 --out result.pkl

2. 训练过程演示

2.1 准备数据集并处理

  • 下载kitti_tiny_3D数据集,该数据从KITTI数据中裁剪而来:从百度网盘下载,密码:9niw ,然后解压。
  • 执行数据处理脚本
python tools/create_data.py kitti --root-path ./data/kitti --out-dir ./data/kitti --extra-tag kitti

2.2 加载并修改配置文件

mim download mmdet3d --config hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class --dest checkpoints

这个.py的config文件在项目的configs/pointpillars下就能找到,主要是下载预训练权重。可以从mmdetection3d仓库中下载预训练权重,下载好了放在 checkpoints文件夹下。
在这里插入图片描述

_base_ = [
    '../_base_/models/hv_pointpillars_secfpn_kitti.py',
    '../_base_/datasets/kitti-3d-3class.py',
    '../_base_/schedules/cyclic_40e.py', '../_base_/default_runtime.py'
]

point_cloud_range = [0, -39.68, -3, 69.12, 39.68, 1]
# dataset settings
data_root = 'data/kitti/'
class_names = ['Pedestrian', 'Cyclist', 'Car']
# PointPillars adopted a different sampling strategies among classes

file_client_args = dict(backend='disk')
# Uncomment the following if use ceph or other file clients.
# See https://mmcv.readthedocs.io/en/latest/api.html#mmcv.fileio.FileClient
# for more details.
# file_client_args = dict(
#     backend='petrel',
#     path_mapping=dict({
   
#         './data/kitti/':
#         's3://openmmlab/datasets/detection3d/kitti/',
#         'data/kitti/':
#         's3://openmmlab/datasets/detection3d/kitti/'
#     }))

db_sampler = dict(
    data_root=data_root,
    info_path=data_root + 'kitti_dbinfos_train.pkl',
    rate=1.0,
    prepare=dict(
        filter_by_difficulty=[-1],
        filter_by_min_points=dict(Car=5, Pedestrian=5, Cyclist=5)),
    classes=class_names,
    sample_groups=dict(Car=15, Pedestrian=15, Cyclist=15),
    points_loader=dict(
        type='LoadPointsFromFile',
        coord_type='LIDAR',
        load_dim=4,
        use_dim=4,
        file_client_args=file_client_args),
    file_client_args=file_client_args)

# PointPillars uses different augmentation hyper parameters
train_pipeline = [
    dict(
        type='LoadPointsFromFile',
        coord_type='LIDAR',
        load_dim=4,
        use_dim=4,
        file_client_args=file_client_args),
    dict(
        type='LoadAnnotations3D',
        with_bbox_3d=True,
        with_label_3d=True,
        file_client_args=file_client_args),
    dict(type='ObjectSample', db_sampler=db_sampler, use_ground_plane=True),
    dict(type='RandomFlip3D', flip_ratio_bev_horizontal=0.5),
    dict(
        type='GlobalRotScaleTrans',
        rot_range=[-0.78539816, 0.78539816],
        scale_ratio_range=[0.95, 1.05]),
    dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range),
    dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range),
    dict(type='PointShuffle'),
    dict(type='DefaultFormatBundle3D', class_names=class_names),
    dict(type='Collect3D', keys=['points', 'gt_bboxes_3d', 'gt_labels_3d'])
]
test_pipeline = [
    dict(
        type='LoadPointsFromFile',
        coord_type='LIDAR',
        load_dim=4,
        use_dim=4,
        file_client_args=file_client_args),
    dict(
        type='MultiScaleFlipAug3D',
        img_scale=(1333, 800),
        pts_scale_ratio=1,
        flip=False,
        transforms=[
            dict(
                type='GlobalRotScaleTrans',
                rot_range=[0, 0],
                scale_ratio_range=[1., 1.],
                translation_std=[0, 0, 0]),
            dict(type='RandomFlip3D'),
            dict(
                type='PointsRangeFilter', point_cloud_range=point_cloud_range),
            dict(
                type='DefaultFormatBundle3D',
                class_names=class_names,
                with_label=False),
            dict(type='Collect3D', keys=['points'])
        ])
]

data = dict(
    train=dict(dataset=dict(pipeline=train_pipeline, classes=class_names)),
    val=dict(pipeline=test_pipeline, classes=class_names),
    test=dict(pipeline=test_pipeline, classes=class_names))

# In practice PointPillars also uses a different schedule
# optimizer
lr = 0.001
optimizer = dict(lr=lr)
# max_norm=35 is slightly better than 10 for PointPillars in the earlier
# development of the codebase thus we keep the setting. But we does not
# specifically tune this parameter.
optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))
# PointPillars usually need longer schedule than second, we simply double
# the training schedule. Do remind that since we use RepeatDataset and
# repeat factor is 2, so we actually train 160 epochs.
runner = dict(max_epochs=80)

# Use evaluation interval=2 reduce the number of evaluation timese
evaluation = dict(interval=2)
  • 配置文件定义了数据集根目录data_root ,类别名class_names , testtrain的数据处理pipeline;
  • 其中模型结构的配置继承自'../_base_/models/hv_pointpillars_secfpn_kitti.py',该文件定义了模型结构。
  • 学习率和优化器的配置继承于../_base_/schedules/cyclic_40e.py,它定义了详细的cyclic学习率的配置策略,当前配置文件会对优化器部分参数进行修改。
  • kitti dataset相关的数据处理pipeline继承自../_base_/datasets/kitti-3d-3class.py, 在我们使用的配置文件,对pipeiline进行了修改。
  • 定义了data 对继承自../_base_/datasets/kitti-3d-3class.py中的train、val以及test的原有pipeline进行了修改,对classes进行了修改
  • optimizer 在继承../_base_/schedules/cyclic_40e.py的基础上,修改了学习率
  • 定义了runner ,在继承'../_base_/schedules/cyclic_40e.py'基础上,修改了runner的训练的迭max_epochs
  • 定义了evaluation ,在继承'../_base_/schedules/cyclic_40e.py'基础上,修改了runner中evaluation 的间隔
  • 此外,像work_dir,resume_from,load_from等参数,定义在'../_base_/default_runtime.py', 如果需要修改,可以在本配置文件中修改,比如重新指定work_dir,或者加重模型权重进行resume等。

总之:所有配置都在继承的文件基本实现好了,然后针对不同版本的模型在继承的基础上进行修改。
hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class配置文件中,在继承的基础上修改了一些配置,比如数据的路径data_root, 比如训练的pipeline等,class_names等,以及训练的max_epoches等。这是官方给我们提供的针对pointpillars对应版本的配置文件,我们也可以在该配置文件的基础上进行修改,因为大部分的内容我们是不需要修改,所以可以通过简单的继承方式,然后指定需要修改的内容。

我们可以尝试自己编写一个配置文件,因为大部分的内容都不需要修改,所以我们可以使用简单的继承的方式,自己编写的配置文件myconfig.py内容如下:

_base_ = [
    'configs\pointpillars\hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py'
]

data = dict(
    samples_per_gpu=4,
    workers_per_gpu=1,
    persistent_workers=True,
    test=dict(
        split='testing',
        ann_file='data/kitti/kitti_infos_test.pkl',
    ))

runner = dict(max_epochs=5)
checkpoint_config = dict(interval=5)
evaluation = dict(interval=5)
log_config = dict(interval=10)

load_from = 'checkpoints/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class_20220301_150306-37dc2420.pth'
  • 首先定义_base_, 里面放置我们继承的那个文件,这里对应对应就是pointpillars在kitti数据集上训练的配置文件
  • 然后对data进行简单修改,修改了samples_per_gpu也就是batch_size, 以及dataloader的进程数workers_per_gpu
  • 因为我们提供数据非常小,只是简单训练示例下,因此将max_epochs设置为5, 只训练5轮看看效果
  • evaluation 的间隔也修改了下
  • 然后将load_from 修改为我们下载好的模型路径,

编写好配置文件之后,就可以利用tools/train.py启动训练

2.3 启动训练

使用命令行工具启动训练,单机环境使用tools/train.py, 多GPU调用tools/dist_train.py

python .\tools\train.py myconfig.py
2022-11-03 19:22:45,595 - mmdet - INFO - Environment info:
------------------------------------------------------------
sys.platform: win32
Python: 3.8.13 (default, Mar 28 2022, 06:59:08) [MSC v.1916 64 bit (AMD64)]
CUDA available: True
GPU 0: NVIDIA GeForce GTX 1080
CUDA_HOME: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2
NVCC: Cuda compilation tools, release 10.2, V10.2.8
MSVC: 用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.29.30146 版
GCC: n/a
PyTorch: 1.8.2
PyTorch compiling details: PyTorch built with:
  - C++ Version: 199711
  - MSVC 192930040
  - Intel(R) Math Kernel Library Version 2020.0.2 Product Build 20200624 for Intel(R) 64 architecture applications
  - Intel(R) MKL-DNN v1.7.0 (Git Hash 7aed236906b1f7a05c0917e5257a1af05e9ff683)
  - OpenMP 2019
  - CPU capability usage: AVX2
  - CUDA Runtime 10.2
  - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_61,code=sm_61;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_37,code=compute_37
  - CuDNN 7.6.5
  - Magma 2.5.4
  - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=10.2, CUDNN_VERSION=7.6.5, CXX_COMPILER=C:/cb/pytorch_1000000000000/work/tmp_bin/sccache-cl.exe, CXX_FLAGS=/DWIN32 /D_WINDOWS /GR /EHsc /w /bigobj -DUSE_PTHREADPOOL -openmp:experimental -DNDEBUG -DUSE_FBGEMM -DUSE_XNNPACK, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.8.2, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=OFF, USE_NNPACK=OFF, USE_OPENMP=ON, 

TorchVision: 0.9.2
OpenCV: 4.6.0
MMCV: 1.6.0
MMCV Compiler: MSVC 192930137
MMCV CUDA Compiler: 10.2
MMDetection: 2.25.3
MMSegmentation: 0.29.0
MMDetection3D: 1.0.0rc5+962fc83
spconv2.0: False
------------------------------------------------------------

2022-11-03 19:22:46,834 - mmdet - INFO - Distributed training: False
2022-11-03 19:22:48,062 - mmdet - INFO - Config:
voxel_size = [0.16, 0.16, 4]
model = dict(
    type='VoxelNet',
    voxel_layer=dict(
        max_num_points=32,
        point_cloud_range=[0, -39.68, -3, 69.12, 39.68, 1],
        voxel_size=[0.16, 0.16, 4],
        max_voxels=(16000, 40000)),
    voxel_encoder=dict(
        type='PillarFeatureNet',
        in_channels=4,
        feat_channels=[64],
        with_distance=False,
        voxel_size=

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1517156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.MongoDB与关系数据库对比

MongoDB的简单操作与比较 与关系数据库对比 MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,来看看他们之…

轮趣 IMU N100 九轴 IMU 在 ROS 下安装驱动

本篇介绍如何在ROS环境中使用 WHEELTEC N100 惯导模块。 轮趣 IMU N100 的 ROS 驱动程序下载链接:轮趣 IMU 资料 - 坚果云 - 云盘|网盘|企业网盘|同步|备份|无限空间|免费网络硬盘|企业云盘 1、CP2102 固定串口号 1.1 、修改串口号 在 Windows 中需要把 WHEELTE…

H5 宠物店官网源码

源码名称:H5宠物店官网源码 源码介绍:一款宠物店官网单页源码,可以用于开设宠物店宣传页、宠物店官网。源码H5自适应无后台。 需求环境:H5 下载地址: https://www.changyouzuhao.cn/11098.html

Linux-vim显示乱码

Linux运维工具-ywtool 目录 一.问题二.解决2.1 编辑VIM的配置文件2.2 添加以下内容 一.问题 用vim编辑的时候,中文显示乱码 二.解决 2.1 编辑VIM的配置文件 vim ~/.vimrc #如果这个文件不存在,创建一个即可2.2 添加以下内容 添加完成以后就不会在出现中文乱码了 set fil…

操作系统系列学习——CPU调度策略

文章目录 前言CPU调度策略 前言 一个本硕双非的小菜鸡,备战24年秋招,计划学习操作系统并完成6.0S81,加油! 本文总结自B站【哈工大】操作系统 李治军(全32讲) 老师课程讲的非常好,感谢 【哈工大…

1.7 什么是可变形卷积?可变形卷积旨在解决哪类问题?

1.7 什么是可变形卷积?可变形卷积旨在解决哪类问题? 问题:深度卷积神经网络在许多视觉任务上获得了重大突破,其强大的特征提取能力避免了传统的人工特征工程的弊端。然而,普通的卷积操作是在固定的、规则的网格点上进…

为什么要用scrapy爬虫库?而不是纯python进行爬虫?

为什么要用scrapy爬虫库?而不是纯python进行爬虫? Scrapy的优点Scrapy节省的工作使用纯Python编写爬虫的不足 Scrapy是一个使用Python编写的开源和协作的web爬虫框架,它被设计用于爬取网页数据并从中提取结构化数据。Scrapy的强大之处在于其广…

安装kibaba

官方地址:Past Releases of Elastic Stack Software | Elastic 直接下载就可以 安装好了之后开始配置文件/kibana/config打开kibanba.yml server.port:5601 服务器地址 sercer.name:kibana 服务器名称 kibana.index:.kibana 索引 elasticsearch.hosts:[http://1…

Python数学建模-2.3函数(下)

2.3.2模块的导入与使用 模块在Python中是一个包含Python定义和语句的文件,通常用来组织代码,使得代码更易于管理和复用。下面,我将详细讲解Python函数中模块的使用知识。 1. 模块的导入 在Python中,你可以使用import语句来导入…

IDEA中配置Tomcat

文章目录 一、创建Web项目二、配置tomcat三、启动Tomcat 一、创建Web项目 1.首先我们要用IDEA创建一个普通的java项目。 2.我创建的项目名称为myTomcat,想要开发web程序,我们还要做一下操作。 首先我们先给项目添加框架支持...,我的 idea 版…

Python实现BOA蝴蝶优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

区别于传统家!三翼鸟定制智慧家电家居一体化场景

在这个科技创新、智能AI主导的时代,寻求更便捷智慧、舒心适宜、一体化的居家场景,成为一个时代的命题和竞赛,也是家居行业共同奔赴的使命。在纷繁复杂的竞争格局和方向答案中,一条清晰坚定的路径正在显露出来…… AWE前一天&…

关于联软UniAccess安全助手流氓行为,导致代码编译失败

今天公司里安装了这个东西, 就是监控软件 一举一动都被监控 早上我安装完 然后我继续工作编译代码, 用的clang.exe emscripten 编译webassembly项目 老是报错,而且次次报错 不一致 很奇怪的错误 我就想是不是我同步远端分支的原因, 折腾了好久, 发现已经的仓库也编…

sincecon品牌国货之光采用的聚甲基丙烯酸羟乙脂能够防护眼睛

sincecon品牌含硅半年抛华丽登场各种风格色系设计全都一网打尽给你挑花眼的囤货快乐, sincecon是KOOL旗下的一个品牌,品牌较大,且口碑很好,回头客很多。sincecon美瞳采用的聚甲基丙烯酸羟乙脂能够防护眼睛,不刺激眼睛,对眼睛的好处很大。

JavaScript 数组去重的方法12 种方法

数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你能答出其中的 10 种,面试官很有可能对你刮目相看。 在真实的项目中碰到的数组去重,一…

Kotlin/Java中String的equals和==

Kotlin/Java中String的equals和 在Java中,如果定义一个常量String和new出一个String对象,是不同的: String s1 "zhang" String s2 new String("zhang") 因为在Java看来,s1只是一个常量,会放在…

深入浅出讲解Python字符串格式化

字符串格式化操作符(%),非常类似于C 语言里面的printf()函数的字符串格式化,甚至所用的符号都一样,都用百分号(%),并且支持所有printf()式的格式化操作。语法如下: format_string % string_to_convert format_string为…

【Python】新手入门学习:详细介绍依赖倒置原则(DIP)及其作用、代码示例

【Python】新手入门学习:详细介绍依赖倒置原则(DIP)及其作用、代码示例 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、Py…

【深度学习笔记】7_7 AdaDelta算法

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 7.7 AdaDelta算法 除了RMSProp算法以外,另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的…

了解关键字

关键字 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(或单词) HelloWorld案例中,出现的关键字有 class、public 、 static 、 void 等,这些单词已经被Java定义好了。 特点:全部关键字都…