MediaPipe目标检测模型无法纳入负样本/背景图训练的问题
MediaPipe目标检测负样本无法纳入训练的解决方案
问题核心
你的500张带目标标注图+200张负样本图未被完整识别,训练日志仅显示train_data size: 500,原因是MediaPipe默认数据加载逻辑会过滤无有效标注的图像,你尝试的两种XML标注方式均不符合其识别要求:
- 无
<object>标签的XML会被判定为无标注图像,默认被过滤 - 含0尺寸
<bndbox>的<object>会被判定为无效标注,同样被过滤
解决步骤
1. 修改训练配置文件,允许加载无标注图像
在你的训练Pipeline配置文件(如ssd_mobilenet_v2_fpnlite.config)中,找到train_input_reader模块,添加load_all_images: true参数,强制加载所有图像:
train_input_reader: { label_map_path: "path/to/your_label_map.pbtxt" tf_record_input_reader { input_path: "path/to/train.tfrecord" } load_all_images: true // 关键:开启后会加载所有图像,包括负样本 }
2. 调整TFRecord转换脚本,保留负样本
若你使用MediaPipe官方的VOC转TFRecord脚本(如create_pascal_tf_record.py),默认会跳过无<object>的标注文件。需要修改脚本逻辑:
找到类似以下的过滤代码:
if len(annotations) == 0: logging.info(f"Skipping {image_path} - no annotations.") continue
将其注释或删除,确保无标注的负样本图像被写入TFRecord。
3. 负样本标注保持最简格式
无需添加无效<object>标签,负样本XML保留基础结构即可(即你尝试的第一种格式):
<annotation verified="yes"> <folder>images</folder> <filename>10.jpeg</filename> <path>/content/jpeg_images/train/images/10.jpeg</path> <source> <database>Unknown</database> </source> <size> <width>640</width> <height>480</height> <depth>3</depth> </size> <segmented>0</segmented> </annotation>
验证
重新生成TFRecord后,检查样本总数应为700。启动训练后,查看日志中的train_data size是否更新为700,确认负样本已被纳入训练。
内容的提问来源于stack exchange,提问作者user22962610
相关产品推荐
相关产品推荐

