news 2026/9/16 18:45:28

MMSegmentation 数据集扩展完全指南:自定义数据集、目录重组与多数据集混合

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MMSegmentation 数据集扩展完全指南:自定义数据集、目录重组与多数据集混合

MMSegmentation 数据集扩展完全指南:自定义数据集、目录重组与多数据集混合

【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation

本篇技术指南聚焦 MMSegmentation 中新增数据集的三种主流路径:编写全新数据集类按标准目录结构重组数据借助 RepeatDataset / ConcatDataset / MultiImageMixDataset 混合多份数据。全文以 docs/en/advanced_guides/add_datasets.md 为骨架,结合mmseg/datasets/下的BaseSegDataset源码与仓库内真实配置,帮助你从零接入自有语义分割数据,并理解底层加载、标签映射与数据增强流水线的协作机制。

新增自定义数据集(Add New Custom Dataset)

当自有数据的目录结构或标注形式无法直接套用仓库内置数据集时,推荐编写一个新的数据集类。MMSegmentation 1.x 中所有数据集都通过注册器机制统一管理,整体只需四步。

第 1 步:创建数据集类文件

在 mmseg/datasets/example.py 的同级目录新建文件(示例为mmseg/datasets/example.py):

from mmseg.registry import DATASETS from .basesegdataset import BaseSegDataset @DATASETS.register_module() class ExampleDataset(BaseSegDataset): METAINFO = dict( classes=('xxx', 'xxx', ...), palette=[[x, x, x], [x, x, x], ...]) def __init__(self, arg1, arg2): pass

要点说明:

  • @DATASETS.register_module()装饰器将类注册进 mmseg/registry 中的DATASETS注册器,此后配置文件中才能通过type='ExampleDataset'字符串构建该数据集。
  • METAINFO是类级元信息,至少需要classes(类别名元组)与palette(每个类别对应的 RGB 可视化颜色)。若未定义palette,从 basesegdataset.py 的 _update_palette 实现 可以看到框架会以固定随机种子 42 自动生成调色板;若palette长度与类别数不一致则会抛出ValueError
  • 建议在__init__中显式给出数据集固定的img_suffixseg_map_suffix。可以参考仓库中的真实案例 mmseg/datasets/isaid.py:iSAIDDataset 将img_suffix固定为'.png'seg_map_suffix固定为'_instance_color_RGB.png',并透传ignore_index**kwargs给父类。

第 2 步:在__init__.py中导入模块

在 mmseg/datasets/init.py 中追加导入,使注册动作在包加载时生效:

from .example import ExampleDataset

从该文件的__all__列表可以看到,仓库内置的CityscapesDatasetADE20KDatasetPascalVOCDatasetLoveDADatasetiSAIDDataset等均遵循这一注册模式。

第 3 步:编写数据集配置文件

在 configs/base/datasets 目录下新建example_dataset.py

dataset_type = 'ExampleDataset' data_root = 'data/example/' ...

真实配置可参考 configs/base/datasets/cityscapes.py:其中dataset_type即注册名,data_root为数据根目录,随后定义train_pipeline/test_pipeline,并通过train_dataloaderval_dataloadertest_dataloader中的dataset字段传入data_prefix=dict(img_path=..., seg_map_path=...)BaseSegDataset会通过_join_prefixdata_rootdata_prefix拼接得到完整路径,其data_prefix默认值为dict(img_path='', seg_map_path=''),对应实现见 basesegdataset.py 构造参数。

第 4 步:登记类别名与调色板工具函数

在 mmseg/utils/class_names.py 中补充类别名、调色板函数并加入dataset_aliases

def example_classes(): return [ 'xxx', 'xxx', ... ] def example_palette(): return [ [x, x, x], [x, x, x], ... ] dataset_aliases = { 'example': ['example', ...], ... }

该文件的get_classesget_palette会先将dataset_aliases展开成"别名 → 标准名"的映射,再通过eval(alias2name[dataset] + '_classes()')动态调用对应函数(class_names.py 第 517-548 行)。例如get_classes('voc12')会命中voc的别名列表并返回voc_classes()。登记后,训练脚本与可视化工具就能按数据集别名自动获取类别与配色。

注意:如果新数据集不满足 MMSegmentation 的标注要求(例如标签不是单通道(H, W)的 PNG、类别 ID 不连续等),需要先在 tools/dataset_converters 中编写数据预处理脚本。仓库已为 Cityscapes、VOC、ADE20K、COCO-Stuff、Potsdam、Vaihingen、iSAID、LoveDA 等提供转换脚本,可直接参考其文件读写与标注重映射逻辑。

通过重组数据目录自定义数据集

如果只想快速用上自有数据,最简单的方式是不写任何代码,仅把数据整理成框架约定的目录结构:

├── data │ ├── my_dataset │ │ ├── img_dir │ │ │ ├── train │ │ │ │ ├── xxx{img_suffix} │ │ │ │ ├── yyy{img_suffix} │ │ │ │ ├── zzz{img_suffix} │ │ │ ├── val │ │ ├── ann_dir │ │ │ ├── train │ │ │ │ ├── xxx{seg_map_suffix} │ │ │ │ ├── yyy{seg_map_suffix} │ │ │ │ ├── zzz{seg_map_suffix} │ │ │ ├── val

约定规则:

  • 配对规则:一张训练样本由img_dirann_dir除后缀外同名的两个文件组成,例如xxx.jpgxxx.png一一对应。
  • 加载逻辑BaseSegDataset.load_data_list(basesegdataset.py 第 229-271 行)有两种路径——若传入了ann_file(每行一个不带后缀的文件名),则按文件列表加载;否则递归遍历img_dir,把img_path中的img_suffix替换为seg_map_suffix得到标注路径,并按图片路径排序。
  • 标签格式:标注图尺寸必须与输入图一致((H, W)),像素值取值范围为[0, num_classes - 1]。可以使用 Pillow 的'P'(调色板)模式来生成带颜色的标注图;标注中值为255的像素在损失计算时会被忽略(ignore_index默认值即为 255,见 basesegdataset.py 构造参数)。
  • 验证集即测试集:部分数据集不公开测试集标注,无法在本地评测,因此仓库配置中通常直接把验证集作为默认测试集(test_dataloader = val_dataloader,见 cityscapes.py)。

关于如何构建自有数据集或实现新的数据集类,更详细的接口说明请参考 docs/en/advanced_guides/datasets.md,其中包括get_data_info返回的字段(img_pathseg_map_pathlabel_mapreduce_zero_labelseg_fieldssample_idx)以及通过metainfo裁剪类别、reduce_zero_label=True忽略 0 号类别(ADE20K 常用)等标签重映射技巧。

通过混合数据集自定义(Mixing Dataset)

MMSegmentation 还支持在训练时混合多份数据集,目前提供concat(拼接)、repeat(重复)与 multi-image mix(多图混合)三种能力。

RepeatDataset:重复数据集

RepeatDataset包装器把同一数据集重复 N 遍,适用于小数据集多次过采样:

dataset_A_train = dict( type='RepeatDataset', times=N, dataset=dict( # This is the original config of Dataset_A type='Dataset_A', ... pipeline=train_pipeline ) )
  • times:重复倍数。
  • 内层dataset是 Dataset_A 的完整原始配置,pipeline必须显式传入训练流水线。

ConcatDataset:拼接数据集

当需要把两份不同数据集拼在一起训练时,使用ConcatDataset

dataset_A_train = dict() dataset_B_train = dict() concatenate_dataset = dict( type='ConcatDataset', datasets=[dataset_A_train, dataset_B_train])

一个更复杂的组合示例:分别把Dataset_A重复 N 次、Dataset_B重复 M 次,再拼接作为训练集,同时验证/测试集保持独立:

dataset_A_train = dict( type='RepeatDataset', times=N, dataset=dict( type='Dataset_A', ... pipeline=train_pipeline ) ) dataset_A_val = dict( ... pipeline=test_pipeline ) dataset_A_test = dict( ... pipeline=test_pipeline ) dataset_B_train = dict( type='RepeatDataset', times=M, dataset=dict( type='Dataset_B', ... pipeline=train_pipeline ) ) train_dataloader = dict( dataset=dict( type='ConcatDataset', datasets=[dataset_A_train, dataset_B_train])) val_dataloader = dict(dataset=dataset_A_val) test_dataloader = dict(dataset=dataset_A_test)

注意验证与测试 loader 直接使用原始数据集配置(而非包装后的),以保证评测数据不被重复或拼接干扰。ConcatDataset继承自 MMEngine 的BaseDataset体系,其底层行为可参考 MMEngine 的基于数据集教程。

MultiImageMixDataset:多图混合数据集

MultiImageMixDataset用于把多张图的样本在 pipeline 中混合,支撑mosaic、mixup等多图数据增强。以Mosaic增强为例:

train_pipeline = [ dict(type='RandomMosaic', prob=1), dict(type='Resize', img_scale=(1024, 512), keep_ratio=True), dict(type='RandomFlip', prob=0.5), dict(type='PackSegInputs') ] train_dataset = dict( type='MultiImageMixDataset', dataset=dict( type=dataset_type, reduce_zero_label=False, img_dir=data_root + "images/train", ann_dir=data_root + "annotations/train", pipeline=[ dict(type='LoadImageFromFile'), dict(type='LoadAnnotations'), ] ), pipeline=train_pipeline )

其工作机制可以从 mmseg/datasets/dataset_wrappers.py 的源码得到印证:

  • 构造时,若dataset是 dict 则通过DATASETS.build构建底层数据集;pipeline中的每个 transform 通过TRANSFORMS.build实例化,并记录各自的type用于skip_type_keys跳过逻辑。
  • __getitem__中,先取回当前样本results,然后逐个执行 pipeline 变换;若某个 transform 实现了get_indices方法(如RandomMosaic,见 transforms.py 第 1190 行),会从底层数据集中采样若干张图放进results['mix_results']供其拼接,处理完后弹出该字段。
  • 底层dataset的 pipeline 通常只需LoadImageFromFile+LoadAnnotations负责"取数",真正做 mosaic 等混合的变换放在外层pipeline

从配置到训练:完整落地路径

将上述任一种数据集配置组织好之后,即可沿用 MMSegmentation 标准训练入口使用:将自定义数据集配置以_base_方式引入模型配置文件(可参考 configs 下各算法目录中形如ann_r50-d8_4xb2-40k_cityscapes-512x1024.py的配置写法),随后运行 tools/train.py 启动训练。需要评测时使用 tools/test.py,其--out--show-dir等参数可输出预测可视化,而可视化所需的类别名与调色板正是从数据集METAINFOclass_names.py中取得的。

小结

  • 新增自定义数据集类:注册DATASETS、导入__init__.py、编写_base_配置、登记class_names.py,适用于标注形态特殊的场景。
  • 重组目录:零代码,按img_dir/ann_dir与文件名后缀配对即可,注意标注值域与ignore_index约定。
  • 混合数据集RepeatDataset控制重复次数,ConcatDataset拼接多源数据,MultiImageMixDataset配合RandomMosaic等实现多图混合增强,三者在 dataset_wrappers.py 与 transforms.py 中均有完整实现可供研读。

【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 18:45:21

CS1237电容式传感器驱动开发:C语言裸机SPI精准控制指南

简介:本资源是一份基于C语言开发的CS1237硬件驱动程序实现,面向嵌入式系统开发者、Linux内核模块初学者及需要对接特定外设的工程师,解决CS1237类设备在操作系统中识别、初始化与数据交互的核心问题。压缩包为RAR格式,共含2个关键…

作者头像 李华
网站建设 2026/9/16 18:44:52

书霸AI|官网shubaai.com|公众号搜书霸AI写作

很多人写开题报告时,真正卡住的并不是打字,而是不知道从哪里开始:研究问题不够明确,研究内容彼此脱节,研究方法写得笼统,参考文献也不知道如何筛选。结果往往是反复修改标题,却始终没有形成一条…

作者头像 李华
网站建设 2026/9/16 18:44:05

2026年正规的AI漫剧制作公司有哪些?

正规的AI漫剧制作公司有哪些?截至2026年,可查的正规主体分上市大厂、大厂技术平台、专业承制公司、独立SaaS工具4个梯队。选平台时最常踩的坑:报价不透明后期加钱、交付周期拖延、修改次数写不清、音乐字体版权模糊导致投流限流。按条计费、线…

作者头像 李华
网站建设 2026/9/16 18:43:14

抖音下载器:3 步跑通无水印批量下载

抖音下载器:3 步跑通无水印批量下载 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工…

作者头像 李华
网站建设 2026/9/16 18:40:13

shadPS4 如何把 Bloodborne 快速更新到 1.09:新手完整指南

shadPS4 如何把 Bloodborne 快速更新到 1.09:新手完整指南 【免费下载链接】shadPS4 PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C 项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4 从 PS4 主机里取出的游戏文件&…

作者头像 李华