MMDet3d样本均衡

news2025/1/12 16:01:52

MMDet3d样本均衡

文章目录

  • MMDet3d样本均衡
    • CBGSDataset
    • 训练时数据是200帧,后面处理时,dataloader中数据变成了460帧,怎么均衡的?
    • 思考
      • 抽帧数计算
      • 某个类别帧数为0
    • Reference
      • 欢迎关注公众号【三戒纪元】

CBGSDataset

**CBGS (Class-balanced Grouping and Sampling)**中的样本均衡策略

CBGS : 三维点云物体检测的类平衡分组和采样(新自动驾驶数据集nScenes第一名算法)

两种策略解决样本不均衡问题:

一、DS Sampling (作者提出)

基本思想是把占比较小的类别进行复制,制作出较大数据集,然后针对每个类别用固定比例random sample这个大的数据集,组合出最终数据集,最终数据集的类别密度(类别数量/样本总数)是相近的,这方法可以减缓样本不平均问题。

二、GT-AUG (SECOND引用)

把某一样本中的物体点云数据,放到另一个样本中,过程中需要计算摆放位置是否合理。(详见原文)

训练时数据是200帧,后面处理时,dataloader中数据变成了460帧,怎么均衡的?

mmdet3d中存储帧数据使用了class CBGSDataset做的样本均衡

FAWLiDARDataset是200帧,包装到 CBGSDataset 是460帧,设置的batch_size = 4 ,因此迭代次数为 460 4 = 115 \frac{460}{4} = 115 4460=115,训练20轮,总共 $ 20 * 115 = 2300$ 次训练

具体得到 CBGSDataset 类里面看(/home/qiancj/anaconda3/envs/mmdet3d_env_py38/lib/python3.8/site-packages/mmengine/dataset/dataset_wrapper.py):

具体函数调用为:__init__ —> self.full_init() —> self.sample_indices = self._get_sample_indices(self.dataset)

其中,_get_sample_indices(self.dataset) 具体实现为:

    def _get_sample_indices(self, dataset: BaseDataset) -> List[int]:
        """Load sample indices according to ann_file.

        Args:
            dataset (:obj:`BaseDataset`): The dataset.

        Returns:
            List[dict]: List of indices after class sampling.
        """
        # 获取障碍物类别:['car', 'truck', 'motorcycle', 'pedestr', 'Traffic_cone']
        classes = self.metainfo['classes'] 
        # 建立 种类-id 字典:{'car': 0, 'truck': 1, 'motorcycle': 2, 'pedestr': 3, 'Traffic_cone': 4}
        cat2id = {name: i for i, name in enumerate(classes)}
        # 每个建立字典 cat_id:[], 每个id对应一个list
        class_sample_idxs = {cat_id: [] for cat_id in cat2id.values()}
        
        # 遍历 dataset 中每一帧
        for idx in range(len(dataset)):
            # 获取每一帧内包含的种类 id。如第0帧有car 和 truck, 获取到的sample_cat_ids 为{0,1}
            sample_cat_ids = dataset.get_cat_ids(idx)
            # 当前帧包含目标障碍物,则将帧号存入class_sample_idxs中
            # class_sample_idxs 存储每个 类别id 所在的帧号列表 
            for cat_id in sample_cat_ids:
                if cat_id != -1:
                    # Filter categories that do not need to be cared.
                    # -1 indicates dontcare in MMDet3D.
                    class_sample_idxs[cat_id].append(idx)
        # 每个类别id 所在帧的总数
        duplicated_samples = sum(
            [len(v) for _, v in class_sample_idxs.items()])
        # 每个类别id 对应帧数占总帧数的比例
        class_distribution = {
            k: len(v) / duplicated_samples
            for k, v in class_sample_idxs.items()
        }
        
        # 样本帧序号
        sample_indices = []
       # 每个类别占总类别的比例,此处0.2
        frac = 1.0 / len(classes)
        # frac/每个类别所占帧数,帧数少的该值会变大
        ratios = [frac / v for v in class_distribution.values()]
        # 从每个类所在的帧里class_sample_idxs.values(),抽取int(len(cls_inds) *ratio) 帧
        for cls_inds, ratio in zip(list(class_sample_idxs.values()), ratios):
            sample_indices += np.random.choice(cls_inds,
                                               int(len(cls_inds) *
                                                   ratio)).tolist()
        return sample_indices

从代码可以看出来,先计算每个类别所存在的总帧数,然后计算每个类别占总帧数的比例,然后对每个类别所在的帧数进行随机抽帧,保证每个类别的抽帧数一致,也就是抽帧后每个类别所在的帧数是相同的,保证了样本的均衡性。

所以如果某个类别只存在3帧,为了达到和其他类别帧数匹配,就会在最终样本中复制多份这3帧数据,以实现样本均衡。

思考

抽帧数计算

这里计算感觉逻辑有点乱,又是计算 frac,ratios,又是计算抽帧数,不足抽帧数的就复制已有的帧。

手动推导了一遍公式,最终抽帧数可以简化为
抽帧数 = 总帧数 类别数量 = d u p l i c a t e d _ s a m p l e s l e n ( c l a s s e s ) 抽帧数 = \frac{总帧数}{类别数量} \\ = \frac{duplicated\_samples}{len(classes)} 抽帧数=类别数量总帧数=len(classes)duplicated_samples

某个类别帧数为0

如果样本数比较少,有的类别帧数为0,即所有帧中都不包含该障碍物,当计算ratios时除数会为0

ratios = [frac / v for v in class_distribution.values()]

Reference

CBGS : 三维点云物体检测的类平衡分组和采样(新自动驾驶数据集nScenes第一名算法)

欢迎关注公众号【三戒纪元】

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

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

相关文章

UE虚幻引擎,Unity3D,Blender区别和联系

1. 官网手册 UnityUEBlenderUnity 用户手册 (2019.4 LTS) - Unity 手册虚幻引擎5.2文档 | 虚幻引擎5.2文档 (unrealengine.com)Blender 3.5 Reference Manual — Blender Manual 2. Unity, UnrealEngine, Blender的区别 Blender 是一款免费的开源软件,是一个开源…

Godot引擎 4.0 文档 - 循序渐进教程 - 脚本语言

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Scripting languages — Godot Engine (stable) documentation in English 脚本语言 本课将概述 Godot 中可用的脚本语言。您将了解每个选项的优缺点。在下一部分中&…

CentOS7搭建伪分布式Hadoop(全过程2023)

##具体操作目录## 1.配置静态ip2.关闭防火墙3.修改主机名为 *master* ,并重启虚拟机vi /etc/hostname 4.修改主机名与ip映射5.设置SSH免密登录6.安装配置java环境----------------------正式Hadoop配置1.移动安装包到合适位置2.解压安装包并重命名3.配置环境变量4.修…

know it and do it

overview: 在一盘盘有立即反馈的系统中,可以更直观的看到知道一个道理和能自然的用出来之间的鸿沟有多大。 这个就是日积月累的训练的意义了。 一夜回到解放前 继续金铲铲的游玩回味,之前一段时间忙于工作就放下了,后来新的版本…

20230521 AI 一周大事件汇总

🚀 ChatGPT 上线联网和插件功能 OpenAI宣布将在这周推出联网和插件功能,位于Alpha和Beta通道的ChatGPT Plus用户都可使用70多个上线的插件。 更新意味着ChatGPT将利用最新的信息和资讯为使用者提供服务。 上线的ChatGPT插件种类涵盖了行程安排助理、代…

拿捏大厂面试官的高质量自动化测试工程师简历--看完必有所获

一、前言:简历(职场敲门砖) 作为软件测试的垂直领域深耕者,面试或者被面试都是常有的事,可是不管是啥,总和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息、过往经历等&#xff0c…

阿里p10手敲python +pytest +yaml + Allure 实现接口自动化框架

以前弄过好多接口自动化框架的东西,比如httprunner2.0版本实现的接口自动化框架,还有httprunner3.X实现的接口自动化框架,这些都是开源的,实现起来比较简单。 以及使用pythonunittestddtyaml等工具实现的接口自动化框架等。 今天…

【腾讯云 Finops Crane 集训营】安装使用及EHPA弹性演示

随着时间的推移,降本增效成为了企业界和组织中的一个新口号。在2023年,这个口号进一步获得了广泛的认可和重要性,成为了许多组织在业务运营中的关键目标。在2023年,许多组织开始将降本增效作为战略性目标,并将其融入到…

3.fabric二进制工具包介绍

(1)Fabric二进制工具包: Fabric二进制工具包:Fabric二进制工具包(Fabric Binary Distribution)是Hyperledger Fabric的核心组件,它包含了一系列可执行的二进制文件,用于搭建、管理和操作Fabric网络。该工具包提供了一套命令行工具,可以执行各种与Fabric网络相关的任务…

模板(初阶)

目录 一、泛型编程二、函数模板2.1 函数模板的概念2.2 函数模板的格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 三、类模板3.1 类模板的定义格式3.2 类模板的实例化 一、泛型编程 如何实现一个通用的Swap函数 void Swap(int& x, int& y) {int …

chatgpt赋能Python-pythonapp自动化

Python App自动化:优化SEO的终极解决方案 随着互联网的发展,SEO(搜索引擎优化)变得日益重要。对于任何网站或应用程序开发人员来说,SEO应该是一个非常重要的考虑因素。为了帮助开发人员和企业提高其在线可见性&#x…

Squid代理服务器应用

在web架构中,用户一般进入负载均衡层,通过调度来访问web应用层,但是如果访问量太大,并发量较高,web应用层会吃不消,我们把静态资源、经常要访问的资源放入缓存,用户直接访问缓存层,加…

解析使用FPGA逻辑实现FIR滤波器的几种架构

有限脉冲响应(finite impulse response,FIR)数字滤波器 一、FIR数字滤波器理论介绍 FIR滤波器的实质就是输入序列与系统脉冲响应的卷积,即: 其中,N为滤波器的阶数,也即抽头数;x(n)为第n个输入序列&#xff…

人工智能轨道交通行业周刊-第45期(2023.5.15-5.21)

本期关键词:动车洗澡、热备列车、火车司机室、无缝线路、图像分割、自动标注 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道…

Linux开发工具:yum和vim的使用

目录 一. Linux下的软件 1.1 软件安装的三种方法 1.2 采用yum安装软件 1.3 yum源的问题 二. vim开发工具的使用 2.1 vim的三种基本模式 2.2 命令模式下vim的常用指令 2.2.1 定位相关指令 2.2.2 光标移动相关指令 2.2.3 插入相关指令 2.2.4 复制粘贴相关指令 2.2.5 替…

Tauri应用开发(三):自定义拖拽区域

1. 自定义拖拽:data-tauri-drag-region tauri默认的顶部可拖拽,有时候我们不需要这个拖拽,或者需要自定义拖拽区域时,就需要通过tauri提供的data-tauri-drag-region属性来自定义拖拽区。 ![在这里插入图片描述](https://img-blog…

基于Python的图书信息管理系统

1引言 进入21世纪以来,信息技术从根本上推动了图书馆的飞速发展,计算机和计算机管理系统已成为图书馆进行图书管理的主要设备和系统。虽然目前很多大型的图书馆已经有一整套比较完善的管理系统,但是在一些中小型的图书馆中,大部分…

【Python 虚拟环境创建】解决遇到的问题并在vscode上测试

目录 一、前提准备 二、python虚拟环境创建 解决问题:‘virtualenv’/‘mkvirtualenv‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 解决问题:pycharm终端提示无法加载文件 E:\software\python_pycharm\venv\Scripts\activat…

Kuberntes云原生实战09 Kubernetes高可用安装小结

大家好,我是飘渺。 今天咱们继续更新Kubernetes云原生实战系列,本节文章是我们在安装过程中可能会遇到的问题以及解决方法。(都是我踩过的坑,你们大概率也会遇到~) 1. kubesphere平台无法使用kubectl命令行工具 问题现象 如果你给你的KubeSphere在Nginx上配置了域名访…

【2023 雷泽杯 · Misc】png的秘密

一个关于png结构的题目 一、题目 一张打不开的png文件,唉。 二、解题思路 少了头,就给他加上。我比较笨,还是萌新,采用导出16进制,添加后,010editor导入16进制。 添加之后,顺眼多了。然后用png…