关于gt_sampling的理解

news2024/11/16 21:30:37

pcdet/datasets/augmentor/data_augmentor.py

    def gt_sampling(self, config=None):
        db_sampler = database_sampler.DataBaseSampler(
            root_path=self.root_path,
            sampler_cfg=config,
            class_names=self.class_names,
            logger=self.logger
        )
        return db_sampler

此函数指向DataBaseSampler类,单步调试运行到__call__函数

    def __call__(self, data_dict):
        """
        Args:
            data_dict:
                gt_boxes: (N, 7 + C) [x, y, z, dx, dy, dz, heading, ...]

        Returns:

        """
        gt_boxes = data_dict['gt_boxes']
        gt_names = data_dict['gt_names'].astype(str)
        existed_boxes = gt_boxes
        total_valid_sampled_dict = []
        sampled_mv_height = []
        sampled_gt_boxes2d = []

        for class_name, sample_group in self.sample_groups.items():
            if self.limit_whole_scene:
                num_gt = np.sum(class_name == gt_names)
                sample_group['sample_num'] = str(int(self.sample_class_num[class_name]) - num_gt)
            if int(sample_group['sample_num']) > 0:
                #取15个groud truth标签
                sampled_dict = self.sample_with_fixed_number(class_name, sample_group)

                # 求出框的坐标信息
                sampled_boxes = np.stack([x['box3d_lidar'] for x in sampled_dict], axis=0).astype(np.float32)

                assert not self.sampler_cfg.get('DATABASE_WITH_FAKELIDAR', False), 'Please use latest codes to generate GT_DATABASE'

                # 碰撞检测
                #iou1针对的是当前样本里的groud truth与从实例库中采样得到的groud truth进行iou计算,iou如果不为0,则两个发生碰撞(现实情况不可能发生)
                iou1 = iou3d_nms_utils.boxes_bev_iou_cpu(sampled_boxes[:, 0:7], existed_boxes[:, 0:7])
                #iou2针对的是实例库中采样得到的groud truth彼此之间进行iou计算,iou如果不为0,则两个发生碰撞(现实情况不可能发生)
                iou2 = iou3d_nms_utils.boxes_bev_iou_cpu(sampled_boxes[:, 0:7], sampled_boxes[:, 0:7])
                iou2[range(sampled_boxes.shape[0]), range(sampled_boxes.shape[0])] = 0
                iou1 = iou1 if iou1.shape[1] > 0 else iou2
                #将iou1和iou2中值为0的标记为ture,满足现实情况
                valid_mask = ((iou1.max(axis=1) + iou2.max(axis=1)) == 0)

                if self.img_aug_type is not None:
                    sampled_boxes2d, mv_height, valid_mask = self.sample_gt_boxes_2d(data_dict, sampled_boxes, valid_mask)
                    sampled_gt_boxes2d.append(sampled_boxes2d)
                    if mv_height is not None:
                        sampled_mv_height.append(mv_height)

                valid_mask = valid_mask.nonzero()[0]
                valid_sampled_dict = [sampled_dict[x] for x in valid_mask]
                valid_sampled_boxes = sampled_boxes[valid_mask]

                existed_boxes = np.concatenate((existed_boxes, valid_sampled_boxes[:, :existed_boxes.shape[-1]]), axis=0)
                total_valid_sampled_dict.extend(valid_sampled_dict)

        sampled_gt_boxes = existed_boxes[gt_boxes.shape[0]:, :]

        if total_valid_sampled_dict.__len__() > 0:
            sampled_gt_boxes2d = np.concatenate(sampled_gt_boxes2d, axis=0) if len(sampled_gt_boxes2d) > 0 else None
            sampled_mv_height = np.concatenate(sampled_mv_height, axis=0) if len(sampled_mv_height) > 0 else None
            '''
            将采样的groud truth标签中的点云数据添加到当前样本点云场景中去
            sampled_gt_boxes采样的groud truth的坐标、大小、偏移角
            total_valid_sampled_dict采样的groud truth,包括其内部的点云数据存储位置,点云数目,bbox,即包括sampled_gt_boxes
            '''
            data_dict = self.add_sampled_boxes_to_scene(
                data_dict, sampled_gt_boxes, total_valid_sampled_dict, sampled_mv_height, sampled_gt_boxes2d
            )

        data_dict.pop('gt_boxes_mask')
        return data_dict

关于采样多少个实例库中的groud truth标签,在配置文件中设置

在这里插入图片描述
通过函数sample_with_fixed_number采样实例库中的标签

   def sample_with_fixed_number(self, class_name, sample_group):
        """
        Args:
            class_name:
            sample_group:
        Returns:

        """
        sample_num, pointer, indices = int(sample_group['sample_num']), sample_group['pointer'], sample_group['indices']
        # 初次运行将pointer设置为0,索引随机打乱
        if pointer >= len(self.db_infos[class_name]):
            indices = np.random.permutation(len(self.db_infos[class_name]))
            pointer = 0

        #按照打乱后的索引顺序取sample_num个数,这里的sample_num设置为15
        sampled_dict = [self.db_infos[class_name][idx] for idx in indices[pointer: pointer + sample_num]]
        pointer += sample_num
        sample_group['pointer'] = pointer
        sample_group['indices'] = indices
        return sampled_dict

注意:OpenPcDet的实例库在self.db_infos
在这里插入图片描述
这里以car类为例,每一个dict内存储了一个groud truth标签,一张图片可能有多个标签,也可能只有一个(可能没有吗?)

在这里插入图片描述
从实例库中取出15个groud truth标签后,就可以进行碰撞检测了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
有效采样标签掩码(发生碰撞无效)

valid_mask = ((iou1.max(axis=1) + iou2.max(axis=1)) == 0)

将有效标签数据和当前样本的groud truth标签数据拼接则已完成了数据增强

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

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

相关文章

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅱ—— 创建和添加证书模板

目录 博文摘要3. 使用 Microsoft 证书颁发机构创建 Machine SSL 和 Solution User 证书模板3.1 打开 Certificate Template Console3.2 复制模板3.3 修改 Compatibility 选项卡3.4 修改 General 选项卡3.5 修改 Extensions 选项卡3.6 修改 Subject Name 选项卡3.7 确认新模板 4…

【送书福利-第十九期】《C++ Core Guidelines解析》

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文…

Ant Eclipse插件使用

Eclipse默认带了ant插件 编辑build.xml文件给出提示 编辑的时候,会给出提示,方便编辑: 将鼠标放在属性上方,会将属性的值显示出来: 在Eclipse中运行ant 运行默认的target build.xml文件的内容如下,…

编程入门到精通:开源学习资料整理 | 开源专题 No.37

ascoders/weekly Stars: 24.8k License: NOASSERTION 前端精读是一个每周更新的前端好文精选项目。该项目涵盖了多个领域,包括结合大厂工作经验解读的前沿技术、源码解读、一些后端技术解读和商业思考等内容。主要功能是为开发者提供优质的文章资源,帮…

springBoot web开发自动配置和默认效果

web开发自动配置和默认效果 自动配置默认配置 自动配置 绑定了配置文件的一堆配置项 1、springMVC的所有配置 spring.mvc 2、Web场景通用配置 spring.web 3、文件上传配置 spring.servlet.multipart 4、服务器的配置serve: 比如:编码方式等 默认配置 重要&#xf…

【异常、线程】全网最详细解读

【异常、线程】 主要内容 异常、线程 教学目标 能够辨别程序中异常和错误的区别 说出异常的分类 说出虚拟机处理异常的方式 列举出常见的三个运行期异常 能够使用try…catch关键字处理异常 能够使用throws关键字处理异常 能够自定义异常类 能够处理自定义异常类 说出进程的概…

python案例:六大主流小说平台小说下载

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 很多小伙伴学习Python的初衷就是为了爬取小说,方便又快捷~ 辣么今天咱们来分享6个主流小说平台的爬取教程~ 一、流程步骤 流程基本都差不多&#x…

Pi-hole:Linux 硬件级别的广告拦截器 | 开源日报 No.58

pi-hole/pi-hole Stars: 44.0k License: NOASSERTION Pi-hole 是一个通过自己的 Linux 硬件实现网络广告拦截的 DNS 陷阱,无需安装任何客户端软件即可保护设备免受不需要的内容干扰。 安装简单:对话框引导您在十分钟内完成简单安装过程坚决有效&#…

Linux进程上下文切换:理解特权模式和进程切换

Linux进程上下文切换:理解特权模式和进程切换 在Linux中,进程的运行空间被划分为内核空间和用户空间,而从用户态向内核态转换需要进行系统调用。这一过程中发生了两次CPU上下文切换: 00001. 保存用户态:将CPU寄存器…

数组之移除元素

本文旨在复习巩固 此题为leetcode上的27题 数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。 1 暴力解法 如图所示,该方法是十分麻烦的,因为每次找到val,都要删除它,让后面的元…

软件开发“自我毁灭”的七宗罪

软件开发是一门具有挑战性的学科,它建立在数以百万计的参数、变量、库以及更多必须绝对正确的因素之上。即便是一个字符不合适,整个堆栈也会随之瓦解。 多年来,软件开发团队已经想出了一些完成工作的规则。从复杂的方法论到新兴的学科和哲学…

Linux文件系统 struct inode 结构体解析

文章目录 前言一、inode 简介二、dentry 简介三、struct inode3.1 字段说明3.2 inode链表3.3 struct inode_operations3.4 inode相关函数 参考资料 前言 这篇文章介绍了VFS - struct file:Linux文件系统 struct file 结构体解析 接下来介绍VFS - struct inode&…

回首往昔,初学编程那会写过的两段愚蠢代码

一、关于判断两个整数是否能整除的GW BASIC创意代码 记得上大学时第一个编程语言是BASIC,当时Visual Basic还没出世,QBASIC虽然已经在1991年随MS-DOS5.0推出了,但我们使用的还是 GW-BASIC, 使用的教材是谭浩强、田淑清编著的《BA…

Linux虚拟机静态IP设置

1.环境配置 首先要准备好两台centos虚拟机,在高级篇部分可能有数据库主从复制,所以暂时先开两台虚拟机。 两台虚拟机需要更改: mac地址主机名ip地址UUID 1.更改主机名 更改虚拟机的主机名 vim /etc/hostname2.更改静态ip地址 /etc/sysc…

basic_sr介绍

文章目录 pytorch基础知识和basicSR中用到的语法1.Sampler类与4种采样方式2.python dict的get方法使用3.prefetch_dataloader.py4. pytorch 并行和分布式训练4.1 选择要使用的cuda4.2 DataParallel使用方法常规使用方法保存和载入 4.3 DistributedDataParallel 5.wangdb 入门5.…

5秒用Java写一个快速排序算法?这个我在行

快速排序是一种非常高效的排序算法,由英国计算机科学家霍尔在1960年提出。它的基本思想是选择一个基准元素将待排序数组分成两部分,其中一部分的所有元素都比基准元素小,另一部分的所有元素都比基准元素大,然后对这两部分再分别进…

雷军在微博发文:小米澎湃 OS(Xiaomi HyperOS)正式版已完成封包

本心、输入输出、结果 文章目录 雷军在微博发文:小米澎湃 OS(Xiaomi HyperOS)正式版已完成封包前言搭载 小米澎湃 OS(Xiaomi HyperOS)的小米 14回顾 MIUI小米澎湃 OS(Xiaomi HyperOS) 相关跳转小…

spring boot MongoDB实战

项目搭建 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

中文编程语言开发工具开发的软件案例:定制开发扫码识别位置程序适用于车间物品摆放管理

中文编程语言开发工具开发的软件案例&#xff1a;定制开发扫码识别位置程序适用于车间物品摆放管理 中文编程语言开发工具开发的软件案例&#xff1a;定制开发扫码识别位置程序适用于车间物品摆放管理&#xff0c; 中文编程系统化教程&#xff0c;不需英语基础。学习链接 htt…

string类模拟实现(c++)(学习笔记)

string 1.构造函数1.1 不带参构造1.2 带参数的构造函数1.3 合并两个构造函数。 2. 析构函数3.拷贝构造函数4. 赋值运算符重载5. size()/capacity()6. 解引用[]8.iterator迭代器7.Print()8.> 8. push_back()&append()8.1 reserve() 9. 10.insert()10.1 任意位置插入一个字…