TensorFlow中如何调整不同尺寸输入图像的目标检测边界框?
解答:图像缩放后同步调整边界框的TensorFlow实现
针对你的目标检测任务中图像缩放后边界框同步调整的问题,我来分两种情况给你说明:
一、TensorFlow是否有现成的边界框缩放函数?
在TensorFlow 2.x中,并没有专门的、一步到位的原生函数直接处理绝对像素坐标的边界框缩放,但在兼容TF1.x的模块里有一个tf.compat.v1.image.resize_bounding_boxes可以用——不过它有个前提:输入的边界框坐标必须是归一化到[0,1]区间的,而且坐标顺序是[ymin, xmin, ymax, xmax],和我们常用的[xmin, ymin, xmax, ymax]不一样,用的时候要特别注意顺序转换。
举个使用示例:
import tensorflow as tf # 假设你的原始边界框是绝对像素值,形状为(num_boxes, 4),顺序是[xmin, ymin, xmax, ymax] original_boxes = tf.constant([[50, 50, 200, 200], [300, 300, 500, 500]], dtype=tf.float32) original_size = tf.constant([650, 650], dtype=tf.float32) target_size = tf.constant([1280, 1280], dtype=tf.float32) # 1. 先把边界框转为归一化的TF要求格式[ymin, xmin, ymax, xmax] normalized_boxes_tf = tf.stack([ original_boxes[:,1]/original_size[1], original_boxes[:,0]/original_size[0], original_boxes[:,3]/original_size[1], original_boxes[:,2]/original_size[0] ], axis=-1) # 2. 使用resize_bounding_boxes缩放 new_normalized_boxes = tf.compat.v1.image.resize_bounding_boxes( normalized_boxes_tf, original_size=[650, 650], target_size=[1280, 1280] ) # 3. 转换回我们常用的[xmin, ymin, xmax, ymax]绝对像素格式 new_boxes = tf.stack([ new_normalized_boxes[:,1]*target_size[0], new_normalized_boxes[:,0]*target_size[1], new_normalized_boxes[:,3]*target_size[0], new_normalized_boxes[:,2]*target_size[1] ], axis=-1) # 如果需要整数坐标,再转类型 new_boxes_int = tf.cast(new_boxes, tf.int32)
二、手动乘以缩放因子的方式可行吗?
当然可行!而且这种方式更直观、不容易出错,完全适合你的场景——因为你的原始图像和目标图像都是正方形,宽高缩放因子相同(如果是非正方形,分开计算宽高缩放因子就行)。
步骤非常简单:
- 计算宽、高方向的缩放因子:
scale_w = target_width / original_width,scale_h = target_height / original_height - 把边界框的每个坐标分别乘以对应方向的缩放因子
直接上代码示例:
import tensorflow as tf original_boxes = tf.constant([[50, 50, 200, 200], [300, 300, 500, 500]], dtype=tf.float32) original_size = (650, 650) target_size = (1280, 1280) # 计算缩放因子 scale_w = target_size[0] / original_size[0] scale_h = target_size[1] / original_size[1] # 拆分坐标并分别缩放 xmin, ymin, xmax, ymax = tf.split(original_boxes, 4, axis=-1) new_xmin = xmin * scale_w new_ymin = ymin * scale_h new_xmax = xmax * scale_w new_ymax = ymax * scale_h # 合并为新的边界框张量 new_boxes = tf.concat([new_xmin, new_ymin, new_xmax, new_ymax], axis=-1) new_boxes_int = tf.cast(new_boxes, tf.int32)
总结
- 如果想用现成函数,可以用
tf.compat.v1.image.resize_bounding_boxes,但一定要注意坐标顺序和归一化的要求; - 更推荐手动计算缩放因子的方式,代码简洁、逻辑清晰,不容易踩坑,完全能满足你的需求。
内容的提问来源于stack exchange,提问作者krishnab
相关产品推荐
相关产品推荐

