MediaPipe Model Maker 实战:从目录到端侧 TFLite 的最短路径,附量化导出清单与避坑表 MediaPipe Model Maker 实战从目录到端侧 TFLite 的最短路径附量化导出清单与避坑表【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe你有一堆按类别分好文件夹的照片想训个自定义分类模型上手机但预处理、量化、导出格式转换这些脏活一件没干模型还差得远。MediaPipe Model Maker 是 MediaPipe 仓库内置的模型定制工具链负责数据加载、迁移学习训练以及带量化的 TFLite 导出读完后你会拿到一条目录数据 → 可部署模型的完整最短路径外加一份量化选择清单和几个高频坑。项目坐标它解决什么、和常规训练框架差在哪Model Maker 位于仓库的 mediapipe/model_maker/定位是用你自己的数据定制一个能跑在端侧的小模型而不是通用深度学习框架。它覆盖图像分类、目标检测、手势识别三类视觉任务外加文本分类背后是 TensorFlow 迁移学习。和 PyTorch Lightning 这类通用框架比它的差异集中在两头输入端目录结构就是标签来源不需要单独维护标签文件输出端导出产物直接是 TFLite 加 MediaPipe Tasks 元数据推理端零胶水代码。能力维度Model MakerPyTorch LightningTF 目标检测 API目录结构自动定标签✅——预处理/增强内置管线✅—✅一键量化导出 TFLite✅——MediaPipe Tasks 推理元数据✅——自定义任意网络结构—✅✅数据接入层目录结构即标签三个视觉任务的数据加载是同一个模式Dataset.from_xxx()读数据split()切分create()训练。差别只在入口函数data image_classifier.Dataset.from_folder(data_dir) # 分类类别名 子目录名 train, rest data.split(0.8) val, test rest.split(0.5)目标检测走标注格式入口是from_coco_folderCOCO 的labels.json或from_pascal_voc_folderLabelImg 生成的 XML仓库自带两套测试集可以直接看结构COCO 样例、Pascal VOC 样例。手势识别则是raw_data/下每个手势一个子目录。这样设计的动机是把标注和数据的耦合降到最低图像放哪个文件夹它就属于哪个类别label_names按目录名排序自动生成图像路径和类别 ID 的对应关系由框架维护不会出现标签文件漏了一行这类低级事故。注意这里的 glob 只扫一层子目录分类数据集的目录约定是两层根目录 → 类别文件夹 → 图片。特征处理层你不用写的预处理和增强加载得到的tf.data.Dataset还只是原始像素真正进模型前要过一遍Preprocessor逻辑在 image_preprocessing.py。顺序固定为四步缩放到模型输入尺寸EfficientNet-Lite0 默认 224×224→ 按该 backbone 的 mean/stddev 归一化不同 backbone 数值不同由模型规格自动带出→ 训练分支做增强、验证分支不做 → one-hot 编码标签。增强包括随机裁剪、水平翻转、旋转触发方式只有一个开关image_classifier.HParams(export_dirout, do_data_augmentationTrue)这个一个 bool 控制增强的设计值得注意增强只影响训练集验证/测试集的统计口径始终干净你不用自己写两套管线。对数据量小的自定义类别这个开关建议保持开启——它相当于免费给小样本类别凑人数缓解类别不平衡带来的偏科。模型适配层一次调用拿到端侧模型训练入口是ImageClassifier.create(train_data, validation_data, options)内部完成 hub 模型加载、微调、回调管理你只需要给 optionsoptions image_classifier.ImageClassifierOptions( supported_modelimage_classifier.SupportedModels.EFFICIENTNET_LITE0, hparamsimage_classifier.HParams(export_direxport_dir), ) model image_classifier.ImageClassifier.create(train_data, val_data, options) model.export_model() # 默认动态量化产出 TFLite 元数据 JSONexport_model()的产物不止是 TFLite 文件还会写入描述输入输出张量和标签映射的元数据MediaPipe Tasks 运行时可以直接加载这套产物做推理不需要再手写解析逻辑。量化有三档选择逻辑如下模式需要代表数据典型收益适用dynamic否体积约降 4 倍默认选项int8是默认 500 步体积和延迟收益最大数据充足、追求极限压缩float16否体积减半精度几乎无损GPU 推理场景端到端走查一条命令验证全链路仓库自带 image_classifier_demo.py 作为全链路模板python -m mediapipe.model_maker.python.vision.image_classifier.image_classifier_demo \ --export_dir/tmp/mmp_export不传数据目录时它会下载花卉样例数据集执行后你会看到加载日志打印图像总数和类别数训练若干 epoch 后输出Test accuracy: 0.xx接着进入量化导出export_dir里出现.tflite和元数据文件。想换成自己的数据改两处即可——命令行加--input_data_dir你的目录把--spec换成其他支持的 backbone。检测、手势任务各自也有同构的 demo 脚本走查一遍就能确认你本地环境TensorFlow、hub 下载权限没有卡点。高频坑与绕行方案现象from_folder报 Image size is zero但目录里明明有图。根因glob 只匹配根目录/类别/图片这一层深度你把类别文件夹又套了一层比如train/dogs/2024/路径全部落空。绕行拍平目录若必须按批次归档入库前先做一轮重命名不要指望框架递归。现象int8 量化后在端侧精度掉得比动态量化还多甚至推理崩溃。根因int8 需要代表数据representative dataset去校准每张浮点张量的取值范围代表数据和真实输入分布对不上时校准直接失真。绕行确认导出时传入的train_data是代表性样本而非某个极端子集数据覆盖不足时先用 dynamic 上线攒够真实分布再回炉 int8。坦诚说一句边界Model Maker 的设计目标是小而准的端侧迁移学习不是通用训练框架。需要自定义网络结构、多机多卡大数据集训练时它并非最优解建议直接用 PyTorch Lightning 或 TFDS 生态训练后再自己转 TFLite本文路径只解决小数据集 标准任务这一段。延伸路径想加新任务从 mediapipe/model_maker/python/vision/ 下的 image_classifier、object_detector、gesture_recognizer 三个模块挑一个最接近的抄结构各自的*_demo.py就是最小模板。预处理或量化逻辑想拆出去复用到别处核心代码集中在 vision/core/image_preprocessing.py 和 core/utils/quantization.py都是自包含的。数据切分、保存的底层约定在 core/data/classification_dataset.py改 split 行为前建议先看这个文件。回到开头那个场景目录摆对位置、开关打开、导出调用一次从一堆照片到能上手机的 TFLite之间真正需要你做的决策其实只有三处。【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考