tf.image.sample_distorted_bounding_box中bounding_boxes与min_object_covered的作用及调控问询
我懂这种啃官方文档还是摸不着头脑的感觉,我来给你拆解这俩参数,再用直观的场景和代码例子帮你彻底搞明白~
bounding_boxes 参数
这个参数是用来给函数指定图像里的「目标锚点」,格式是 [batch_size, num_boxes, 4],每个框的数值是归一化到0-1之间的 [y_min, x_min, y_max, x_max](对应图像的上下左右边界)。
简单说就是你告诉函数:「我要围绕这些框里的目标来生成扭曲区域,别瞎选无关的地方」。如果你的图像没有标注的目标框,也可以传全图的框(比如 [[[0, 0, 1, 1]]]),这时候函数就会在全图范围内随机选区域。
min_object_covered 参数
这是个0到1之间的浮点数,作用是给生成的扭曲框设个「最低门槛」:新生成的扭曲框必须覆盖原始 bounding_boxes 中至少多少比例的区域。
比如设成0.3,意思就是扭曲框得盖住原始目标至少30%的面积,避免生成完全脱离目标、只剩背景的无效区域。
函数的工作流程其实是这样的:
- 第一步:先根据你传入的
bounding_boxes锁定候选区域范围(只能在这些框的关联区域里选) - 第二步:按照
min_object_covered的要求,随机生成满足「覆盖比例」的扭曲框,同时还会随机做缩放、偏移、宽高比调整这些扭曲操作 - 第三步:确保最终生成的框,一定符合你设定的「最小覆盖比例」,不会偏离目标太远
假设我们有一张480×640的猫图,猫的原始边界框是归一化后的 [[[0.2, 0.1, 0.8, 0.9]]](也就是猫占据了图像左上方到右下方的大部分区域)。
示例1:常规需求(min_object_covered=0.5)
import tensorflow as tf # 图像形状:高480,宽640,3通道 image_shape = tf.constant([480, 640, 3]) # 猫的原始边界框(归一化后) cat_bbox = tf.constant([[[0.2, 0.1, 0.8, 0.9]]]) # 生成扭曲框 begin, size, distorted_bbox = tf.image.sample_distorted_bounding_box( image_shape, bounding_boxes=cat_bbox, min_object_covered=0.5, aspect_ratio_range=[0.75, 1.33] # 可选:限制生成框的宽高比在4:3到3:4之间 ) # 用生成的框裁剪图像 distorted_image = tf.slice(tf.random.normal(image_shape), begin, size)
效果:生成的扭曲框一定会盖住至少50%的猫,可能是把猫的上半身放大、或者稍微偏移但猫的主体都在框里,绝对不会出现框里全是背景的情况。
示例2:宽松限制(min_object_covered=0.1)
把 min_object_covered 改成0.1后,要求就很低了:生成的框可能只盖住猫的一只爪子、或者一小部分身体,甚至框的大部分是背景,但必须保证至少10%的猫在框内。这种设置适合需要更多随机多样性的场景。
示例3:无特定目标(bounding_boxes传全图框)
如果传入的是全图框 [[[0, 0, 1, 1]]],同时 min_object_covered=0.1,那函数就会在全图随机选区域,只要这个区域的面积至少是全图的10%就行——这时候就相当于完全随机的图像裁剪,没有特定目标的限制。
反例:严格限制(min_object_covered=1.0)
如果设成1.0,生成的框必须100%覆盖原始目标框,这时候扭曲操作只能在原始框内做缩放,不能裁剪掉任何部分的猫,相当于把猫所在的区域随机放大或缩小,但整个猫都会保留在框里。
内容的提问来源于stack exchange,提问作者huangjs

