OpenPCDet系列 | 5.4 PointPillars算法——AnchorHeadSingle模型预测头模块

news2024/10/7 12:28:23

文章目录

  • AnchorHeadTemplate模块
    • 1. AnchorGenerator
    • 2. ResidualCoder
    • 3. AxisAlignedTargetAssigner
  • AnchorHeadSingle模块
    • 1. AnchorHeadSingle初始化
    • 2. AnchorHeadSingle训练前向传播
    • 3. AnchorHeadSingle测试前向传播

OpenPCDet的整个结构图:
在这里插入图片描述

PointPillars算法属于OneStage算法,其中onestage可供选择的dense_head在__init__函数中选择,这里PointPillars算法使用的是AnchorHeadSingle,其又是继承自AnchorHeadTemplate。

# 根据MODEL中的DENSE_HEAD确定选择的模块
__all__ = {
    'AnchorHeadTemplate': AnchorHeadTemplate,   # 基类
    'AnchorHeadSingle': AnchorHeadSingle,
    'PointIntraPartOffsetHead': PointIntraPartOffsetHead,
    'PointHeadSimple': PointHeadSimple,
    'PointHeadBox': PointHeadBox,
    'AnchorHeadMulti': AnchorHeadMulti,
    'CenterHead': CenterHead
}

所以,下面先记录一下AnchorHeadTemplate的作用,再记录AnchorHeadSingle模块


AnchorHeadTemplate模块

由于PointPillars是属于OneStage的anchor-based算法,所以首先就涉及到了anchor的生成,这部分是通过AnchorGenerator.generate_anchors类函数来实现。此外,在AnchorHead中还需要定义回归的编码方式以及目标对齐方式,最后再构建分类头、回归头、方向预测头的损失函数。

# 功能:dense head模块的基类
class AnchorHeadTemplate(nn.Module):
    def __init__(self, model_cfg, num_class, class_names, grid_size, point_cloud_range, predict_boxes_when_training):
        """
        Args:
            model_cfg:      DENSE_HEAD的配置文件
            num_class:      类别数目(3类)
            class_names:    类别名称: ['Car', 'Pedestrian', 'Cyclist']
            grid_size:      网格大小
            point_cloud_range:  点云范围:[-x, -y, -z, x, y, z]
            predict_boxes_when_training:    布尔变量:False (twoStage模型才会设置为True)
        """
        super().__init__()    # 初始化nn.Module
        self.model_cfg = model_cfg
        self.num_class = num_class
        self.class_names = class_names
        self.predict_boxes_when_training = predict_boxes_when_training  # False (twoStage模型才会设置为True)
        self.use_multihead = self.model_cfg.get('USE_MULTIHEAD', False) # False (多尺度head的设置)

        # Dense Head模块包含三大子部分:
        # 1)对生成的anchor和gt进行编码和解码
        anchor_target_cfg = self.model_cfg.TARGET_ASSIGNER_CONFIG   # anchor分配文件
        self.box_coder = getattr(box_coder_utils, anchor_target_cfg.BOX_CODER)( # 在box_coder_utils文件中调用ResidualCoder类
            num_dir_bins=anchor_target_cfg.get('NUM_DIR_BINS', 6),  # 如果没有设置,默认为6
            **anchor_target_cfg.get('BOX_CODER_CONFIG', {})
        )

        # 2)anchor生成配置
        anchor_generator_cfg = self.model_cfg.ANCHOR_GENERATOR_CONFIG   # list:存储每个类别的anchor生成设置
        anchors, self.num_anchors_per_location = self.generate_anchors(
            anchor_generator_cfg, grid_size=grid_size, point_cloud_range=point_cloud_range,
            anchor_ndim=self.box_coder.code_size
        )

        # 3)gt匹配
        self.anchors = [x.cuda() for x in anchors]  # 放在GPU上
        self.target_assigner = self.get_target_assigner(anchor_target_cfg)

        # 4)保存前向传播结果并构建损失函数
        self.forward_ret_dict = {}    # 根据forward_ret_dict内容来计算loss
        self.build_losses(self.model_cfg.LOSS_CONFIG)       # 分类损失、回归损失、方向损失的构建
        
        ......

1. AnchorGenerator

初始化参数变量如下所示:
在这里插入图片描述

函数的最后返回的是anchor_list列表以及每个位置每个类别有多少种anchor的列表,如下所示:
在这里插入图片描述

2. ResidualCoder

初始化参数变量如下:
在这里插入图片描述

3. AxisAlignedTargetAssigner

初始化参数变量如下:
在这里插入图片描述


AnchorHeadSingle模块

在PointPillars算法中,dense_head模块是最难的部分,其初始化和前向传播都涉及多个部分,下面分别进行介绍。

1. AnchorHeadSingle初始化

AnchorHeadSingle模块初始化的结构图:
在这里插入图片描述

在配置文件中这里选择的预测3个类别:[‘Car’, ‘Pedestrian’, ‘Cyclist’],每个类别的anchor存在两个方向,也就是一共会生成6种anchor。对于每个anchor需要7个维度的信息表示:[x, y, z, dx, dy, dz, heading]。对应对于分类head的输出维度是6 * 3类别=18;对于回归reg head的输出维度是6 * 7个信息表示=42;最后还有分类6 * 2个方向=12。同时,不同的head设置了不同的损失函数。

模型的具体构建结果如下所示,每个head只有一层的linear来进行最后的预测。到了AnchorHeadSingle模块中,具体的定义其实只涉及到了模型的定义。(其中损失的定义还是在基类中进行构建的)

AnchorHeadSingle(
  (cls_loss_func): SigmoidFocalClassificationLoss()
  (reg_loss_func): WeightedSmoothL1Loss()
  (dir_loss_func): WeightedCrossEntropyLoss()
  (conv_cls): Conv2d(384, 18, kernel_size=(1, 1), stride=(1, 1))
  (conv_box): Conv2d(384, 42, kernel_size=(1, 1), stride=(1, 1))
  (conv_dir_cls): Conv2d(384, 12, kernel_size=(1, 1), stride=(1, 1))
)

2. AnchorHeadSingle训练前向传播

AnchorHeadSingle模块前向传播的结构图如下所示:
在这里插入图片描述

传入dense_head时的数据字典结构如下所示,这里主要需要对spatial_feature_2d的特征进行进一步的处理:
在这里插入图片描述

在AnchorHeadSingle模块时已经分别构建的各分类、回归的head,那么这里首先就是让spatial_feature_2d特征分别通过这些head来进行对应object的预测,然后见所有的预测结构存储在self.forward_ret_dict字典中。
在这里插入图片描述

随后根据相关的gt boxes信息构建gt信息,调用基类的self.target_assigner.assign_targets函数,同样的将结果存储在self.forward_ret_dict字典中
在这里插入图片描述

后续的过程就是机遇这个forward_ret_dict字典,分别调用self.get_cls_layer_loss()、self.get_box_reg_layer_loss()来进行具体的损失计算。

3. AnchorHeadSingle测试前向传播

在还没进行是训练还是测试过程时候,此时的data_dict还是一致的。
在这里插入图片描述

但是,在测试过程中,这里根据的各预测的特征矩阵来生成box,代码如下,更新了是两个预测信息:batch_cls_preds和batch_box_preds。

# 测试过程
if not self.training or self.predict_boxes_when_training:
    batch_cls_preds, batch_box_preds = self.generate_predicted_boxes(   # 根据各类预测矩阵生成预测box
        batch_size=data_dict['batch_size'],     # 设置的batch_size为16
        cls_preds=cls_preds, box_preds=box_preds, dir_cls_preds=dir_cls_preds   # 各预测特征map
    )
    data_dict['batch_cls_preds'] = batch_cls_preds  # (16, 321408, 7)
    data_dict['batch_box_preds'] = batch_box_preds  # (16, 321408, 3)
    data_dict['cls_preds_normalized'] = False

将预测的特征矩阵更新在data_dict中,返回的data_dict结果如下所示:
在这里插入图片描述

随后,返回结束了dense_head模块的处理返回的pointpillars算法中,在后续的处理是将更新后的data_dict传入到检测模型的基类Detector3DTemplate.post_processing函数中进行后处理操作。


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

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

相关文章

人人可用的开源数据可视化分析工具

大家好,我是互联网架构师! 在互联网数据大爆炸的这几年,各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的 BI 工具。 借助这些 BI 工具,我们能够大幅提升数据分析效率、生成更高质量的项目报告,让用…

UE4/5中DataTable数据表的使用

我们在UE中经常要对配置数据进行编辑,用好UE自己的DataTable自然对日常使用有所帮助。 1.蓝图使用流程 1.1 DataTable创建 使用数据表首先得创建自定义结构体,这样才好定义每一行的格式,例如这里创建如下: 然后右键选择创建Da…

LiveGBS流媒体平台GB/T28181功能-NVR硬件下级平台级联上来的通道如何过滤过滤通道类型

LiveGBS流媒体平台GB/T28181功能-NVR硬件下级平台级联上来的通道如何过滤过滤通道类型 1、上来的通道多了怎么办?2、过滤通道类型2.1、设备单独过滤2.2、全局过滤通道类型 3、过滤指定通道国标编号4、搭建GB28181视频直播平台 1、上来的通道多了怎么办? 下级平台或是NVR设备…

个人黄金投资好做吗?黄金投资交易优势体现在哪些方面

黄金的高保值性深受市场喜爱,它兼具商品和货币的双重属性。不仅实物黄金备受青睐,就连黄金投资交易也受到市场喜爱。黄金投资交易优势主要有哪些要点呢? 黄金投资交易优势一、稀有性 黄金的价值是固有的、内在的,具有千年不朽的稳…

跟庄买股票得新技巧(2023.05.16)(第二弹)

北向资金(也叫聪明的钱),它如何潜伏的(上周) 设么,你投诉大叔不写代码?好吧给你北向资金的代码 { 选股条件: 北向资金流入是昨天的两倍以上 } 百分比:REF(GPJYVALUE(6,1,1),1)>…

HttpClient5如何设置代理

文章目录 说明原始HttpClient代理HttpClient总结 说明 在这篇文章中会对HttpClient5如何进行代理进行说明,我的HttpClient版本是5.2.1。在进行代理之前请先准备好代理服务器。 原始HttpClient 下面是没有进行代理设置的代码,尝试去访问openai接口 Tes…

监控室值班人员脱岗睡岗识别算法 yolov7

监控室值班人员脱岗睡岗识别算法基于Yolov7深度学习神经网络算法,监控室值班人员脱岗睡岗识别算法模型可以7*24小时不间断自动人员是否在工位上(脱岗睡岗玩手机),若人员没有在工位,系统则立即抓拍告警,算法…

GBASE南大通用携手长亮科技 重磅推出金融数据仓库联合解决方案

随着数字化转型进程深入,金融企业对数据赋能的需求更加迫切,如何融合内外部业务数据,实现数据纵向贯通、横向穿透,让数据资源真正成为业务发展的新引擎;同时,信创浪潮风起云涌,数据库作为底层软…

深度学习语义分割篇——FCN源码解析篇

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊往期回顾:深度学习语义分割篇——FCN原理详解篇 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞👍&…

分享Python采集66个菜单导航,总有一款适合您

分享Python采集66个菜单导航,总有一款适合您 Python采集的66个菜单导航下载链接:https://pan.baidu.com/s/11ElCiEa6OesmPxY6U9320w?pwdvdok 提取码:vdok jQuery手风琴滑动下拉菜单展开收缩代码 JS树形结构下拉列表菜单选择代码 简单的…

人脸识别2:InsightFace实现人脸识别Face Recognition(含源码下载)

目录 1. 前言 2. 项目安装 3. 人脸识别系统 (1)人脸检测和关键点检测 (2)人脸校准 (3)人脸特征提取 (4)人脸比对(1:1) (5)人脸搜索(1:N) &#xff08…

将数组中的“缺失值”“正无穷大”“负无穷大”替换为指定的数值np.nan_to_num()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将数组中的“缺失值”“正无穷大” “负无穷大”替换为指定的数值 np.nan_to_num() 选择题 下列说法错误的是? import numpy as np a np.array([11,-22,np.nan,np.inf,-np.inf]) print(&q…

Cefsharp113.1.40版本功能体验(支持MP3,不支持H264)-winform

下载包本地更新:NuGet Gallery | CefSharp.WinForms 113.1.40 因许可问题,不支持H264/AAC。Due to licensing issues default builds do not support proprietary codecs like H264/AAC, sites like Netflix/Twitter/Instagram/Facebook/Spotify/Apple Music wont play vide…

MS CoCo数据集

一、前言 Ms CoCo数据集是一个非常大型且常用的数据集,可以做的任务有目标检测、图像分割、图像描述等 数据集地址:链接 描述数据集的论文地址:链接 有一点需要注意:数据集的物体类别分为80类和91类两种,其中object80类…

ThingsBoard自定义万能查询节点entity query node

1、概述 大家好,我又更新干货了,还是那句话,我绝不分享那些照抄官网翻译的东西来骗订阅,我觉得那是浪费时间,要搞就搞干货,今天给大家分享ThingsBoard如何自定义规则节点,而且是万能查询节点,这是本人经过多次研究搞出来的,这个节点有什么特别之处呢?这个节点几乎可…

vue脚手架:路由的配置和使用

一、路由的配置和使用 1、引入router 在创建项目的时候可以默认用Vue脚手架中的自动生成路由文件或者自己下载(注意vue和vue-router版本的对应关系) 2、创建路由组件并引入: 在views文件夹中创建2个.vue文件作为路由组件: 引…

报表开发组件FastReport Mono v2023.1 - 支持与My Reports Cloud集成

FastReport Mono v2023.1现已推出! 最新版中更新了与 My Reports Cloud 的部分集成、来自 JasperReports 的模板转换器等功能,同时修复了10余处问题,点击下方免费试用哦~ FastReport Mono v2023.1现已推出! 今天将为大家带来FastReport Mono v2023.1更新…

【k8s】【ELK】基于节点DaemonSet运行日 志Agent实践【待写】

1.日志收集场景分析与说明 部署架构说明 对于那些将日志输出到&#xff0c;stdout与stderr的Pod&#xff0c; 可以直接使用DaemonSet控制器在每个Node节点上运行一个 <font colorred>filebeat、logstash、fluentd </font>容器进行统一的收集&#xff0c;而后写入…

使用doop识别最近commons text漏洞的污点信息流

作者&#xff1a;vivo 互联网安全团队 - Chen Haojie 本文基于笔者对doop静态程序分析框架源代码和规则学习&#xff0c;并结合对目前漏洞公开技术细节的学习&#xff0c;修改增强doop app only模式下的分析规则后&#xff0c;实现通过doop工具识别commons text rce漏洞&#…

【QuartusII】0-创建工程模板

一、创建工程 1、激活安装quartus II软件后&#xff0c;打开即见如下界面 2、在菜单栏 “File -> New Project Wizard…”中&#xff0c;进入创建工程流程 3、第一部分&#xff0c;如下图&#xff0c;配置路径、项目名称、以及顶层文件&#xff08;类似C语言的main&#xf…