BEV 中 multi-frame fusion 多侦融合(一)

文章目录

    • 参数设置
    • align_dynamic_thing:为了将动态物体的点云数据从上一帧对齐到当前帧
      • 流程
    • 旋转函数
    • 平移公式
    • filter_points_in_ego:筛选出属于特定实例的点
    • get_intermediate_frame_info: 函数用于获取中间帧的信息,包括点云数据、传感器校准信息、自车姿态、边界框及其对应的实例标识等
    • intermediate_keyframe_align 函数用于将前一帧的点云数据对齐到当前帧的自车坐标系中,并返回对齐后的点云数据和标签。
    • prev2ego 函数用于将前一帧的点云数据转换到当前帧的自车坐标系中。该函数考虑了旋转和平移,并可选地应用速度和时间差来进行额外的位移校正。
    • nonkeykeyframe_align 函数用于将非关键帧的点云数据对齐到当前帧的自车坐标系中
    • 将前一帧的点云数据对齐到当前帧的自车坐标系中
    • 为未标记的中间点云数据搜索标签

必要的包

from nuscenes.nuscenes import NuScenes
from pyquaternion import Quaternion
from nuscenes.utils.data_classes import LidarPointCloud
import numpy as np
from open3d import *
from nuscenes.utils.data_io import load_bin_file
from nuscenes.utils.geometry_utils import points_in_box
import os.path as osp
from functools import partial
from utils.points_process import *
from sklearn.neighbors import KDTree
import open3d as o3d
import argparse

初始化全局字典,用于存储中间静态点、姿态和标签

INTER_STATIC_POINTS = {}
INTER_STATIC_POSE = {}
INTER_STATIC_LABEL = {}

参数设置

dataroot: 数据集的根路径,类型为字符串,默认值为 ‘./project/data/nuscenes/’。

  • save_path: 保存路径,类型为字符串,默认值为 ‘./project/data/nuscenes//occupancy2/’,该参数是可选的。
  • num_sweeps: 每个示例的激光雷达扫描次数,类型为整数,默认值为 10,该参数是可选的。
def parse_args():parser = argparse.ArgumentParser(description='Data converter arg parser')parser.add_argument('--dataroot',type=str,default='./project/data/nuscenes/',help='specify the root path of dataset')parser.add_argument('--save_path',type=str,default='./project/data/nuscenes//occupancy2/',required=False,help='specify sweeps of lidar per example')parser.add_argument('--num_sweeps',type=int,default=10,required=False,help='specify sweeps of lidar per example')args = parser.parse_args()return args

align_dynamic_thing:为了将动态物体的点云数据从上一帧对齐到当前帧

def align_dynamic_thing(box, prev_instance_token, nusc, prev_points, ego_frame_info):if prev_instance_token not in ego_frame_info['instance_tokens']:box_mask = points_in_box(box,prev_points[:3, :])return np.zeros((prev_points.shape[0], 0)), np.zeros((0, )), box_maskbox_mask = points_in_box(box,prev_points[:3, :])box_points = prev_points[:, box_mask].copy()prev_bbox_center = box.centerprev_rotate_matrix = box.rotation_matrixbox_points = rotate(box_points, np.linalg.inv(prev_rotate_matrix), center=prev_bbox_center)target = ego_frame_info['instance_tokens'].index(prev_instance_token)ego_boxes_center = ego_frame_info['boxes'][target].centerbox_points = translate(box_points, ego_boxes_center-prev_bbox_center)box_points = rotate(box_points, ego_frame_info['boxes'][target].rotation_matrix, center=ego_boxes_center)box_points_mask = filter_points_in_ego(box_points, ego_frame_info, prev_instance_token)box_points = box_points[:, box_points_mask]box_label = np.full_like(box_points[0], nusc.lidarseg_name2idx_mapping[box.name]).copy()return box_points, box_label, box_mask

流程

  1. 检查实例标识:
    if prev_instance_token ∉ ego_frame_info[‘instance_tokens’]:
    box_mask = points_in_box(box, prev_points[:3, :])
    return (0, 0, box_mask)

  2. 计算边界框内的点:
    box_mask = points_in_box(box, prev_points[:3, :])
    box_points = prev_points[:, box_mask]

  3. 获取上一帧边界框的中心和旋转矩阵:
    C_prev = box.center
    R_prev = box.rotation_matrix

  4. 将点旋转到原点并平移到当前帧的中心:
    box_points = R_prev^-1 * (box_points - C_prev)

  5. 获取目标边界框的中心和旋转矩阵:
    target = ego_frame_info[‘instance_tokens’].index(prev_instance_token)
    C_ego = ego_frame_info[‘boxes’][target].center
    R_ego = ego_frame_info[‘boxes’][target].rotation_matrix

  6. 平移到当前帧的中心并再次旋转:
    box_points = box_points + (C_ego - C_prev)
    box_points = R_ego * box_points

  7. 过滤当前帧边界框内的点:
    box_points_mask = points_in_box(ego_frame_info[‘boxes’][target], box_points[:3, :])
    box_points = box_points[:, box_points_mask]

  8. 生成点云数据的标签:
    box_label = full_like(box_points[0], nusc.lidarseg_name2idx_mapping[box.name])

  9. 返回结果:
    return (box_points, box_label, box_mask)

numpy.full_like()是根据现有数组的形状和数据类型来创建新数组,而numpy.full()则需要手动指定形状和数据类型。

旋转函数

def rotate(points, rot_matrix: np.ndarray, center=None) -> np.array:"""Applies a rotation.:param rot_matrix: <np.float: 3, 3>. Rotation matrix."""if center is not None:points[:3, :] = np.dot(rot_matrix, points[:3, :]-center[:, None]) + center[:, None]else:points[:3, :] = np.dot(rot_matrix, points[:3, :])return points

在这里插入图片描述

平移公式

def translate(points, x: np.ndarray) -> np.array:"""Applies a translation to the point cloud.:param x: <np.float: 3, 1>. Translation in x, y, z."""for i in range

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

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

相关文章

电脑怎么录音?分享2种音频录制方法

在日常生活和工作中&#xff0c;我们经常需要录制电脑上的音频&#xff0c;无论是为了记录会议内容、保存网络课程&#xff0c;还是为了制作自己的音频素材&#xff0c;录音功能都显得尤为重要。那么电脑怎么录音&#xff1f;本文将详细介绍2种方法教你如何在电脑上进行录音&am…

Qt做群控系统

群控系统顾名思义&#xff0c;一台设备控制多台机器。首先我们来创造下界面。我们通过QT UI设计界面。设计界面如下&#xff1a; 登录界面&#xff1a; 登录界面分为两种角色&#xff0c;一种是管理员&#xff0c;另一种是超级管理员。两种用户的主界面是不同的。通过选中记住…

构建专属Web SSH客户端:从零到一打造你的在线运维利器

随着云服务和远程工作的普及&#xff0c;能够随时随地访问服务器变得越来越重要。虽然市面上已有不少成熟的SSH客户端&#xff0c;但打造一个属于自己的Web版SSH工具&#xff0c;不仅能根据个人需求定制功能&#xff0c;还能享受灵活访问的便利。 本文将带你一步步实践&#xf…

PromptMRG: Diagnosis-Driven Prompts for Medical Report Generation

文章汇总 存在的问题 罕见疾病在训练数据中的代表性不足&#xff0c;使其诊断性能不可靠。 解决办法 1&#xff1a;利用预训练的CLIP模型从数据库中检索相似的报告来辅助查询图像的诊断。 2&#xff1a;设计SDL模块根据不同疾病的学习状态自适应调整优化目标。 流程解读 文…

.Net Core WebApi 程序在Swagger API说明文档中不显示注释的解决办法

本次所用版本为 .Net6.0 现象&#xff1a;在Swagger启动后&#xff0c;API接口等不显示注释描述&#xff0c;如下&#xff1a; 在代码中找到调用AddSwaggerGen的地方&#xff0c;如下&#xff1a; builder.Services.AddSwaggerGen(); 修改为&#xff1a; builder.Services.…

【精品方案】数字孪生赋能的智慧园区物联网云平台建设方案

引言&#xff1a;随着信息技术的快速发展&#xff0c;智慧园区建设已成为城市发展的重要趋势。数字孪生技术作为智能制造和智慧城市的核心技术之一&#xff0c;为智慧园区的建设提供了全新的解决方案。本方案旨在通过构建基于数字孪生的物联网云平台&#xff0c;实现智慧园区的…

深圳比创达|EMI电磁干扰行业:从挑战到机遇的蜕变

在当今科技日新月异的时代&#xff0c;电磁干扰&#xff08;EMI&#xff09;已成为影响电子设备性能和稳定性的重要因素。EMI电磁干扰行业因此应运而生&#xff0c;致力于研究和解决电磁干扰问题&#xff0c;确保电子设备的正常运行。 一、EMI电磁干扰行业面临的挑战 随着电子…

远程桌面有时连接不上,远程桌面时连接不上的七个处理方法

远程桌面连接作为一种方便、高效的远程管理工具&#xff0c;广泛应用于企业办公、技术支持以及在线教育等多个领域。然而&#xff0c;在实际应用中&#xff0c;用户有时会遇到远程桌面连接不上的情况&#xff0c;这不仅影响了工作效率&#xff0c;还可能导致重要任务的延误。因…

基于QT和C++实现的中国象棋

一&#xff0c;源码 board.h #ifndef BOARD_H #define BOARD_H#include <QWidget> #include "Stone.h"class Board : public QWidget {Q_OBJECT public:explicit Board(QWidget *parent 0);bool _bRedTurn; // 红方先走int _currentPlayer; // 当前玩家&…

如何处理跨库查询,以保证数据一致性

如何处理跨库查询&#xff0c;以保证数据一致性&#xff1f; 处理跨库查询以保证数据一致性是一个复杂的问题&#xff0c;通常涉及到分布式数据库系统和事务管理。以下是一些关键步骤和策略&#xff1a; 使用事务: 在多个库之间执行操作时&#xff0c;确保它们作为一个原子单元…

原来设计师都在这些网站找素材、灵感的

设计师可以去哪些网站找设计素材和灵感&#xff0c;收藏好这几个网站&#xff0c;设计必备&#xff0c;提升审美的好帮手。 设计素材网站 1、菜鸟图库 菜鸟图库-免费设计素材下载 菜鸟图库一个可以免费下载设计素材的网站&#xff0c;我推荐过很多次&#xff0c;主要是站内素材…

css 三角形

方法一&#xff1a; <div class"triangle"></div>css .triangle{width: 8px;height: 8px;border: 8px solid #3C69EF;/* border-radius: 0px 2px 0 0; */ // 右上角加一点圆角border-block-end: 8px solid transparent;border-inline-start: 8px solid…

揭示西周与汉唐时期的纺织工艺

在中国新疆这片充满神秘色彩的土地上&#xff0c;每一次的考古发掘都仿佛是对历史的一次深情回望&#xff0c;揭示出中华民族悠久而灿烂的文明史。其中&#xff0c;新疆出土的西周和汉唐时期的织物&#xff0c;更是以其精美绝伦的工艺和独特的审美风格&#xff0c;让我们对古代…

基于机器学习和深度学习的C-MAPSS涡扇发动机剩余寿命RUL预测(Python,Jupyter Notebook环境)

涡扇发动机全称为涡轮风扇发动机&#xff0c;是一种先进的空中引擎&#xff0c;由涡轮喷气发动机发展而来。涡扇发动机主要特点是首级压缩机的面积比涡轮喷气发动机大。同时&#xff0c;空气螺旋桨&#xff08;扇&#xff09;将部分吸入的空气从喷射引擎喷射出来&#xff0c;并…

PTFE恒压分液漏斗150ml耐酸碱白色四氟材质塑料漏斗

四氟恒压滴液漏斗又名恒压分液漏斗&#xff0c;也是分液漏斗的一种。它和其他分液漏斗一样&#xff0c;都可以进行分液、萃取等操作。与其他分液漏斗不同的是&#xff0c;恒压分液漏斗可以保证内部压强不变&#xff0c;一是可以防止倒吸&#xff0c;二是可以使漏斗内液体顺利流…

C++ | Leetcode C++题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; class Solution { public:void addPath(vector<int> &vec, TreeNode *node) {int count 0;while (node ! nullptr) {count;vec.emplace_back(node->val);node node->right;}reverse(vec.end() - count, vec.end());}vect…

如何使用Vue3和ApexCharts创建交互式热力图?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 热力图&#xff1a;可视化数据分布 应用场景介绍 热力图是一种数据可视化技术&#xff0c;它使用颜色来表示数据点的值。热力图常用于可视化分布数据&#xff0c;例如人口密度、温度变化或网站流量。 代码基…

优化:Day52 动态规划part10

LC300最长递增子序列 dp数组中dp[i]的含义是&#xff1a;以nums[i]结尾的子序列中最长递增子序列的长度为dp[i]最长连续递增子序列 非连续最长递增子序列 如果是连续的&#xff0c;只需要nums[i]>nums[i-1]就将dp值1&#xff0c;但是如果是非连续的&#xff0c;nums[i]之前…

30天学会QT---------------大项目之在线考试系统

前段时间真的很忙很忙,忙完这段时间,总算是有空来写文章了,开始写的时候我就以为能够有时间准备和写这个,但是发现有时候忙着忙着就忘记了,没有办法来写项目,真的是非常尴尬。 现在有时间了,就有充分的时间来写了。 为了避免笔记断更,我决定先存稿来写。 1、如何规划项…

如何训练AI大模型?熬夜爆肝整理大全

随着人工智能技术的快速发展&#xff0c;大型预训练模型在自然语言处理、计算机视觉、语音识别等领域取得了显著成果。这些模型通过在海量数据上进行预训练&#xff0c;能够捕捉到丰富的特征信息&#xff0c;为各种下游任务提供强大的支持。然而&#xff0c;训练AI大模型面临着…