ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在 MMSegmentation 中贡献自定义数据集:以高分二号 GID 遥感数据集为例的完整实战指南

在 MMSegmentation 中贡献自定义数据集:以高分二号 GID 遥感数据集为例的完整实战指南 在 MMSegmentation 中贡献自定义数据集以高分二号 GID 遥感数据集为例的完整实战指南【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation本文是 MMSegmentation 数据集贡献流程的实战教程。教程以高分二号GF-2卫星拍摄的 Gaofen Image DatasetGID遥感语义分割数据集为完整样例逐步讲解如何在projects/目录下从零贡献一个标准格式的数据集包括开发环境搭建、Git 分支与 pre-commit 规范、RGB 彩色标签到单通道 mask 的转换脚本、数据集类的注册与 METAINFO 定义、训练/测试配置文件的编写以及最终提交 PR 的完整流程。读完本文你将掌握在 MMSegmentation 生态中贡献任何自定义语义分割数据集尤其是大尺寸遥感影像所需的全部技术能力并理解其底层数据加载原理。一、为什么在projects/下贡献数据集OpenMMLab 系列仓库鼓励社区贡献而 MMSegmentation 为贡献者提供了projects/目录作为代码从“个人创意”走向“核心库”的中间站。与直接修改mmseg/核心目录相比在projects/下贡献具有以下特点门槛更低不要求一次到位只要代码可运行、结构清晰即可先以独立项目的形式合入projects/逐步晋升代码会经维护者评审达到足够质量标准后才会被移入核心库详见仓库中的 projects/example_project/README.md 中关于 Milestone 1/2/3 的说明规范统一贡献者在编写数据集文件时强烈建议按照核心库mmseg/datasets/的目录结构组织代码这样后期移入核心库时改动最小。在本仓库的 projects/ 目录下可以看到多个真实的数据集贡献案例除本文主角 projects/gid_dataset/ 外还有 projects/mapillary_dataset/、projects/bdd100k_dataset/、projects/hsidrive20_dataset/ 等它们共同构成了 MMSegmentation 数据集贡献的最佳实践模板。在动手之前建议先阅读 OpenMMLab 的《贡献代码指南》以了解整体贡献流程本文则聚焦于数据集这一具体场景。二、GID 数据集与教程目标GIDGaofen Image Dataset是由我国自主研发的高分二号卫星拍摄的光学遥感图像构建的语义分割数据集经图像预处理后共提供150 张 6800×7200 像素的 RGB 三通道遥感图像并提供两种类别数的标注一种是包含 5 类有效物体的 RGB 标签另一种是包含 15 类有效物体的 RGB 标签。本教程针对 5 类物体标签即总共 6 类含背景进行讲解。以 6 类划分背景 5 类物体为例其类别与 RGB 颜色对应关系如下mask 标签值-标签名称-RGB 标签值标签值类别RGB 颜色0背景Background/Others[0, 0, 0]黑色1建筑Building/Built-up[255, 0, 0]红色2农田Farmland[0, 255, 0]绿色3森林Forest[0, 255, 255]青色4草地Meadow[255, 255, 0]黄色5水Water[0, 0, 255]蓝色注意教程正文在介绍时提及“5 类有效标签”是指背景之外的 5 类地物建筑、农田、森林、草地、水而在实际贡献的代码projects/gid_dataset/mmseg/datasets/gid.py中METAINFO的classes共定义了 6 类包含背景Others。另外原始转换脚本 projects/gid_dataset/tools/dataset_converters/gid.py 中GID_COLORMAP的Forest与Water均写为(0, 0, 255)蓝色与最终 palette 中的[0, 255, 255]不一致这是原始代码中保留的一处细节实际以METAINFO.palette为准。GID 数据集面向语义分割任务有两个显著特点决定了其必须经过预处理才能用于训练标签为 RGB 彩色标签语义分割任务的标签应该是与原图尺寸一致的单通道图像像素值表示该像素所属的类别编号而 GID 提供的是三通道彩色标签因此必须先将 RGB 标签转换为单通道 mask 标签图像尺寸过大6800×7200 像素的原始图像直接送入神经网络训练不现实需要将每张图裁切成无重叠的 512×512教程最终代码默认clip_size256小块。这两点分别对应了后面转换脚本中的RGB2mask与clip_big_image两个核心函数。三、步骤 1配置开发环境开发 MMSegmentation 所需的环境安装可参考仓库中的中文/英文快速入门文档docs/zh_cn/get_started.md 与 docs/en/get_started.md。注意此处无需安装 mmsegmentation 本体只需安装开发 mmsegmentation 所必需的 PyTorch、MMCV、MMEngine 等依赖即可mmsegmentation 本身将在后续步骤中通过源码方式安装。新建虚拟环境如已有合适的开发环境可跳过conda create --name openmmlab python3.8 -y conda activate openmmlab安装 PyTorch参考 PyTorch 官方安装指引根据你的 CUDA 版本选择对应的安装命令。使用 MIM 安装 mmcv、mmengineMIMOpenMMLab 的包管理工具可自动解决 OpenMMLab 系列库之间的依赖匹配问题pip install -U openmim mim install mmengine mim install mmcv2.0.0如果你已经安装了最新版本的 PyTorch、MMCV、MMEngine可以直接跳过本步骤进入下一步。四、步骤 2代码贡献前的准备工作4.1 Fork MMSegmentation 仓库通过浏览器打开 MMSegmentation 官方仓库登录 GitHub 账户后点击右上角Fork按钮将仓库复制到你的个人账户下。Fork 之后MMSegmentation 仓库即出现在你的个人仓库列表中。4.2 git clone 到本地以 VS Code 为例打开 VS Code新建终端窗口并激活步骤 1 中创建的虚拟环境在 GitHub 个人仓库中找到你 Fork 的 MMSegmentation 仓库并复制其链接然后在终端中执行git clone {您所复制的个人仓库的链接}注如提示权限相关错误请在 GitHub 中添加 SSH 密钥后再进行克隆。进入仓库目录后续操作均在该目录下进行并将官方仓库添加为upstream远端cd mmsegmentation git remote add upstream gitgithub.com:open-mmlab/mmsegmentation.git git remote -v # 检查 remote 是否添加成功添加upstream的目的是后续可以随时从官方仓库同步最新代码。4.3 从源码安装 mmsegmentation在mmsegmentation目录下执行源码安装-e表示可编辑安装便于开发调试pip install -v -e .安装完成后仓库根目录下将能看到mmseg、tools、configs、projects等目录结构。4.4 切换分支为 dev-1.xMMSegmentation 仓库包含多个分支默认分支main是稳定的发行版本dev-1.x是贡献者用来提交创意和 PR 的开发分支其内容会被周期性合入main分支。回到终端执行git checkout dev-1.x4.5 创建属于自己的新分支在dev-1.x分支基础上创建自己的功能分支分支命名建议遵循“您的 GitHubID/功能名称”的格式# git checkout -b 您的GitHubID/您的分支想要实现的功能的名字 # 例如git checkout -b AI-Tianlong/support_GID_dataset git checkout -b {您的GitHubID/您的分支想要实现的功能的名字}4.6 配置 pre-commitOpenMMLab 仓库对代码质量有较高要求所有提交的 PR 必须通过代码格式检查。pre-commit 的详细配置可在仓库根目录的 .pre-commit-config.yaml 中查看其中集成了 flake8代码规范、isortimport 排序、yapf代码格式化、codespell拼写检查、docformatterdocstring 格式化、mdformatMarkdown 格式化等钩子以及 trailing-whitespace、check-yaml、end-of-file-fixer 等通用检查项。五、步骤 3在projects/下贡献数据集代码先对 GID 数据集进行分析原始数据是 150 张未切分的 6800×7200 大图没有划分训练集、验证集与测试集标签为 RGB 彩色标签。因此预处理需要完成裁切、标签转换RGB→单通道 mask、数据集划分三件事最终构建出 MMSegmentation 所支持的目录格式。为便于最终将代码顺畅移入核心库建议按照核心库的目录结构来组织数据集文件。一个完整的数据集贡献包含 4 个必要文件数据集类定义对应核心库的mmseg/datasets/gid.py定义数据集的文件后缀、CLASSES、PALETTE、reduce_zero_label等数据集配置文件对应configs/_base_/gid.py定义dataset_type、data_root、train_pipeline、test_pipeline、img_ratios、tta_pipeline、train_dataloader、val_dataloader、test_dataloader、val_evaluator、test_evaluator等使用了该数据集的模型训练配置文件可选但强烈建议在核心库中所贡献的数据集需要与参考文献中的结果精度对齐因此最好提供对应模型在此数据集上的验证结果与权重文件并撰写详细的 README可参考configs/deeplabv3plus等目录下的 README 风格数据集准备文档撰写数据集的下载方式、目录结构、生成方法等文字性描述和运行命令。下面按顺序逐一讲解。5.1 创建项目文件夹在projects/下创建文件夹gid_dataset最终目录结构如下与仓库中 projects/gid_dataset/ 的实际情况一致projects/gid_dataset/ ├── configs/ │ ├── _base_/datasets/gid.py # 数据集基础配置 │ └── deeplabv3plus_r101-d8_4xb2-240k_gid-256x256.py # 模型训练配置 ├── mmseg/ │ └── datasets/ │ └── gid.py # 数据集类定义 ├── tools/ │ └── dataset_converters/ │ ├── gid.py # 数据转换脚本 │ └── gid_select15imgFromAll.py # 辅助筛选脚本 └── user_guides/ └── 2_dataset_prepare.md # 数据集准备文档5.2 编写数据转换脚本tools/dataset_converters/gid.py由于 GID 原始数据未切分、未划分训练/验证集、标签为 RGB 彩色标签需要先编写转换脚本将数据整理为 MMSegmentation 标准格式。完整脚本位于 projects/gid_dataset/tools/dataset_converters/gid.py下面分段解读其核心逻辑。命令行参数解析def parse_args(): parser argparse.ArgumentParser( descriptionConvert GID dataset to mmsegmentation format) parser.add_argument(dataset_img_path, helpGID images folder path) parser.add_argument(dataset_label_path, helpGID labels folder path) parser.add_argument(--tmp_dir, helppath of the temporary directory) parser.add_argument(-o, --out_dir, helpoutput path, defaultdata/gid) parser.add_argument( --clip_size, typeint, helpclipped size of image after preparation, default256) parser.add_argument( --stride_size, typeint, helpstride of clipping original images, default256) args parser.parse_args() return args参数说明dataset_img_pathGID 原始图像文件夹路径位置参数dataset_label_pathGID 原始标签文件夹路径位置参数--out_dir输出目录默认data/gid--clip_size裁切尺寸默认 256即每块 256×256--stride_size裁切步长默认 256等于 clip_size 时即为无重叠切分。RGB 标签到 mask 标签的转换。核心思路是建立一个“RGB 颜色 → 类别索引”的查找表然后通过一次向量化索引完成转换GID_COLORMAP dict( Background(0, 0, 0), # 0-背景-黑色 Building(255, 0, 0), # 1-建筑-红色 Farmland(0, 255, 0), # 2-农田-绿色 Forest(0, 0, 255), # 3-森林-蓝色 Meadow(255, 255, 0), # 4-草地-黄色 Water(0, 0, 255) # 5-水-蓝色 ) palette list(GID_COLORMAP.values()) classes list(GID_COLORMAP.keys()) def colormap2label(palette): # 建立长度为 256**3 的查找表将 RGB 三元组编码为单一索引 colormap2label_list np.zeros(256**3, dtypenp.longlong) for i, colormap in enumerate(palette): colormap2label_list[(colormap[0] * 256 colormap[1]) * 256 colormap[2]] i return colormap2label_list def label_indices(RGB_label, colormap2label_list): RGB_label RGB_label.astype(int32) idx (RGB_label[:, :, 0] * 256 RGB_label[:, :, 1]) * 256 RGB_label[:, :, 2] return colormap2label_list[idx] def RGB2mask(RGB_label, colormap2label_list): mask_label label_indices(RGB_label, colormap2label_list) return mask_label这段代码的底层原理值得展开colormap2label预分配了一个长度256**3 16777216的数组正好覆盖所有可能的 RGB 取值把每种类别颜色映射到其类别编号label_indices将每个像素的 RGB 三元组编码为(R*256 G)*256 B的唯一整数再以该整数为下标一次性索引查找表从而把整张 RGB 彩色标签向量化地转换为单通道 mask 标签避免了逐像素 for 循环效率极高。大图裁切。clip_big_image负责将一张大图按固定 clip_size 与 stride_size 切分成若干小块def clip_big_image(image_path, clip_save_dir, args, to_labelFalse): image mmcv.imread(image_path, channel_orderrgb) h, w, c image.shape clip_size args.clip_size stride_size args.stride_size # 计算行、列方向需要切分的块数含对不能整除时的边界处理 num_rows math.ceil((h - clip_size) / stride_size) if math.ceil( (h - clip_size) / stride_size) * stride_size clip_size h else \ math.ceil((h - clip_size) / stride_size) 1 num_cols math.ceil((w - clip_size) / stride_size) if math.ceil( (w - clip_size) / stride_size) * stride_size clip_size w else \ math.ceil((w - clip_size) / stride_size) 1 # 用 meshgrid 生成所有切块左上角坐标并处理边界越界 x, y np.meshgrid(np.arange(num_cols 1), np.arange(num_rows 1)) xmin (x * clip_size).ravel() ymin (y * clip_size).ravel() xmin_offset np.where(xmin clip_size w, w - xmin - clip_size, np.zeros_like(xmin)) ymin_offset np.where(ymin clip_size h, h - ymin - clip_size, np.zeros_like(ymin)) boxes np.stack([ xmin xmin_offset, ymin ymin_offset, np.minimum(xmin clip_size, w), np.minimum(ymin clip_size, h) ], axis1) if to_label: image RGB2mask(image, colormap2label_list) # 标签图先转 mask for count, box in enumerate(boxes): start_x, start_y, end_x, end_y box clipped_image image[start_y:end_y, start_x:end_x] if to_label else \ image[start_y:end_y, start_x:end_x, :] img_name osp.basename(image_path).replace(.tif, ) img_name img_name.replace(_label, ) if count % 3 0: # 每 3 块取 1 块作为验证集 mmcv.imwrite(clipped_image.astype(np.uint8), osp.join(clip_save_dir.replace(train, val), f{img_name}_{start_x}_{start_y}_{end_x}_{end_y}.png)) else: mmcv.imwrite(clipped_image.astype(np.uint8), osp.join(clip_save_dir, f{img_name}_{start_x}_{start_y}_{end_x}_{end_y}.png))要点说明裁切坐标通过np.meshgrid一次性生成配合np.minimum与xmin_offset处理图像边缘不能整除的越界问题切块文件名保留了坐标信息{img_name}_{start_x}_{start_y}_{end_x}_{end_y}.png便于追溯每个切块在大图中的位置脚本以count % 3 0的方式按 3:1 比例将切块划分到验证集与训练集——这也是教程示例中“选择 15 张原图最终得到训练集与验证集”的实现方式第 0、3、6……块进入val其余进入train以 clip_size256、stride_size256 切分一张 6800×7200 的图像将生成约 29×27 783 张 256×256 的小图。主流程main()创建img_dir/train、img_dir/val、ann_dir/train、ann_dir/val四个输出目录遍历图像目录下所有.tif文件通过文件名替换.tif→_label.tif找到对应的标签文件对原图调用clip_big_image(..., to_labelFalse)对标签调用clip_big_image(..., to_labelTrue)用ProgressBar显示处理进度。辅助脚本gid_select15imgFromAll.py仓库中还提供了一个配套脚本 projects/gid_dataset/tools/dataset_converters/gid_select15imgFromAll.py其作用是从 150 张全量图像中按论文据脚本注释为 IEEE 9343296 号文献选取 15 张包含全部六类信息的图像复制到指定目录python projects/gid_dataset/tools/dataset_converters/gid_select15imgFromAll.py \ {150 张图像的路径} {150 张标签的路径} {15 张图像的路径} {15 张标签的路径}选出的 15 张图像文件名为图像与标签一一对应标签文件名为图像名加_label后缀GF2_PMS1__L1A0000647767-MSS1 GF2_PMS1__L1A0001064454-MSS1 GF2_PMS1__L1A0001348919-MSS1 GF2_PMS1__L1A0001680851-MSS1 GF2_PMS1__L1A0001680853-MSS1 GF2_PMS1__L1A0001680857-MSS1 GF2_PMS1__L1A0001757429-MSS1 GF2_PMS2__L1A0000607681-MSS2 GF2_PMS2__L1A0000635115-MSS2 GF2_PMS2__L1A0000658637-MSS2 GF2_PMS2__L1A0001206072-MSS2 GF2_PMS2__L1A0001471436-MSS2 GF2_PMS2__L1A0001642620-MSS2 GF2_PMS2__L1A0001787089-MSS2 GF2_PMS2__L1A0001838560-MSS2执行转换命令需将路径替换为你实际存放 15 张图像及标签的路径python projects/gid_dataset/tools/dataset_converters/gid.py {15 张图像的路径} {15 张标签的路径}5.3 编写数据集类mmseg/datasets/gid.py数据集类定义了数据集的元信息类别名、调色板与文件后缀。官方建议参考 projects/mapillary_dataset/mmseg/datasets/mapillary.py 并在此基础上修改相应变量以适配自己的数据集。GID 的完整实现位于 projects/gid_dataset/mmseg/datasets/gid.py# projects/gid_dataset/mmseg/datasets/gid.py # Copyright (c) OpenMMLab. All rights reserved. from mmseg.datasets.basesegdataset import BaseSegDataset from mmseg.registry import DATASETS # 注册数据集类 DATASETS.register_module() class GID_Dataset(BaseSegDataset): Gaofen Image Dataset (GID) Dataset paper link: https://www.sciencedirect.com/science/article/pii/S0034425719303414 https://x-ytong.github.io/project/GID.html GID 6 classes: others, built-up, farmland, forest, meadow, water METAINFO dict( classes(Others, Built-up, Farmland, Forest, Meadow, Water), palette[[0, 0, 0], [255, 0, 0], [0, 255, 0], [0, 255, 255], [255, 255, 0], [0, 0, 255]]) def __init__(self, img_suffix.png, seg_map_suffix.png, reduce_zero_labelNone, **kwargs) - None: super().__init__( img_suffiximg_suffix, seg_map_suffixseg_map_suffix, reduce_zero_labelreduce_zero_label, **kwargs)这里有几个关键点需要结合底层源码理解基类实现在 mmseg/datasets/basesegdataset.pyDATASETS.register_module()注册机制通过该装饰器将GID_Dataset注册进mmseg.registry.DATASETS注册表使得配置文件中可以用字符串dataset_type GID_Dataset实例化该数据集类见configs/_base_/datasets/gid.py第 2 行。METAINFO的作用BaseSegDataset.__init__中会通过self._metainfo self._load_metainfo(...)加载元信息并据此生成label_map与调色板classes类别名元组必须与 mask 标签中的像素值顺序一一对应索引 0 对应Others索引 1 对应Built-up……palette可视化时每个类别使用的 RGB 颜色长度须与classes一致如果palette未定义基类的_update_palette会以固定随机种子自动生成见 mmseg/datasets/basesegdataset.py但显式定义更有利于可视化结果的一致性与可读性。img_suffix/seg_map_suffix的匹配机制BaseSegDataset.load_data_list见 mmseg/datasets/basesegdataset.py在未提供ann_file时会扫描data_prefix[img_path]目录下所有以img_suffix结尾的文件并自动将其文件名中的后缀替换为seg_map_suffix作为标签路径。因此要求图像与标签除后缀外文件名完全一致——这正是转换脚本将切块图像与切块标签统一命名为{img_name}_{start_x}_{start_y}_{end_x}_{end_y}.png的原因。reduce_zero_label参数控制是否将标签值 0 视为忽略区域通常用于背景占比过大或需要排除某类的情况。基类中ignore_index默认为 255reduce_zero_label默认为 FalseGID 数据集背景0 类需要参与训练因此保持默认即可。目录结构约定BaseSegDataset期望的数据目录结构为data/{数据集}/img_dir/{train|val}与data/{数据集}/ann_dir/{train|val}这是 MMSegmentation 各数据集通用的标准格式。5.4 编写数据集基础配置configs/_base_/datasets/gid.py该文件定义了数据集的加载、预处理流水线与评估方式完整内容见 projects/gid_dataset/configs/base/datasets/gid.py# dataset settings dataset_type GID_Dataset # 注册的类名与 5.3 中 DATASETS.register_module() 对应 data_root data/gid/ # 数据集根目录建议将数据集软连接到 mmsegmentation/data 下 crop_size (256, 256) # 训练时随机裁剪的尺寸 train_pipeline [ dict(typeLoadImageFromFile), # 从文件加载图像 dict(typeLoadAnnotations), # 从文件加载标注 dict(typeRandomResize, # 随机缩放 scale(512, 512), ratio_range(0.5, 2.0), keep_ratioTrue), dict(typeRandomCrop, crop_sizecrop_size, cat_max_ratio0.75), # 随机裁剪 dict(typeRandomFlip, prob0.5), # 随机翻转 dict(typePhotoMetricDistortion), # 光度扰动增强 dict(typePackSegInputs) # 打包为模型输入 ] test_pipeline [ dict(typeLoadImageFromFile), dict(typeResize, scale(256, 256), keep_ratioTrue), # 在 Resize 之后再加载标注因为验证时 ground truth 不需要做 resize 变换 dict(typeLoadAnnotations), dict(typePackSegInputs) ] img_ratios [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] # 多尺度预测的缩放比例 tta_pipeline [ # 测试时增强多尺度 水平翻转 dict(typeLoadImageFromFile, file_client_argsdict(backenddisk)), dict(typeTestTimeAug, transforms[ [dict(typeResize, scale_factorr, keep_ratioTrue) for r in img_ratios], [dict(typeRandomFlip, prob0., directionhorizontal), dict(typeRandomFlip, prob1., directionhorizontal)], [dict(typeLoadAnnotations)], [dict(typePackSegInputs)] ]) ]各配置项含义train_pipeline训练数据流包含加载、随机缩放scale512比例 0.5~2.0、随机裁剪crop_size256cat_max_ratio0.75表示单张图中单类别像素占比超过 75% 时重新裁剪避免裁到几乎纯色的区域、随机翻转、光度畸变增强最后PackSegInputs打包test_pipeline验证/测试数据流只做固定尺寸 Resize 后加载标注并打包注意LoadAnnotations放在Resize之后因为验证时真实标签不需要参与 resizeimg_ratiostta_pipeline多尺度预测配置推理时按 0.5~1.75 共 6 个尺度缩放并配合水平翻转TestTimeAug会聚合各尺度结果提升精度代价是推理耗时增加。接着是数据加载器与评估器train_dataloader dict( batch_size2, # 训练批量大小 num_workers4, # 数据加载进程数 persistent_workersTrue, # 持久化 worker避免每个 epoch 重建 samplerdict(typeInfiniteSampler, shuffleTrue), # 无限采样器 datasetdict( typedataset_type, data_rootdata_root, data_prefixdict(img_pathimg_dir/train, seg_map_pathann_dir/train), pipelinetrain_pipeline)) val_dataloader dict( batch_size1, # 验证批量大小 num_workers4, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleFalse), datasetdict( typedataset_type, data_rootdata_root, data_prefixdict(img_pathimg_dir/val, seg_map_pathann_dir/val), pipelinetest_pipeline)) test_dataloader val_dataloader # 测试集与验证集共用同一配置 val_evaluator dict(typeIoUMetric, iou_metrics[mIoU]) # 评估指标 test_evaluator val_evaluator要点data_prefix中的img_path与seg_map_path是相对data_root的路径指向 5.2 转换脚本生成的img_dir/train、ann_dir/train等目录训练用InfiniteSampler无限采样配合持久化 worker验证/测试用DefaultSampler且不打乱顺序val_evaluator/test_evaluator使用IoUMetriciou_metrics[mIoU]即语义分割标准的平均交并比指标。5.5 编写模型训练配置使用 GID 数据集的模型训练配置文件如下完整文件见 projects/gid_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_gid-256x256.py_base_ [ ../../../configs/_base_/models/deeplabv3plus_r50-d8.py, ./_base_/datasets/gid.py, ../../../configs/_base_/default_runtime.py, ../../../configs/_base_/schedules/schedule_240k.py ] custom_imports dict(imports[projects.gid_dataset.mmseg.datasets.gid]) crop_size (256, 256) data_preprocessor dict(sizecrop_size) model dict( data_preprocessordata_preprocessor, pretrainedopen-mmlab://resnet101_v1c, backbonedict(depth101), decode_headdict(num_classes6), auxiliary_headdict(num_classes6))配置解读_base_继承四个基础配置模型结构 configs/base/models/deeplabv3plus_r50-d8.py、上一小节的数据集配置、运行时配置 configs/base/default_runtime.py、训练计划 configs/base/schedules/schedule_240k.pycustom_imports是关键由于GID_Dataset定义在projects/而非核心库mmseg/datasets/下必须通过custom_imports dict(imports[projects.gid_dataset.mmseg.datasets.gid])让配置系统在解析dataset_type GID_Dataset之前先导入该模块从而完成注册。这是所有projects/下自定义模块能被配置系统识别的统一入口模型部分将 backbone 换为 ResNet-101depth101预训练权重open-mmlab://resnet101_v1c并把decode_head与auxiliary_head的输出类别数改为 6与METAINFO.classes数量一致通过mim train或仓库自带的 tools/train.py 即可启动训练例如python tools/train.py projects/gid_dataset/configs/deeplabv3plus_r101-d8_4xb2-240k_gid-256x256.py --work-dir work_dirs/gid5.6 撰写数据集准备文档最后需要撰写数据集的介绍文档包括数据集的下载方式、目录结构、生成方法等必要描述和运行命令帮助用户快速完成数据准备。仓库中对应的文档为 projects/gid_dataset/user_guides/2_dataset_prepare.md其内容框架为GID 数据集介绍与下载地址说明说明数据集包含 150 张 6800×7200 大图、标签为 RGB 标签给出按文献选取的 15 张图像名称列表包含全部六类信息10 张用于训练、5 张用于验证提供两条可执行命令先用gid_select15imgFromAll.py从 150 张中筛选出 15 张再用gid.py执行裁切与标签转换给出转换完成后的标准目录结构mmsegmentation ├── mmseg ├── tools ├── configs ├── data │ ├── gid │ │ ├── ann_dir │ │ │ ├── train │ │ │ ├── val │ │ ├── img_dir │ │ │ ├── train │ │ │ ├── val六、步骤 4通过 pre-commit 检查并提交 PR6.1 提交代码前检查在mmsegmentation目录下执行以下命令完成代码的暂存与提交git add . git commit -m 添加描述 git push提交时 pre-commit 钩子会自动运行需事先在 4.6 节完成 pre-commit 配置对代码进行 flake8/isort/yapf/codespell/docformatter 等检查与自动修复若有未通过项git 会拒绝提交并提示修改。确保所有检查通过后再推送。6.2 在 GitHub 上提交 PR推送完成后在你的 GitHub 个人仓库页面发起 Pull Request将你的功能分支合入官方dev-1.x分支。提交 PR 时建议在描述中说明数据集的基本信息来源、规模、类别数、标注格式预处理脚本的使用方法与验证结果模型在该数据集上的精度若有与权重文件地址README 与相关文档链接。七、总结数据集贡献自检清单结合本文与仓库中 projects/example_project/README.md 展示的检查清单贡献一个数据集前请确认以下事项四要素齐全数据集类定义、数据集基础配置、模型训练配置可选但建议、数据集准备文档均已提供目录结构规范projects/{你的数据集}/下按mmseg/datasets/、configs/_base_/datasets/、tools/dataset_converters/、user_guides/组织代码注册与导入正确数据集类通过DATASETS.register_module()注册训练配置中通过custom_imports导入项目模块dataset_type字符串与类名一致元信息一致METAINFO.classes数量与模型decode_head.num_classes、转换脚本生成的 mask 标签最大值一致palette长度与classes一致文件名匹配转换后的图像与标签同名仅后缀不同符合BaseSegDataset.load_data_list的后缀替换机制文档可复现用户按文档命令即可完成数据下载、筛选、转换与训练全流程代码质量达标通过 pre-commit 全部检查含必要的 docstring 与类型标注。通过以上流程你贡献的数据集不仅能立即服务于自己的研究也具备了被社区评审并最终合入 MMSegmentation 核心库的资质为语义分割生态的扩展贡献力量。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表