地平线静态目标检测 MapTR 参考算法-V1.0

简介

高清地图是自动驾驶系统的重要组件,提供精确的驾驶环境信息和道路语义信息。传统离线地图构建方法成本高,维护复杂,使得依赖车载传感器的实时感知建图成为新趋势。早期实时建图方法存在局限性,如处理复杂地图元素的能力不足、缺乏实例级信息等,在实时性和后处理复杂度上存在挑战。

为了解决这些问题,基于 Transformer 的 MapTR 模型被提出,它采用端到端结构,仅使用图像数据就能实现高精度建图,同时保证实时性和鲁棒性。MapTRv2 在此基础上增加了新特性,进一步提升了建图精度和性能。

地平线面向智驾场景推出的 征程6 系列(J6)芯片,在提供强大算力的同时带来了极致的性价比,征程6 芯片对于 Transformer 模型的高效支持助力了 MapTR 系列模型的端侧部署。本文将详细介绍地平线算法工具链在 征程6 芯片部署 MapTR 系列模型所做的优化以及模型端侧的表现。

性能精度指标

模型配置:

模型数据集

图片

性能精度表现:

图片

  1. 预测的地图元素:“divider”,“ped_crossing”,“boundary”;
  2. 默认使用 Lidar 坐标系,和公版保持一致。同时适配 ego 坐标系;
  3. 量化配置 TopK:前 K 个量化敏感的算子。

公版模型介绍

MapTR

在这里插入图片描述

MapTR 模型的默认输入是车载摄像头采集到的 6 张相同分辨率的环视图像,使用 nuScenes 数据集,同时也支持拓展为多模态输入例如雷达点云。模型输出是矢量化的地图元素信息,其中地图元素为人行横道、车道分隔线和道路边界 3 种。模型主体采用 encoder-decoder 的端到端结构:

  • Map Encoder 通过 CNN Backbone+BEV Encoder 负责提取 2D 图像特征并转换到统一的 BEV 视角。MapTR-nano 默认使用 ResNet18 作为 Backbone,MapTR-tiny 默认使用 ResNet50。MapTR 兼容多种 BEV Encoder 实现方式例如 GKT、LSS 和 IPM 等并且表现稳定,鉴于 GKT 的部署高效性以及在消融实验中的精度表现更好,公版 MapTR 使用 GKT 作为默认 BEV Encoder 实现方式。
  • Map Decoder 采用 Hierarchical Query Embedding Scheme,即从 point-level(位置)和 instance-level(轮廓)显式地编码地图元素,point-level queries 被所有 instances 共享并融合进 instance-level queries 从而生成 hierarchical queries,hierarchical queries 经过级联的 decoder layers(默认是 6 层)不断更新。每个 decoder layer 首先使用多头自注意力(MHSA)做 inter-instance 和 intra-instance 的信息交互,接着会使用 Deformable Attention 来与 Map Encoder 输出的 BEV 特征做信息交互。point-level 的信息被所有 instance 共享,所以对于每个 instance 而言,映射到 BEV 空间的多个参考点 reference points 是灵活且动态分布的,这对于提取 long-range context information 预测随机形状的地图元素是有益的。
  • MapTR Head 由分类分支和回归分支构成。分类分支预测 instances 的类别,回归分支预测 points 集合的位置。Head 输出的预测值和真值 GT 之间采用 Hierarchical Bipartite Matching 实现监督学习,分为 Instance-level Matching 和 Point-level Matching,因此损失函数为三个部分的加权和:分类 Classification Loss、点对点位置 Point2point Loss 和连接边方向 Edge Direction Loss。

MapTRv2

在这里插入图片描述

MapTRv2 在 MapTR 的基础上增加了新的特性:

  1. 针对层次化 query,引入解耦自注意力,极大地减少了计算量和显存消耗;对于和输入特征交互的 cross-attention 部分,则引入了 BEV、PV 和 BEV+PV 三种变体;
  2. 引入辅助 one-to-many 集合预测分支,增加了正样本数,加速了训练收敛;
  3. 引入辅助 dense supervision,引入深度估计预测头、PV 和 BEV 视角下的分割头,进一步提升模型精度。由于引入深度信息做监督学习,为了显式地提取深度信息,公版 MapTRv2 选择基于 LSS 的 BEVPoolv2 来作为 BEV 视角转换方式;
  4. 引入新的地图元素车道中心线(centerline);
  5. 增加 3D 地图元素预测能力,并提供 Argoverse2 数据集上的指标。

地平线部署说明

地平线参考算法使用流程请参考附录《TCJ6007-J6 参考算法使用指南》;对应高效模型设计建议请参考附录《TCJ6005-J6 平台算法设计建议》

模型对应的代码路径:

模块代码路径

模块代码路径
Config{oe_path}/samples/ai_toolchain/horizon_model_train_sample/scripts/configs/map/maptrv2_resnet50_bevformer_nuscenes.py
Model Structure/usr/local/lib/python3.10/dist-packages/hat/models/structures/maptr/maptrv2.py: class MapTRv2(nn.Module)
Backbone/usr/local/lib/python3.10/dist-packages/hat/models/backbones/resnet.py: class ResNet50(ResNet)
Neck/usr/local/lib/python3.10/dist-packages/hat/models/necks/fpn.py: class FPN(nn.Module)
View Transformer/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/bevformer/view_transformer.py: class SingleBevFormerViewTransformer(BevFormerViewTransformer)其中包含的BEV Encoder模块:/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/bevformer/encoder.py: class SingleBEVFormerEncoder(BEVFormerEncoder)
BEV Decoder/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/maptr/decoderv2.py: class MapTRPerceptionDecoderv2(nn.Module)其中具体包含的BEV Decoder模块:/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/maptr/decoder.py: class MapTRDecoder(nn.Module)
Criterion/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/maptr/criterion.py: class MapTRCriterion(nn.Module)其中的Assigner模块:/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/maptr/assigner.py: class MapTRAssigner(nn.Module)
Post Process/usr/local/lib/python3.10/dist-packages/hat/models/task_modules/maptr/postprocess.py: class MapTRPostProcess(nn.Module)

性能优化

Neck

Neck 部分采用了地平线内部实现的 FPN,相比公版 FPN 实现,在 征程6 平台上性能更加友好。

View Transformer

地平线参考算法版本将基于 LSS 的视角转换方式替换为 Bevformer 的 View Transformer 部分。

  1. BEV Grid 尺寸:对于 Dense BEV 而言,BEV Grid 的尺寸大小实际地影响模型性能。征程6 平台增强了带宽能力,但仍需注意 BEV 网格过大导致访存压力过大而对性能带来负面影响,建议考虑实际部署情况选择合适的 BEV 网格大小来设计模型。相比公版 MapTRv2 模型使用 200x100 的网格,地平线部署模型使用 100x50 的网格来实现性能和精度的平衡。
  2. BEV 特征编码:
    1. 默认 prev_bev 由 cur_bev 改为全 0;
    2. 取消 can_bus 信息的使用,前一帧 bev 特征 prev_bev 和当前帧 cur_bev 的对齐方式由使用 can_bus 信息正向校准改为使用 GridSample 算子反向采样校准;
    3. 取消了 bev_query 初始化部分和 can_bus 的融合;
    4. 取消了公版的 TemporalSelfAttention,改为 HorizonMSDeformableAttention,提升速度。
公版模型
class MapTRPerceptionTransformer(BaseModule):...def attn_bev_encode(...):...if prev_bev is not None:if prev_bev.shape[1] == bev_h * bev_w:prev_bev = prev_bev.permute(1, 0, 2)if self.rotate_prev_bev:for i in range(bs):# num_prev_bev = prev_bev.size(1)rotation_angle = kwargs['img_metas'][i]['can_bus'][-1]tmp_prev_bev = prev_bev[:, i].reshape(bev_h, bev_w, -1).permute(2, 0, 1)tmp_prev_bev = rotate(tmp_prev_bev, rotation_angle,center=self.rotate_center)tmp_prev_bev = tmp_prev_bev.permute(1, 2, 0).reshape(bev_h * bev_w, 1, -1)prev_bev[:, i] = tmp_prev_bev[:, 0]# add can bus signalscan_bus = bev_queries.new_tensor([each['can_bus'] for each in kwargs['img_metas']])  # [:, :]can_bus = self.can_bus_mlp(can_bus[:, :self.len_can_bus])[None, :, :]bev_queries = bev_queries + can_bus * self.use_can_bus...
地平线参考算法
class BevFormerViewTransformer(nn.Module):...def 
__init__
(...):...self.prev_frame_info = {"prev_bev": None,"scene_token": None,"ego2global": None,}...def get_prev_bev(...):if idx == self.queue_length - 1 and self.queue_length != 1:prev_bev = torch.zeros((bs, self.bev_h * self.bev_w, self.embed_dims),dtype=torch.float32,device=device,)...else:prev_bev = self.prev_frame_info["prev_bev"]if prev_bev is None:prev_bev = torch.zeros((bs, self.bev_h * self.bev_w, self.embed_dims),dtype=torch.float32,device=device,) # 对应改动 2.a...def bev_encoder(...):...tmp_prev_bev = prev_bev.reshape(bs, self.bev_h, self.bev_w, self.embed_dims).permute(0, 3, 1, 2)prev_bev = F.grid_sample(tmp_prev_bev, norm_coords, "bilinear", "zeros", True) # 对应改动 2.b...
class SingleBevFormerViewTransformer(BevFormerViewTransformer):...def get_bev_embed(...):...bev_query = self.bev_embedding.weightbev_query = bev_query.unsqueeze(1).repeat(1, bs, 1) # 对应改动 2.c...
公版模型 Config
model = dict(...pts_bbox_head=dict(type='MapTRHead',...transformer=dict(type='MapTRPerceptionTransformer',...encoder=dict(type='BEVFormerEncoder',...transformerlayers=dict(type='BEVFormerLayer',attn_cfgs=[dict(type='TemporalSelfAttention',embed_dims=
_dim_
,num_levels=1),...]))))
)
地平线参考算法 Config
model = dict(...view_transformer=dict(type="SingleBevFormerViewTransformer",...encoder=dict(type="SingleBEVFormerEncoder",...encoder_layer=dict(type="SingleBEVFormerEncoderLayer",...selfattention=dict(type="HorizonMSDeformableAttention", # 对应改动 2.d...),)))
)

Attention

模型中用到的 attention 操作均使用地平线提供的算子,相比 PyTorch 提供的公版算子,地平线 attention 算子在保持算子逻辑等价的同时在效率上进行了优化

from hat.models.task_modules.bevformer.attention import (HorizonMSDeformableAttention,HorizonMSDeformableAttention3D,HorizonSpatialCrossAttention,
)

精度优化

量化精度

  1. 对模型中量化敏感的 Top30 个算子采用 Int16 精度量化:
Config 文件
if os.path.exists(pts_path):pts_table = torch.load(pts_path)cali_qconfig_setter = (sensitive_op_calibration_8bit_weight_16bit_act_qconfig_setter(pts_table,topk=30,ratio=None,),default_calibration_qconfig_setter,)qat_qconfig_setter = (sensitive_op_qat_8bit_weight_16bit_fixed_act_qconfig_setter(pts_table,topk=30,ratio=None,),default_qat_fixed_act_qconfig_setter,)
  1. QAT 训练采用固定较小的 learning rate 来 fine-tune,这里固定也即取消 LrUpdater Callback 的使用,配置如下:
Config 文件
float_lr = 6e-4
qat_lr = 1e-6
  1. 取消了公版模型 MapTRHead 中对于量化不友好的 inverse_sigmoid 操作;此外部署模型取消了 MapTRHead 中 reg_branches 输出和 reference 相加后再 sigmoid 的操作(该操作可以转移到部署后处理中完成):
公版模型
class MapTRHead(DETRHead):...def forward(...):...for lvl in range(hs.shape[0]):if lvl == 0:# import pdb;pdb.set_trace()reference = init_referenceelse:reference = inter_references[lvl - 1]reference = inverse_sigmoid(reference)...tmp = self.reg_branches
[lvl](...)tmp[..., 0:2] += reference[..., 0:2]tmp = tmp.sigmoid() # cx,cy,w,h地平线参考算法
class MapTRPerceptionDecoderv2(nn.Module):...def get_outputs(...):...for lvl in range(len(outputs_classes)):reference = reference_out[lvl].float()# reference = inverse_sigmoid(reference)...tmp = bbox_outputs[lvl].float()tmp[..., 0:2] += reference[..., 0:2]tmp = tmp.sigmoid()...def forward(...):outputs = self.bev_decoder(...)if self.is_deploy:return outputs...outputs = self.get_outputs(...)...return self._post_process(data, outputs)

其他优化

设计优化

  1. 在 View Transformer,使用 Bevformer 替换地平线支持不友好的公版 MapTRv2 基于 LSS 的 BEVPoolv2 来作为 PV 视角转 BEV 视角的方式;
  2. 在 View Transformer 的 BEV Encoder 模块取消了 BEV 特征的时序融合,也取消了 Bevformer 时序自注意力模块,模型整体精度不低于公版基于 Bevformer 的精度。

总结与建议

部署建议

  1. 遵循硬件对齐规则,一般的 tensor shape 对齐到 2 的幂次,conv-like 的算子 H 维度对齐到 8、W 维度对齐到 16、C 维度对齐到 32,若设计尺寸不满足对齐规则时会对 tensor 自动进行 padding,造成无效的算力浪费;
  2. 合理选择 BEV Grid 尺寸,征程6 平台的带宽得到增强,但仍需考虑 BEV Grid 尺寸对模型性能的影响,并且综合衡量模型精度预期,选择合适的 BEV Grid 尺寸以获得模型性能和精度的平衡;
  3. 优先选择 征程6 平台高效 Backbone 来搭建模型,高效 Backbone 经过在 征程6 平台的反复优化和验证,相比其他 Backbone 的选择,在性能和精度上可以同时取得出众的效果,因此选取 征程6 平台高效 Backbone 来搭建模型可以对整个场景模型带来性能和精度的增益。

总结

本文通过对 MapTRv2 进行地平线量化部署的优化,使得模型在 征程 6 计算平台上用较低的量化精度损失,获得单核 26.66 FPS 的部署性能。同时,MapTRv2 的部署经验可以推广到其他相似结构或相似使用场景模型的部署中。

对于地平线 MapTR 参考算法模型,Backbone 和 BEV 中融合方式等的优化仍在探索和实践中,Stay Tuned!

附录

  1. 公版论文:MapTR;
  2. 公版模型源码:GitHub-MapTR。

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

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

相关文章

品牌互鉴,融通中外|AORO遨游创始人受邀参加2024北京国际品牌周

2024年9月21日,第三届北京国际品牌周在北京金融街英蓝国际金融中心举办,本次盛会以“品牌互鉴,融通中外”为主题,由中国国际商会、中国国际公共关系协会、中国文化管理协会、北京国际设计周主办,中国外文局文化传播中心…

LSM-YOLO: A Compact and Effective ROI Detector for Medical Detection

LSM-YOLO: A Compact and Effective ROI Detector for Medical Detection LSM-YOLO: 一种紧凑且有效的医学检测ROI检测器1.介绍2.相关工作2.1医学感兴趣区域(ROI)检测2.2多尺度特征用于对象检测 3方法3.1LAE(轻量级自适应提取)3.2MSFM(多路径…

GESP等级考试C++二级-switch...case的用法

在《GESP等级考试C二级if语句》中提到,可以使用if...else if...else语句来处理多种可能的情况。在C中,使用switch...case语句也可以来处理多种可能。 1 switch...case语句的格式 switch...case语句的格式如图1所示。 图1 switch...case语句的格式 其中…

鸿蒙开发(NEXT/API 12)【基础功能(使用剪贴板进行复制粘贴)】剪贴板服务

场景介绍 [剪贴板]为开发者提供数据的复制粘贴能力。 当需要使用复制粘贴等功能时&#xff0c;例如&#xff1a;复制文字内容到备忘录中粘贴&#xff0c;复制图库照片到文件管理粘贴&#xff0c;就可以通过剪贴板来完成。 约束限制 剪贴板内容大小<128MB。为保证剪贴板数…

【TabBar嵌套Navigation案例-产品推荐页面-UICollectionView-结合xib使用 Objective-C语言】

一、接下来,我们来说这个产品推荐页面 1.首先呢,它是一个CollectionViewController,当我点击这个产品推荐的时候, 这个Cell的时候,我要跳到一个CollectionViewController, 所以呢,我们需要先找到产品推荐,然后给它去添加一个targetVC,然后给它push到一个产品推荐的页面…

AI大模型的前十岗位薪资,谁还说读书没用?零基础入门到精通,收藏这一篇就够了

1. AI系统架构师 薪资范围&#xff1a;100万 - 200万/年 职位要求&#xff1a;需要具备全面的技术背景&#xff0c;精通系统架构设计&#xff0c;能够有效整合AI技术&#xff0c;提升系统性能。要求硕士及以上学历&#xff0c;计算机科学或相关专业背景。 目标院校&#xff1…

使用Conda配置python环境到Pycharm------Window小白版

使用Conda配置python环境到Pycharm 一、Conda安装和环境配置1.1 安装Conda软件1.2 判断是否安装成功1.3 创建Conda虚拟环境 二、 pycharm的安装2.1 Pycharm使用手册2.2 安装pycharm 三、 pycharm导入Conda环境 一、Conda安装和环境配置 anaconda官网 1.1 安装Conda软件 运行…

如何装修阿里巴巴国内1688平台淡入淡出效果首页特效1688店铺装修模板旺铺装修阿里店铺首页怎么装修全阿里

1688运营1688批发首页1688装修模板1688店铺怎么装修模板自定义装修代码1688店铺装修模板旺铺装修阿里店铺首页怎么装修1688店铺装修教程视频全屏通栏代码1688店铺装修模板阿里巴巴店铺装修设计 如何装修阿里巴巴国内1688平台淡入淡出效果首页特效1688店铺装修模板旺铺装修阿里店…

Actions Speak Louder than Words Meta史诗级的端到端推荐大模型落地

发现好久之前整理的推荐系统被遗忘在了草稿箱&#xff0c;让它出来见见世面。。。后续空了持续更新 1.Background 大模型生成用于推荐场景有如下几个难点&#xff1a; 特征缺乏显式结构。存在sparse和dense特征&#xff0c;其中sparse特征指的是一些离散特征&#xff0c;这部…

不再错过任何一个区块!用Node.js + WebSocket轻松实现区块链实时监控

文章目录 前言一、WebSocket是什么&#xff1f;二、项目结构三、代码实现1. 后端实现2. 前端实现 四、启动项目总结 前言 随着区块链技术的发展&#xff0c;实时监控区块链网络中的区块和交易信息变得越来越重要。无论是开发去中心化应用&#xff08;DApp&#xff09;&#xf…

shell脚本(2)

作业&#xff1a; 1.统计家目录下.c文件个数 #!/bin/bash num0 for file in ls ~/*.c do((num)) done echo "家目录中.c文件数:$num" 2定义一个稀疏数组&#xff08;下标不连续&#xff09;&#xff0c;写一个函数求稀疏数组中的和&#xff0c;要求稀疏数组中的数…

p18 docker镜像原理之联合文件系统,p19 docker镜像分层的理解

镜像是什么 镜像其实就是一种轻量级的&#xff0c;可执行的一种软件包&#xff0c;用来打包基于环境开发的软件&#xff0c;里面可以包括代码&#xff0c;环境&#xff0c;数据库&#xff0c;配置文件等信息 如何得到镜像&#xff1f; 可以从镜像仓库下载比方说dockerhub 比…

10种数据库技术的发展历程与现状

数据库是互联网的基石&#xff0c;存储着海量信息&#xff0c;使信息可被高效地组织、检索和分享。没有数据库&#xff0c;网站无法记忆用户数据&#xff0c;应用无法提供个性化服务&#xff0c;信息交流将失去智能与连贯性。因此&#xff0c;数据库技术极大地推动了互联网的发…

多态的使用和原理(c++详解)

一、多态的概念 多态顾名思义就是多种形态&#xff0c;它分为编译时的多态&#xff08;静态多态&#xff09;和运行时的多态&#xff08;动态多态&#xff09;&#xff0c;编译时多态&#xff08;静态多态&#xff09;就是函数重载&#xff0c;模板等&#xff0c;通过不同的参数…

《论软件系统架构风格》写作框架,软考高级系统架构设计师

论文真题 系统架构风格&#xff08;System Architecture Style&#xff09;是描述某一特定应用领域中系统组织方式的惯用模式。架构风格定义了一个词汇表和一组约束&#xff0c;词汇表中包含一些构件和连接件类型&#xff0c;而这组约束指出系统是如何将这些构件和连接件组合起…

深度学习训练中的三种网络:监督、半监督和无监督的联系与区别

深度学习训练中&#xff0c;根据训练数据是否有标签&#xff0c;可以将网络分为三大类&#xff1a;监督学习、半监督学习和无监督学习。 目录 一、监督学习网络1.1 特点1.2 典型任务1.3 举例 二、半监督学习网络2.1 特点2.2 典型任务2.3 举例 三、无监督学习网络3.1 特点3.2 典…

两倍多的程序员,不等于两倍多的代码

两倍多的工程师&#xff0c;并不会交付两倍多的代码。为什么很多老板就是想不明白这道理呢&#xff1f;今天这篇文章&#xff0c;咱们就讨论下这事情。 有时候&#xff0c;两件不相关的事情通过一件事情联系起来后&#xff0c;会让我们产生一些非理性想法&#xff0c;甚至相信…

Python自动化-操作Excel

在数据处理和报表生成过程中&#xff0c;Excel是一个经常使用的工具。Python中的openpyxl库可以让您通过编程方式读取、写入和操作Excel文件&#xff0c;从而实现自动化的数据处理和报表生成。本文将介绍openpyxl库的基本用法和常见操作&#xff0c;帮助您快速上手使用Python处…

【android10】【binder】【3.向servicemanager注册服务】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …

依赖不对应导致java文件不能正常显示

项目中若出现非正常显示的java文件&#xff0c;检查下是否依赖版本不对应。&#xff08;前提必须是maven项目&#xff09;