调用map()后Bounding boxes张量为空的问题求助
解决KerasCV JitteredResize后Bounding Boxes为空的问题
问题核心原因
你的Bounding Boxes坐标不符合xyxy格式的要求:xyxy格式定义为(xmin, ymin, xmax, ymax),必须满足xmin < xmax且ymin < ymax。但从你提供的原始张量来看,多个Box存在坐标颠倒问题:
[315.0, 537.0, 557.0, 522.0]:ymin=537大于ymax=522[46.0, 549.0, 270.0, 534.0]:ymin=549大于ymax=534- 后续两个Box也存在相同的y坐标颠倒情况
KerasCV的JitteredResize会自动过滤所有无效的Bounding Boxes,最终导致处理后Box张量为空。
解决方案
1. 修复Bounding Boxes坐标顺序
添加预处理函数,遍历所有Box并修正坐标顺序,确保满足xyxy格式要求:
def fix_bounding_boxes(data): boxes = data["bounding_boxes"]["boxes"] # 修正x坐标,确保xmin < xmax x_min = tf.math.minimum(boxes[..., 0], boxes[..., 2]) x_max = tf.math.maximum(boxes[..., 0], boxes[..., 2]) # 修正y坐标,确保ymin < ymax y_min = tf.math.minimum(boxes[..., 1], boxes[..., 3]) y_max = tf.math.maximum(boxes[..., 1], boxes[..., 3]) # 重新组合合法的Boxes fixed_boxes = tf.stack([x_min, y_min, x_max, y_max], axis=-1) data["bounding_boxes"]["boxes"] = fixed_boxes return data # 在增强前先修复坐标 train_ds = train_ds.map(fix_bounding_boxes, num_parallel_calls=tf.data.AUTOTUNE) train_ds = train_ds.map(augmenter, num_parallel_calls=tf.data.AUTOTUNE)
2. 调整Scale Factor范围(可选)
你设置的scale_factor=(0.75, 0.76)范围过窄,可能导致缩放后的图像无法容纳修复后的Box。建议恢复官方示例的合理范围:
augmenter = keras.Sequential( layers=[ keras_cv.layers.JitteredResize( target_size=(W_RESIZED, H_RESIZED), scale_factor=(0.75, 1.3), bounding_box_format="xyxy" ), ] )
3. 验证修复结果
处理后重新打印张量确认效果:
debug_data = next(iter(train_ds.take(1))) print(debug_data['bounding_boxes'])
内容的提问来源于stack exchange,提问作者smaina
相关产品推荐
相关产品推荐

