You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:50:40