MMDet3d样本均衡

MMDet3d样本均衡

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第一名算法)

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

### 集成 mmdet3d 框架到 NDS 项目 为了在 nuScenes 数据集上使用 MMDetection3D (mmdet3d),需要完成几个关键配置和设置。MMDetection3D 是一个用于三维目标检测的强大工具箱,支持多种传感器输入并提供丰富的模型实现。 #### 安装依赖项 首先安装必要的 Python 库来构建环境: ```bash pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.9/index.html pip install mmdet3d ``` 这些命令会下载最新版本的 MMCV 和 MMDetection3D[^1]。 #### 准备数据集 nuScenes 数据集结构复杂,因此建议按照官方文档说明准备数据文件夹。通常情况下,这涉及解压原始数据包并将图像、LiDAR 扫描和其他元数据放置于指定路径下。对于训练过程而言,还需要转换标注信息至适合 mmdet3d 处理的形式。 #### 修改配置文件 创建或编辑现有的 PyTorch 训练脚本中的配置部分,以适应 nuScenes 特定需求。具体来说,调整 `data` 字典内的参数,指明数据加载器应读取哪些字段以及如何预处理样本;同时定义损失函数、优化策略等超参设定。 ```yaml model = dict( type='VoteNet', backbone=dict(type='PointNet2SASSG'), ... ) data = dict( samples_per_gpu=8, workers_per_gpu=4, train=dict( type='NuScenesDataset', data_root='./nuscenes/', ann_file='./nuscenes_infos_train.pkl' ), val=dict(...), test=dict(...) ) ``` 上述代码片段展示了如何为 VoteNet 架构定制化 nuScenes 数据源的相关选项。 #### 开始训练与评估 一切就绪之后,可以通过简单的调用来启动实验流程: ```python from mmdet.apis import set_random_seed, init_detector, inference_detector, show_result_meshlab import os.path as osp config_file = 'configs/votenet/votenet_8x4_scannet-3d-18class.py' checkpoint_file = './checkpoints/latest.pth' # 初始化模型实例 model = init_detector(config_file, checkpoint_file, device='cuda:0') # 设置随机种子确保可重复性 set_random_seed(0, deterministic=True) # 运行推理得到预测结果 result = inference_detector(model, point_cloud_path) # 可视化输出 show_result_meshlab(result, out_dir='results') ``` 此段Python代码演示了基于已保存权重文件执行推断的过程,并将最终可视化成果存储下来供后续分析之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值