如何在 MediaPipe Model Maker 中自定义图像增强类型

12次阅读

如何在 MediaPipe Model Maker 中自定义图像增强类型

截至 mediapipe model maker v0.10.9,官方不支持直接配置特定增强操作(如仅保留水平翻转、曝光调整和模糊),其 `do_data_augmentation` 仅为开关式布尔参数,内置增强逻辑固定且不可定制。

MediaPipe Model Maker 的 image_classifier 模块为快速部署提供了便捷封装,但在数据增强(Data Augmentation)层面高度抽象化。当前版本中,HParams(do_data_augmentation=True/False) 仅控制是否启用预设的默认增强流水线,该流水线由底层 ImagePreprocessor 实现,包含且仅包含两项操作:

  • ✅ 随机水平翻转(tf.image.random_flip_left_right)
  • ✅ 随机扭曲裁剪(tf.image.sample_distorted_bounding_box,会破坏原始宽高比,后续缩放可能导致形变)

⚠️ 重要限制说明:

  • ❌ 不支持单独启用/禁用某类增强(例如“只开翻转、关裁剪”);
  • ❌ 官方未实现曝光(exposure)、高斯模糊(blur)、色彩抖动、对比度调整等常见增强;
  • ❌ 无公开 API 或配置项允许传入自定义 tf.keras.layers 或 tf.image 函数链。

替代方案(推荐实践)

若需精确控制增强策略(如仅应用 random_flip_left_right + adjust_exposure + gaussian_blur),有以下两种可行路径:

✅ 方案一:预处理数据集(推荐,简洁安全)

在调用 ImageClassifier.create() 前,对原始训练数据进行离线增强,并将结果保存为新数据集:

import tensorflow as tf import numpy as np  def custom_augment(image, label):     # 1. 随机水平翻转     image = tf.image.random_flip_left_right(image)     # 2. 调整曝光(模拟 gamma 校正)     image = tf.image.adjust_gamma(image, gamma=0.8 + tf.random.uniform([]) * 0.4)     # 3. 添加轻微高斯模糊(需自定义核)     blur_kernel = tf.constant([         [1, 2, 1],         [2, 4, 2],         [1, 2, 1]     ], dtype=tf.float32) / 16.0     blur_kernel = blur_kernel[:, :, tf.newaxis, tf.newaxis]     image = tf.nn.conv2d(         tf.expand_dims(image, 0),          blur_kernel,          strides=1,          padding='SAME'     )[0]     return tf.clip_by_value(image, 0.0, 255.0), label  # 应用于 tf.data.Dataset train_data = train_data.map(custom_augment, num_parallel_calls=tf.data.AUTOTUNE) train_data = train_data.cache().shuffle(1000).batch(32).prefetch(tf.data.AUTOTUNE)  # 创建模型时关闭内置增强 hparams = image_classifier.HParams(     epochs=100,     export_dir="exported_model_2",     do_data_augmentation=False  # ← 关键:避免重复增强 )

⚙️ 方案二:继承并重写核心类(高级,需维护)

通过继承 ImageClassifier 并覆盖 _create_preprocessing_layer() 或修改 ImagePreprocessor 行为实现深度定制。但需注意:

  • 需 fork MediaPipe 仓库并修改源码(如 mediapipe/model_maker/python/vision/core/image_preprocessing.py);
  • 后续升级 Model Maker 时需手动同步变更,维护成本高;
  • 不适用于生产环境快速迭代场景。

总结建议

对于绝大多数项目,预处理数据集(方案一)是更鲁棒、可复现且符合工程最佳实践的选择。它完全绕过框架限制,赋予你对每一步增强的绝对控制权,同时保持与 MediaPipe Model Maker 训练流程的兼容性。务必在增强后关闭 do_data_augmentation,防止双重增强导致分布偏移。未来若 MediaPipe 开放 augmentation_fn 参数或 CustomAugmentationOptions,可再平滑迁移。

text=ZqhQzanResources