ssd_mobilenet_v2_keras训练时图片随机旋转标注框错位问题
问题定位
你配置中声明的三类数据增强(随机水平翻转、随机转灰度、随机JPEG质量扰动)都不会触发图片旋转,出现无标注同步的随机旋转、真值框错位,核心原因是图片EXIF方向元数据未被加载逻辑正确解析,和训练增强逻辑无关:
- 手机、消费级相机拍摄的JPG图片通常会在EXIF信息中写入拍摄朝向标记,日常用图片查看器打开时,软件会自动读取这个标记把图片旋转到视觉正确的方向,但部分版本的TensorFlow Object Detection API(TFOD API)图片解码逻辑默认忽略该标记,直接按像素原始存储顺序加载图片
- 数据集中不同图片的EXIF方向标记不统一时,就会出现部分图片加载后呈现旋转状态——这不是训练阶段主动做了旋转增强,是图片加载后的朝向和你标注时看到的预览朝向不一致
- 评估流程不加载训练阶段的数据增强配置,仍然偶现旋转问题,也可以佐证问题出在原始图片加载环节,而非训练增强配置。
修复方案
按优先级从高到低尝试:
- 优先验证根因:随机抽取3-5张出现真值框错位的图片,用OpenCV或PIL直接读取像素数组展示,和本地图片查看器打开的效果对比,如果直接读取的结果是旋转状态,即可确认是EXIF方向问题。
- 批量预处理数据集(最稳妥,兼容所有TFOD版本):用PIL的EXIF校正接口批量处理全量图片,把像素直接旋转到正确朝向并抹除EXIF方向信息,处理后不需要修改任何标注文件,因为校正后的图片像素朝向和你标注时看到的完全一致。核心处理代码如下:
import os from PIL import Image, ImageOps # 替换成你的数据集图片存放路径 IMAGE_FOLDER = "./dataset/images" for file_name in os.listdir(IMAGE_FOLDER): if file_name.lower().endswith((".jpg", ".jpeg", ".png")): file_path = os.path.join(IMAGE_FOLDER, file_name) with Image.open(file_path) as img: # 按EXIF标记自动旋转到正确朝向 fixed_img = ImageOps.exif_transpose(img) # 覆盖保存,清空EXIF信息 fixed_img.save(file_path, quality=95, exif=b"") - 配置项自动校正(适合TFOD API v2.5及以上版本):如果不想提前处理数据集,可以在
pipeline.config的训练集、验证集读取配置块中,添加apply_exif_transpose: true参数,让框架加载图片时自动校正EXIF方向,注意训练和评估的输入读取配置都要添加,否则评估阶段仍会出现旋转问题。配置示例:train_input_reader { label_map_path: "./annotations/label_map.pbtxt" tf_record_input_reader { input_path: "./annotations/train.record" } apply_exif_transpose: true } eval_input_reader { label_map_path: "./annotations/label_map.pbtxt" tf_record_input_reader { input_path: "./annotations/val.record" } apply_exif_transpose: true } - 兜底排查:如果以上操作后问题仍然存在,检查你生成TFRecord的脚本逻辑,确认脚本中没有加入未同步调整边界框坐标的旋转、翻转类操作。
内容的提问来源于stack exchange,提问作者Deffo
相关产品推荐
相关产品推荐

