【BEV】BEVDet

2023-10-27

BEVDet

BEVDet继承于CenterPoint–>MVTwoStageDetector
模型实现基于MMlab MMdet3D框架
该算法基于Centeroint点云检测,通过多视角图像估计深度,形成层视锥形点云,进而生成BEV视角下的pillar点云主体,完成点云检测。

  • 下面是根据代码绘制结构

在这里插入图片描述

模型

在这里插入图片描述

bevdet-r50

模块 type 模块 type
img_backbone 'ResNet'
img_neck CustomFPN [1024,2048]->512
img_view_transformer LSSViewTransformer 512->80
img_bev_encoder_backbone CustomResNet 80->[80x2,80x4,80x8
img_bev_encoder_neck FPN_LSS 80x8+80*2->256
pts_bbox_head CenterHead 256-> bbox_coder CenterPointBBoxCoder
separate_head SeparateHead
loss_cls GaussianFocalLoss
loss_bbox L1Loss
model = dict(
    type='BEVDet',
    img_backbone=dict(
        pretrained='torchvision://resnet50',
        type='ResNet',
        depth=50,
        num_stages=4,   # 该网络共有4个阶段
        out_indices=(2, 3), ## 要网络的第2个和第3个阶段的特征图作为输出
        frozen_stages=-1,  # 将所有层的权重都冻结,只训练最后一层或几层的权重
        norm_cfg=dict(type='BN', requires_grad=True),
        norm_eval=False,  # 当norm_eval=False时,归一化层将处于训练模式,它将使用当前的batch的均值和方差来归一化输入数据。当norm_eval=True时,归一化层将处于评估模式,它将使用先前存储的移动平均均值和方差来归一化输入数据。
        with_cp=True,# 特征金字塔网络在进行特征融合时会使用copy操作
        style='pytorch'), 
    img_neck=dict(
        type='CustomFPN',
        in_channels=[1024, 2048],
        out_channels=512,
        num_outs=1,
        start_level=0, # 从网络的第0层开始进行特征提取
        out_ids=[0]),  # 特征金字塔网络中的第0个特征图
    img_view_transformer=dict(
        type='LSSViewTransformer',
        grid_config=grid_config,
        input_size=data_config['input_size'],
        in_channels=512,
        out_channels=numC_Trans,
        downsample=16),
    img_bev_encoder_backbone=dict(
        type='CustomResNet',
        numC_input=numC_Trans,
        num_channels=[numC_Trans * 2, numC_Trans * 4, numC_Trans * 8]),
    img_bev_encoder_neck=dict(
        type='FPN_LSS',
        in_channels=numC_Trans * 8 + numC_Trans * 2,
        out_channels=256),
    pts_bbox_head=dict(
        type='CenterHead',  # BEVDet继承Centerpoints
        in_channels=256,
        tasks=[
            dict(num_class=1, class_names=['car']),
            dict(num_class=2, class_names=['truck', 'construction_vehicle']),
            dict(num_class=2, class_names=['bus', 'trailer']),
            dict(num_class=1, class_names=['barrier']),
            dict(num_class=2, class_names=['motorcycle', 'bicycle']),
            dict(num_class=2, class_names=['pedestrian', 'traffic_cone']),
        ],
        common_heads=dict(
            reg=(2, 2), height=(1, 2), dim=(3, 2), rot=(2, 2), vel=(2, 2)),
        share_conv_channel=64,
        bbox_coder=dict(
            type='CenterPointBBoxCoder',
            pc_range=point_cloud_range[:2],
            post_center_range=[-61.2, -61.2, -10.0, 61.2, 61.2, 10.0],
            max_num=500,
            score_threshold=0.1,
            out_size_factor=8,
            voxel_size=voxel_size[:2],
            code_size=9),
        separate_head=dict(
            type='SeparateHead', init_bias=-2.19, final_kernel=3),
        loss_cls=dict(type='GaussianFocalLoss', reduction='mean'),
        loss_bbox=dict(type='L1Loss', reduction='mean', loss_weight=0.25),
        norm_bbox=True),
    # model training and testing settings
    train_cfg=dict(
        pts=dict(
            point_cloud_range=point_cloud_range,
            grid_size=[1024, 1024, 40],
            voxel_size=voxel_size,
            out_size_factor=8,
            dense_reg=1,
            gaussian_overlap=0.1,
            max_objs=500,
            min_radius=2,
            code_weights=[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2])),
    test_cfg=dict(
        pts=dict(
            pc_range=point_cloud_range[:2],
            post_center_limit_range=[-61.2, -61.2, -10.0, 61.2, 61.2, 10.0],
            max_per_img=500,
            max_pool_nms=False,
            min_radius=[4, 12, 10, 1, 0.85, 0.175],
            score_threshold=0.1,
            out_size_factor=8,
            voxel_size=voxel_size[:2],
            pre_max_size=1000,
            post_max_size=83,

            # Scale-NMS
            nms_type=[
                'rotate', 'rotate', 'rotate', 'circle', 'rotate', 'rotate'
            ],
            nms_thr=[0.2, 0.2, 0.2, 0.2, 0.2, 0.5],
            nms_rescale_factor=[
                1.0, [0.7, 0.7], [0.4, 0.55], 1.1, [1.0, 1.0], [4.5, 9.0]
            ])))

训练配置

point_cloud_range = [-51.2, -51.2, -5.0, 51.2, 51.2, 3.0]

train_pipeline test_pipeline
PrepareImageInputs PrepareImageInputs
LoadAnnotationsBEVDepth LoadAnnotationsBEVDepth
ObjectRangeFilter LoadPointsFromFile
ObjectNameFilter MultiScaleFlipAug3D
DefaultFormatBundle3D (DefaultFormatBundle3D
Collect3D Collect3D)

Scale NMS

            # Scale-NMS
            nms_type=[
                'rotate', 'rotate', 'rotate', 'circle', 'rotate', 'rotate'
            ],
            nms_thr=[0.2, 0.2, 0.2, 0.2, 0.2, 0.5],
            nms_rescale_factor=[
                1.0, [0.7, 0.7], [0.4, 0.55], 1.1, [1.0, 1.0], [4.5, 9.0]
            ]

优化配置

optimizer lr lr_config
AdamW 2e-4 policy=step

推理记录

模块 子模块 子模块 x_size块 mean
extract_img_feat image_encoder img_backbone
`ResNet`
([1, 1024, 16, 44])
([1, 2048, 8, 22])
2,3特征图
img_neck
`CustomFPN`
([1, 512, 16, 44]) 融合后特征
img_view_transformer ([1, 59, 16, 44]) depth
bev_encoder `CustomResNet`
`FPN_LSS`
[1, 256, 128, 128] BEV特征
pts_bbox_head CenterHead `SeparateHead` Loss 多任务检测

注册

注册机制通过cfg中关键字type对已经注册类进行对应实现

数据处理
训练流程
seed
cfg.data.train
cfg.data.test
type
type
加载模型
cfg.model
build_model
register
registry
pipeline
build_dataset
结束
训练
model
数据处理
加载数据
开始
obj_type = args.pop('type')
    if isinstance(obj_type, str):
        obj_cls = registry.get(obj_type)
        if obj_cls is None:
            raise KeyError(
                f'{obj_type} is not in the {registry.name} registry')
    elif inspect.isclass(obj_type) or inspect.isfunction(obj_type):
        obj_cls = obj_type
    else:
        raise TypeError(
            f'type must be a str or valid type, but got {type(obj_type)}')
    try:
        return obj_cls(**args)

注意:利用deepcopy实现参数的传递和隔离

随机种子

在相同中下,随机数相同,即此通过函数实现的随机数为伪随机数。类似为一元函数关系,相同输入产生同一个随机值。特别的是在产生随机数后将会产生新的随机种子,所以在重复使用随机函数时会输出不同的随机值,因为第二次的随机‘种子x’已经不一样了

总结

mmlab框架已经对各个基础模块进行封装,和一些功能模块的解耦。在使用的时候可以不用深究细节,==严禁重复造轮子!!!!==

严禁重复造轮子!!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【BEV】BEVDet 的相关文章

随机推荐

  • 【课程设计】数据库:火车票管理系统

    课程设计 数据库 火车票管理系统 摘要 本文主要介绍了火车票管理系统 其中包括其选题功能概述 对该系统的方案方法设计 以及过程实现等内容 由于系统的代码量较大 因此将会较为抽象地对思想进行介绍 在必要时会举出一些实例 还会附上成果展示以及安
  • 线程池创建类ThreadPoolExecutor介绍

    ThreadPoolExecutor 使用给定的初始参数和默认线程工厂和拒绝的执行处理程序创建一个新的线程池执行器 一 构造方法参数说明 有四个构造方法 最终都是调用构造方法四 构造方法参数说明 param corePoolSize 保留在
  • APK反编译

    一 需要的工具 apktool 反编译APK文件 得到classes dex文件 同时也能获取到资源文件以及布局文件 下载地址 dex2jar 将反编译后的classes dex文件转化为 jar文件 下载地址 jd gui 用于查看 ja
  • 嵌入式C语言总结

    GCC知识梳理 Q GCC是什么 GCC最初名称 GNU C Compiler 随着其支持的语言越来越多 改称为 GNU Compiler Collection 作用 将编程高级语言翻译为机器语言 Q C语言变成机器指令的过程 gcc 根据
  • web开发-高德地图api2.0-点聚合-包含设置非聚合点的事件绑定以及样式

    web开发 高德地图api2 0 点聚合 包含设置非聚合点的事件绑定以及样式 下面展示一些 内联代码片 非聚合点数据 lnglat里的坐标不一定要双引号 var points weight 8 lnglat 108 939621 34 34
  • Monitoring(监控)

    Monitoring and Instrumentation 有几种方法可以监控Spark应用程序 Web UI 指标和外部检测 Web Interfaces 默认情况下 每个SparkContext都会在端口4040上启动Web UI 以
  • P2661 信息传递(tarjan求强连通分量模板题)

    minn为最小强连通分量的点数 include
  • 企业微信PC版应用跳转到默认浏览器,避坑指南,欢迎补充。。。

    文章目录 引子 坑一 写代码 前端页面 后端代码 企业微信设置 坑二 网页授权及JS SDK 坑三 配置企业可信IP 最后 引子 我们公司内部用企业微信沟通 最近有个需求 一个应用在企业微信PC版打开时 要自动跳转到PC的默认浏览器 在开发
  • Java 奇偶分离

    public class MiddleHalf public static void main String args int nums 1 4 3 5 0 3 10 int result sortArrayByParity nums fo
  • C++ · 冒泡排序与选择排序

    九月份的第一篇文章 好久没更新了 想起上一次更新还是在上一次 那今天咱们来聊一聊C 中的冒泡排序与选择排序 冒泡排序 排序原理与思想 依次比较相邻的两个数 把大的放前面 小的放后面 即首先比较第1个数和第2个数 大数放前 小数放后 然后比较
  • 【蓝桥杯JavaB组真题详解】三部排序(2013)

    题目描述 三部排序 一般的排序有许多经典算法 如快速排序 希尔排序等 但实际应用时 经常会或多或少有一些特殊的要求 我们没必要套用那些经典算法 可以根据实际情况建立更好的解法 比如 对一个整型数组中的数字进行分类排序 使得负数都靠左端 正数
  • LeetCode(14):最长公共前缀

    描述 编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 示例 输入 flower flow flight 输出 fl 输入 dog racecar car 输出 解释 输入不存在公共前缀 class Solut
  • 红米note9pro刷鸿蒙,红米Note9Pro稳定版刷机包(官方系统固件升级包MIUI11)

    Redmi Note 9 Pro采用6 67英寸打孔屏 搭载高通骁龙750G 内置4820mAh大电池 搭载前后双玻璃机身 覆盖大猩猩第五代玻璃 正面为居中挖孔全面屏设计 6 67英寸屏幕 保留3 5mm耳机孔 采用侧面指纹识别 背部为居中
  • 微信小程序分享功能总结

    小程序实现分享功能有如下三种方式 1 在js文件中实现onShareAppMessage函数 即可点击右上角菜单分享给微信好友 页面中默认已实现 在js文件中实现onShareTimeline函数 即可点击右上角菜单分享到微信朋友圈 需要自
  • 联盟链走向何方

    联盟链技术哪家强 开源架构Fabric FISCO BCOS 以下简称 BCOS CITA 技术对比 出品 碳链价值研究院 01 摘要 第 46 届世界经济论坛达沃斯年会将区块链与人工智能 自动驾驶等一并列入 第四次工业革命 经济学人 曾在
  • qt5.5.1 移植4412的问题过程

    编译错误 WTF wtf unicode wchar UnicodeWchar h In function bool WTF Unicode isAlphanumeric UChar WTF wtf unicode wchar Unicod
  • 开源项目部署之悟CRM部署 PHP服务端版

    文章目录 前言 一 部署环境 二 部署流程 1 安装宝塔等基础环境 2 部署CRM 点击安装即可 在这里插入图片描述 https img blog csdnimg cn 4f83ede5d3f74343a927f8a641c25e19 pn
  • 助推打造全球研发中心城市

    阿里 社招 一面 面不动了 真的面不动了一 项目挑一个你觉得最有挑战性的细说 有些细节被质疑了 嘴在前面飞脑子在后面追 以后说每一句话都要小心 笑cry 二 八股1 聚簇索引和非 题解 检索产品名称和描述 一 select prod nam
  • 3D关键点检测(2020-2017)

    3D关键点检测 1 3D关键点检测之PoseDRL Deep Reinforcement Learning for Active Human Pose Estimation AAAI2020 这篇文章可能与我们通常所处理的姿态估计任务略有不
  • 【BEV】BEVDet

    BEVDet 解析 BEVDet 模型 bevdet r50 训练配置 Scale NMS 优化配置 推理记录 注册 随机种子 总结 BEVDet BEVDet继承于CenterPoint gt MVTwoStageDetector 模型实