首页
/ NotACracker/COTR项目教程:自定义数据集完全指南

NotACracker/COTR项目教程:自定义数据集完全指南

2025-07-04 21:00:09作者:管翌锬

前言

在3D目标检测领域,数据集的准备和处理是模型训练的关键环节。NotACracker/COTR项目提供了灵活的数据集自定义方案,本文将详细介绍如何根据项目需求自定义数据集。

数据集格式支持方案

方案一:转换为现有格式

对于无法直接在线读取的数据,推荐转换为KITTI格式:

  1. 数据转换器开发:编写脚本将原始数据重组并转换为KITTI格式
  2. 数据集类继承:根据数据特性继承现有数据集类进行微调
  3. 配置文件修改:调整数据路径和类别配置

优势:实现简单,可直接复用现有数据处理流程

方案二:转换为中间格式

项目支持将数据转换为pickle中间格式,每个帧数据包含以下关键信息:

  • image:图像元数据(路径、尺寸等)
  • point_cloud:点云数据信息
  • calib:校准参数
  • annos:标注信息(边界框、类别等)

这种格式的优势在于:

  • 不强制要求原始数据组织结构
  • 灵活性高,可适应不同数据源
  • 便于统一处理流程

自定义数据集实现示例

数据集类实现

以下是一个完整的自定义数据集实现示例:

@DATASETS.register_module()
class MyDataset(Custom3DDataset):
    # 定义数据集类别
    CLASSES = ('cabinet', 'bed', 'chair', 'sofa', 'table', 'door', 'window',
               'bookshelf', 'picture', 'counter', 'desk', 'curtain',
               'refrigerator', 'showercurtrain', 'toilet', 'sink', 'bathtub',
               'garbagebin')

    def __init__(self, data_root, ann_file, pipeline=None, classes=None,
                 modality=None, box_type_3d='Depth', filter_empty_gt=True,
                 test_mode=False):
        super().__init__(
            data_root=data_root,
            ann_file=ann_file,
            pipeline=pipeline,
            classes=classes,
            modality=modality,
            box_type_3d=box_type_3d,
            filter_empty_gt=filter_empty_gt,
            test_mode=test_mode)

    def get_ann_info(self, index):
        info = self.data_infos[index]
        if info['annos']['gt_num'] != 0:
            gt_bboxes_3d = info['annos']['gt_boxes_upright_depth'].astype(np.float32)
            gt_labels_3d = info['annos']['class'].astype(np.int64)
        else:
            gt_bboxes_3d = np.zeros((0, 6), dtype=np.float32)
            gt_labels_3d = np.zeros((0,), dtype=np.int64)

        gt_bboxes_3d = DepthInstance3DBoxes(
            gt_bboxes_3d,
            box_dim=gt_bboxes_3d.shape[-1],
            with_yaw=False,
            origin=(0.5, 0.5, 0.5)).convert_to(self.box_mode_3d)

        pts_instance_mask_path = osp.join(self.data_root, info['pts_instance_mask_path'])
        pts_semantic_mask_path = osp.join(self.data_root, info['pts_semantic_mask_path'])

        return dict(
            gt_bboxes_3d=gt_bboxes_3d,
            gt_labels_3d=gt_labels_3d,
            pts_instance_mask_path=pts_instance_mask_path,
            pts_semantic_mask_path=pts_semantic_mask_path)

配置文件调整

在配置文件中使用自定义数据集:

dataset_A_train = dict(
    type='MyDataset',
    ann_file='annotation.pkl',
    pipeline=train_pipeline
)

数据集包装器应用

项目提供了三种数据集包装器来增强数据使用:

1. 重复数据集(RepeatDataset)

dataset_A_train = dict(
    type='RepeatDataset',
    times=N,  # 重复次数
    dataset=dict(  # 原始数据集配置
        type='Dataset_A',
        pipeline=train_pipeline
    )
)

2. 类别平衡数据集(ClassBalancedDataset)

dataset_A_train = dict(
    type='ClassBalancedDataset',
    oversample_thr=1e-3,  # 过采样阈值
    dataset=dict(
        type='Dataset_A',
        pipeline=train_pipeline
    )
)

3. 数据集拼接(ConcatDataset)

三种拼接方式:

方式一:相同类型数据集拼接

dataset_A_train = dict(
    type='Dataset_A',
    ann_file=['anno_file_1', 'anno_file_2'],
    separate_eval=False,  # 是否分开评估
    pipeline=train_pipeline
)

方式二:不同类型数据集拼接

data = dict(
    train=[dataset_A_train, dataset_B_train],
    val=dataset_A_val,
    test=dataset_A_test
)

方式三:显式使用ConcatDataset

data = dict(
    val=dict(
        type='ConcatDataset',
        datasets=[dataset_A_val, dataset_B_val],
        separate_eval=False
    )
)

数据集类别修改

可以灵活调整数据集的类别:

直接指定类别列表

classes = ('person', 'bicycle', 'car')
data = dict(
    train=dict(classes=classes),
    val=dict(classes=classes),
    test=dict(classes=classes))

从文件读取类别

classes = 'path/to/classes.txt'  # 每行一个类别名
data = dict(
    train=dict(classes=classes),
    val=dict(classes=classes),
    test=dict(classes=classes))

注意事项

  1. 空样本过滤行为在v2.5.0前后有变化,需注意版本兼容性
  2. 中间格式数据不包含类别名,使用CustomDataset时需离线处理空样本
  3. 类别平衡数据集和重复数据集的评估功能暂不支持

结语

通过本文介绍的自定义数据集方法,开发者可以灵活地将各种3D数据源集成到NotACracker/COTR项目中。建议根据数据特点选择合适的实现方案,平衡开发效率与系统性能。

登录后查看全文
热门项目推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
179
263
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
869
514
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
130
183
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
328
377
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
333
1.09 K
harmony-utilsharmony-utils
harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。
ArkTS
28
0
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0
kernelkernel
deepin linux kernel
C
22
5
WxJavaWxJava
微信开发 Java SDK,支持微信支付、开放平台、公众号、视频号、企业微信、小程序等的后端开发,记得关注公众号及时接受版本更新信息,以及加入微信群进行深入讨论
Java
829
22
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
601
58