公司动态

MediaPipe 数据集实战:3 步把散图变成能训练的完整数据集

📅 2026/9/2 14:13:34
MediaPipe 数据集实战:3 步把散图变成能训练的完整数据集
MediaPipe 数据集实战3 步把散图变成能训练的完整数据集【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe装标注工具装到一半报错、导出的 XML 和代码对不上、格式转换折腾一下午——这些事我都被坑过。这篇就是帮你绕开它们用 MediaPipe 自带的数据集加载器把一堆散图整理成图像分类、目标检测、手势识别三种任务都能直接吃进去的格式全程照着做就能跑通。一句话说明本文要解决的MediaPipe 数据集怎么从原始散图整理、标注、预处理到划分做成 MediaPipe Model Maker 训练时能直接加载的完整数据。开始前确认这三样一个装了 Python 的环境能import tensorflow和import mediapipeModel Maker 依赖 TensorFlow 的数据加载一批原始图散在几个文件夹里就行不用提前重命名时间图像分类这套流程从零到能训练约 20 分钟检测类因为要写标注框会多花点下面按先跑通最小集再上正式数据的顺序走。第 1 步把散图摆成它认得的目录先给结论图像分类不需要任何标注文件目录名就是标签。一个类别一个子目录图随便塞进去加载器就认得。这是最省事的起点我建议先用 100 张左右的图把整条链路跑通再谈扩量。摆成这样flowers/ ├── daisy/ # 一个子目录 一个类别 │ ├── 001.jpg │ └── 002.jpg ├── dandelion/ └── rose/加载只需一行from_folder会自动把每个子目录名当成一个标签并随机打乱顺序from mediapipe.model_maker.python.vision import image_classifier data image_classifier.Dataset.from_folder(flowers, shuffleTrue) print(data.num_classes, data.label_names) # 类别数、类别名两个细节帮你少踩坑子目录里别放二级子目录加载器只认类别/图片这一层更深它不读。空目录会直接报错ValueError: Image size is zero所以至少每个类别放一张图。类别名的顺序是按字母排序后确定的想控制编号就别用容易混淆的命名。这套目录约定的完整逻辑在 image_classifier/dataset.py 里想核对它到底怎么从路径推出标签就点进去看from_folder。第 2 步给目标检测喂框两种格式二选一先说结论目标检测比分类多一步——每张图要配标注框MediaPipe 支持 COCO 和 Pascal VOC 两种你手上哪种标注工具就用哪种。两者目录长这样区别只在标注放在哪格式图片目录标注存放适合Pascal VOCimages/Annotations/下每张图一个.xml用 LabelImg 这类工具逐张框COCOimages/全量框写进一个labels.json批量标注、框多VOC 那张.xml就是给图片配坐标filename指向图每个object里是类别名加一个四角坐标框d86b20e0-IMG_0509.jpg ├─ object: android 框 (7,122)-(296,402) └─ object: pig_android 框 (523,69)-(723,329)一个真实的标注样例可以翻 object_detector/testdata/pascal_voc_data/Annotations/对着改就行。加载按格式选方法from mediapipe.model_maker.python.vision import object_detector data object_detector.Dataset.from_pascal_voc_folder(voc_dir) # 或者 COCODataset.from_coco_folder(coco_dir)有两个看不见的自动处理值得知道无效框会被丢掉面积为 0、超出图边界、或者一张图一个框都没有的加载器直接跳过不会让脏数据进训练。它会自动打包成 TFRecord 缓存按每 100 张一个分片、最多 10 个分片来存第二遍起走缓存不用重算。这套转换逻辑在 object_detector/dataset.py 和同目录的dataset_util.py里。⚠️ COCO 的labels.json里类别 id0是**保留给背景background**的。写了0却填了别的名字会直接报错不写0也没事加载器会自动补上。第 3 步关键点任务要留一个没目标的类别先给结论手势识别这类任务除了各类手势的图还得专门留一个none目录装不是手势的图。少了它加载器会拒绝启动。原因是模型得学会画面里没手时别瞎报没有负样本它会把什么都当成手势。目录约定和分类一样只是多了一条硬要求gestures/ ├── none/ # 必须存在放无手或非目标手势的图 ├── call/ ├── four/ └── rock/from mediapipe.model_maker.python.vision.gesture_recognizer import Dataset data Dataset.from_folder(gestures)加载时它不是直接用像素而是先用一个手势检测模型从每张图里抠出 21 个手部关键点再拿关键点去训练。所以检测不到手的图会被自动剔除你塞进去的图不一定都能用日志里会报有效样本数。想放宽检测松紧可以传min_detection_confidence默认0.7越高越严格、丢图越多。这套从图提关键点、剔无效样本的流程在 gesture_recognizer/dataset.py 的from_folder和_get_hand_data里。第 4 步拆分、缩放、增强都交给它先说结论别自己再写一遍 resize 和数据增强MediaPipe 的预处理和训练/验证拆分都内置了你只要定比例。拆分训练/验证/测试集就像平时写作业、模考、期末考——平时练、考前自测、最后一次性见真章。用split链式切就行图像分类官方 demo 是 8:1:1 的切法train_data, rest data.split(0.8) # 80% 训练 valid_data, test_data rest.split(0.5) # 剩下 20% 平分缩放与增强图像分类默认把图缩到224×224。训练和验证走两条路这点很多人忽略阶段做法目的训练随机裁剪 水平翻转再缩放到 224×224制造变化、防过拟合验证/测试固定中心裁剪 缩放保证评估稳定可比之后像素会从 0–255 归一化成 0–1 的小数再按类别均值/方差做标准化。想调裁剪的宽高比范围、面积范围这些参数都集中在 image_preprocessing.py 的常量里IMAGE_SIZE224、CROP_PADDING32就是默认值。避坑区这四个坑最常见类别严重不均衡。现象某个类别几百张另一个只有几张模型只认多数派。 原因损失被大类主导。 一行解法采集时给小类多拍或对小类图做增强补量实在不行在训练里给类别加权。低质量图混进来。现象图特别糊、过暗或者 JPEG 压得一块一块的。 原因低质图会拉低整体分布模型学到的是噪点。 一行解法采集前定个门槛分辨率别低于 256×256明显模糊的当场删。标注格式和代码对不上。现象VOC 的filename写错导致找不到图或框坐标超出图像尺寸。 原因加载器会静默跳过非法框你以为有框其实没进训练。 一行解法跑完加载后查一下日志里的有效样本数和目录里图数对不对得上。数据一大就变慢。现象几万张图每次重新解码训练卡在数据加载。 原因每次都在原图上现场算。 一行解法检测类传cache_dir固定 TFRecord 缓存目录先用max_num_images限定张数试跑确认没问题再放开全量。下一步去哪散图 → 标准目录加框 → COCO/VOC关键点留none最后让内置预处理做缩放和拆分四步走完数据集就能喂给 Model Maker。接着你可以打开 image_classifier_demo.py 看加载→拆分→训练→导出一整段真实调用照着改成本地路径即可检测类翻 object_detector/ 下的 demo 和testdata/里面有现成的 COCO 与 VOC 小数据集当模板想弄清标签解析的底层行为查 util/label_map_util.cc如果这篇帮你省下了折腾格式的时间点个赞或收藏下一篇接着讲数据集训完之后模型怎么导出和量化。【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考