尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

MMagic 数据预处理器(DataPreprocessor)完全指南:从数据搬移到归一化与反变换

发布时间:2026/9/29 5:21:55

资讯中心
01
ARTICLE

MMagic 数据预处理器(DataPreprocessor)完全指南:从数据搬移到归一化与反变换

MMagic 数据预处理器(DataPreprocessor)完全指南:从数据搬移到归一化与反变换
媒体生成计算机视觉深度学习人工智能大模型【免费下载链接】mmagicOpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic : Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.项目地址https://gitcode.com/gh_mirrors/mm/mmagic点击查看免费下载导读本文围绕 MMagicOpenMMLab 生成式 AI 工具箱中的DataPreprocessor展开讲解它在训练/推理流程中的精确位置、源码实现原理、关键配置参数以及与之配套的逆向操作destruct。通过本文你将掌握数据从 mmcv transform 到 GPU 输入网络之间发生了什么设备搬移、padding、归一化、通道顺序转换如何为 GAN、图像修复、抠图等不同任务配置 data_preprocessor以及如何借助destruct把模型输出还原为可视化所需的原始图像。数据 preprocessor 在训练流程中的位置在 MMagic 的模型训练流程中数据经历了清晰的三段式处理数据增强与加载图片数据先通过 mmcv 中的 transform 进行数据增强如 Resize、Crop、Flip并被 DataLoader 加载为 batch预处理preprocessor 的职责preprocessor 将数据从 CPU 搬运到 CUDA 设备并进行 padding 和归一化最终整理成模型可直接消费的inputs与data_samples模型前向处理后的数据送入生成器 / 判别器等网络模块。mmcv 中的 transform 大多来自各下游算法库MMEditing、MMClassification 等中 transform 的迁移目的是避免各下游算法库中 transform 的重复冗余。以 configs/base/datasets/unpaired_imgs_256x256.py 为例其train_pipeline完整定义如下dataset_type UnpairedImageDataset domain_a None # set by user domain_b None # set by user train_pipeline [ dict(typeLoadImageFromFile, keyimg_A, color_typecolor), dict(typeLoadImageFromFile, keyimg_B, color_typecolor), dict( typeTransformBroadcaster, mapping{img: [img_A, img_B]}, auto_remapTrue, share_random_paramsTrue, transforms[ dict(typeResize, scale(286, 286), interpolationbicubic), dict( typeCrop, keys[img], crop_size(256, 256), random_cropTrue), ]), dict(typeFlip, keys[img_A], directionhorizontal), dict(typeFlip, keys[img_B], directionhorizontal), # NOTE: users should implement their own keyMapper and Pack operation # dict( # typeKeyMapper, # mapping{ # fimg_{domain_a}: img_A, # fimg_{domain_b}: img_B # }, # remapping{ # fimg_{domain_a}: fimg_{domain_a}, # fimg_{domain_b}: fimg_{domain_b} # }), # dict( # typePackInputs, # keys[fimg_{domain_a}, fimg_{domain_b}], # data_keys[fimg_{domain_a}, fimg_{domain_b}]) ]这段配置展示了无配对图像任务CycleGAN 类的典型 pipeline先分别加载img_A、img_B两张图再用TransformBroadcaster让两张图共享随机参数完成 resize 与 random crop保证两个域图像的空间对齐随后按水平方向分别翻转两张图最后在真实使用中通过KeyMapper重映射字段名、PackInputs把图像打包成模型的inputs。也就是说transform 的产物是按字段组织的图像 dict而 preprocessor 接手的就是这个 dict。核心实现DataPreprocessor源码解析MMagic 中数据预处理器的代码实现路径为 mmagic/models/data_preprocessors/data_preprocessor.py并在 mmagic/models/data_preprocessors/init.py 中通过MODELS.register_module()注册为DataPreprocessor与MattorPreprocessor两个可用类型。类继承与设计定位DataPreprocessor继承自 mmengine 的ImgDataPreprocessor其 docstring 明确指出它是面向生成模型的图像预处理器提供图像张量的归一化normalizationBGR/RGB 通道顺序转换channel order conversionpadding默认将尺寸向上取整到pad_size_divisor的整数倍数据从 CPU 到目标设备GPU的搬运cast_data。与普通分类/检测模型的 preprocessor 最大的不同在于它的inputs不仅可以是 Tensor还可以是 dict 或 list of dict。处理规则为若某个值是Tensor且其 key 不在_NON_IMAGE_KEYS中则按图像张量处理padding、通道转换、归一化若该 key 属于_NON_IMAGE_KEYS如噪声noise则保持原样不做图像处理若值是字符串或整数同样保持原样。类内定义了两个关键集合_NON_IMAGE_KEYS [noise] _NON_CONCATENATE_KEYS [num_batches, mode, sample_kwargs, eq_cfg]_NON_IMAGE_KEYS中的字段典型如扩散模型所需的随机噪声noise不需要按图像处理_NON_CONCATENATE_KEYS中的字段如num_batches、mode、sample_kwargs、eq_cfg不需要参与 batch 维度的拼接直接取列表首元素即可。完整参数表来自构造函数DataPreprocessor.__init__的签名与默认值如下这些参数都可以在配置文件的data_preprocessordict(...)中直接指定参数默认值含义mean127.5各通道像素均值。注意归一化在通道顺序转换之后执行。不指定则不归一化std127.5各通道像素标准差。同样在通道转换之后应用pad_size_divisor1padding 后图像尺寸需为该值的整数倍pad_value0padding 填充的像素值pad_modeconstant传给torch.nn.functional.pad的 padding 模式non_image_keysNone追加到_NON_IMAGE_KEYS的自定义非图像字段仅当inputs为 dict 或 list of dict 时生效non_concentate_keysNone追加到_NON_CONCATENATE_KEYS的自定义不拼接字段output_channel_orderNone期望输出即模型输入的通道顺序只能是RGB、BGR或None不转换data_keysgt_img需要在 data sample 中预处理的字段名如gt_imginput_viewNone输入张量的 view标注未来可能删除当前仅 LIIF 等场景使用output_viewNone输出张量的 view同样标注可能删除stack_data_sampleTrue是否将 data sample 列表 stack 为一个 DataSample仅支持DataSample对象源码中output_channel_order有显式断言只支持RGB、BGR或None其他取值会直接报错。而mean/std若传入标量构造时会被包装成单元素列表[mean]从而支持对单通道图用同一组均值/方差的写法。调用链以 CycleGAN 的train_step为例preprocessor 在模型代码中的引用位置非常直接。以 mmagic/models/editors/cyclegan/cyclegan.py 的train_step为例message_hub MessageHub.get_current_instance() curr_iter message_hub.get_info(iter) data self.data_preprocessor(data, True) disc_optimizer_wrapper optim_wrapper[discriminators] inputs_dict data[inputs] outputs, log_vars dict(), dict() # forward generators with disc_optimizer_wrapper.optim_context(self.discriminators): for target_domain in self._reachable_domains: # fetch data by domain source_domain self.get_other_domains(target_domain)[0] img inputs_dict[fimg_{source_domain}] # translation process results self( img, test_modeFalse, target_domaintarget_domain) ...这里的self.data_preprocessor(data, True)是 preprocessor 的forward(data, trainingTrue)调用第二个参数True表示训练模式。调用后返回的 dict 中data[inputs]是完成设备搬移、padding、归一化、通道转换后的输入CycleGAN 场景下是一个 dictkey 形如img_A/img_Bdata[data_samples]是携带padding_size、*_output_channel_order等预处理元信息的 DataSample。在test_step/val_step中见同文件 215-293 行调用形式变为data self.data_preprocessor(data)trainingFalse且生成结果需要经过self.data_preprocessor.destruct(fake_img, data_samples[idx], fimg_{target_domain})还原成原始像素空间后再写入 DataSample 供可视化与评估使用。前向处理流程forward逐层拆解DataPreprocessor.forwarddata_preprocessor.py的完整处理链路为cast_data(data)把 DataLoader 返回的数据搬运到目标设备。源码中cast_data对str/int/float直接原样返回其余交给父类ImgDataPreprocessor.cast_data处理按inputs类型分派torch.Tensor→_preprocess_image_tensorList[torch.Tensor]→_preprocess_image_list处理 batch 内尺寸不一致的图像列表按列表内最大尺寸对齐 padding 后 stackdict→_preprocess_dict_inputs对 dict 中每个 key 分别处理支持_NON_IMAGE_KEYS跳过、_NON_CONCATENATE_KEYS取首元素List[dict]→ 先转成dict of list再走_preprocess_dict_inputs其余类型直接抛ValueError。_preprocess_data_sample(data_samples, training)对data_keys指定的字段默认gt_img执行通道转换与归一化并把*_enable_norm、*_output_channel_order、*_mean、*_std等元信息写回 data sample训练时目标通道顺序为output_channel_order且执行归一化测试时目标通道顺序固定为BGR且不归一化最后按stack_data_sample决定是否调用DataSample.stack。三个内部子步骤通道顺序解析与转换_parse_channel_order/_do_conversionpreprocessor 会先根据张量维度推断通道维索引{2: 1, 3: 0, 4: 1, 5: 2}分别对应(H*W, C)、(C, H, W)、(N, C, H, W)、(N, t, C, H, W)再结合 data sample 元信息gt_color_type、gt_channel_order等判断输入通道顺序。若输入是 3/4 通道的 RGB/BGR 且与目标顺序不同则用torch.index_select按[2, 1, 0]4 通道时为[2, 1, 0, 3]交换通道单通道输入无法转换会打印一次 WARNING 后原样返回。归一化_do_norm将mean/stdreshape 成可广播形状后执行(inputs - mean) / std。默认meanstd127.5意味着把[0, 255]的像素映射到[-1, 1]区间——这也是众多 GAN 模型如 DeepFill、StyleGAN 系列输入网络的常见取值。归一化前会校验通道数mean/std的通道数必须为 1 或与输入通道数一致避免单通道均值被广播到 3 通道图。Padding_preprocess_image_tensor内先取输入H, W计算target_h ceil(h / pad_size_divisor) * pad_size_divisor宽同理再用F.pad(inputs, (0, pad_w, 0, pad_h), pad_mode, pad_value)在右下侧补齐并把(0, pad_h, pad_w)写入每个 data sample 的padding_size元信息。这个设计保证同一 batch 内不同尺寸的输入可以对齐到统一尺寸送入网络而真实尺寸信息通过padding_size保留供后续destruct精确还原。逆向操作destruct把输出还原成图像模型输出如生成器输出的 fake 图仍然处于已归一化 已 padding 已转换通道的状态不能直接用于可视化或指标计算。destructdata_preprocessor.py按逆序还原_destruct_norm_and_conversion先反归一化outputs * std mean再做通道转换尝试转回BGR。源码注释特别说明必须先反归一化再反转换因为归一化所用的 mean/std 是基于转换后通道顺序计算的_destruct_padding依据 data sample 中保存的padding_size裁剪掉补齐的右下区域。same_paddingTrue时用第一个样本的 padding 信息裁剪并返回 stack 张量False时按每个样本各自的 padding 信息裁剪并返回张量列表因为还原后尺寸可能不同最后clamp_(0, 255)确保像素落在合法范围。在 CycleGAN 的val_step中fake_img self.data_preprocessor.destruct(fake_img, data_samples[idx], fimg_{target_domain})即为典型用法以生成域img_{target_domain}对应的预处理元信息为基准把单张 fake 图还原为 BGR 像素图。任务定制MattorPreprocessor抠图专用针对图像抠图matting任务MMagic 在 mmagic/models/data_preprocessors/mattor_preprocessor.py 提供了DataPreprocessor的子类MattorPreprocessor内置data_keys [gt_fg, gt_bg, gt_merged, gt_alpha]即前景、背景、合成图、alpha 通道都作为图像字段统一预处理默认mean[123.675, 116.28, 103.53]、std[58.395, 57.12, 57.375]ImageNet 统计值、output_channel_orderRGB新增proc_trimap参数rescale_to_zero_one默认将 trimap 除以 255 映射到[0, 1]或as-is仅转 float32训练时对 data_keys 字段执行data / 255.的缩放测试时强制 batch_size1assert len(data[data_samples]) 1以兼容不同尺寸的测试图forward的最后会把图像与 trimap 在通道维拼接torch.cat得到N, (4/6), H, W的输入直接喂给抠图网络。测试用例 tests/test_models/test_data_preprocessors/test_mattor_preprocessor.py 覆盖了该流程通用的 preprocessor 则在 tests/test_models/test_data_preprocessors/test_data_preprocessor.py 中拥有test_init、test_parse_channel_order、test_do_conversion、test_preprocess_image_tensor、test_preprocess_image_list、test_preprocess_dict_inputs、test_destruct等十余组单元测试可据此验证各子步骤行为。配置实战在模型配置中启用 preprocessor在 MMagic 的模型配置中data_preprocessor是model字典下的一个字段多数任务只需默认配置即可开箱使用# configs/_base_/models/base_cyclegan.py model dict( typeCycleGAN, data_preprocessordict(typeDataPreprocessor), ... )# configs/_base_/models/base_pix2pix.py model dict( typePix2Pix, data_preprocessordict(typeDataPreprocessor), ... )需要自定义归一化范围时显式传入mean/std。例如 configs/base/models/base_deepfillv2.py 中图像修复模型将像素归一化到[-1, 1]model dict( typeTwoStageInpaintor, disc_input_with_maskTrue, data_preprocessordict( typeDataPreprocessor, mean[127.5], std[127.5], ), ... )StyleGAN、BigGAN、SAGAN、DCGAN 等生成模型的基础配置如 configs/base/models/base_styleganv2.py、configs/base/models/biggan/base_biggan_128x128.py也都采用了data_preprocessordict(typeDataPreprocessor)的默认写法可见该预处理器覆盖了从图像生成到图像编辑、修复、抠图的绝大多数 MMagic 任务。小结职责边界transform 负责数据增强与打包DataPreprocessor负责设备搬移、padding、归一化与通道转换两者在 configs/base/datasets/unpaired_imgs_256x256.py 与 mmagic/models/data_preprocessors/data_preprocessor.py 中形成了完整的pipeline → preprocessor → model数据链路训练与测试不对称训练时执行归一化且通道转换跟随output_channel_order测试时统一转为BGR且不做归一化这是生成模型可视化输出的关键细节可逆性设计所有预处理信息padding 尺寸、通道顺序、归一化参数都会写入 data sample 元信息配合destruct即可无损还原模型输出扩展性通过non_image_keys、non_concatenate_keys、data_keys可以灵活适配多输入/多字段的生成任务而MattorPreprocessor则展示了面向特定任务抠图 trimap 拼接的定制范式。赞分享媒体生成计算机视觉深度学习人工智能大模型【免费下载链接】mmagicOpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic : Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.项目地址https://gitcode.com/gh_mirrors/mm/mmagic点击查看免费下载相关推荐Home Assistant WiLight 灌溉动作详解使用 wilight.set_watering_time 控制浇水时长Home Assistant WiLight 灌溉动作详解使用 wilight.set_watering_time 控制浇水时长 本指南围绕 Home Ass媒体生成计算机视觉深度学习人工智能大模型终极PRML数据预处理指南从标准化到特征转换的完整路径终极PRML数据预处理指南从标准化到特征转换的完整路径 在机器学习和模式识别领域数据预处理是构建高性能模型的关键步骤。PRMLPattern Recogn机器学习深度学习CVNets知识蒸馏技术如何用大模型提升小模型性能的完整指南CVNets知识蒸馏技术如何用大模型提升小模型性能的完整指南 在计算机视觉领域CVNets知识蒸馏技术是一种革命性的方法它通过巧妙地将大型预训练模型教师上一篇awesome-yii2 电商系统全解析从Fecshop到yincart2的终极指南 下一篇7种Web响应渲染方案深度测评为什么Go开发者首选Render创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。