在detectron2训练中,我们可以在配置中定义INPUT.MIN_SIZE
和INPUT.MAX_SIZE
,以告诉detectron根据宽度缩放到什么图像分辨率(高度由detectron 2确定(。我知道这个缩放是由Edge最短尺寸函数完成的。
我的问题是,这两个变量之间的区别是什么?它们在这个函数中是如何工作的?
假设我有1280 x 720的训练图像,但也有2560 x 1440的训练图像。我想将所有图像缩放到最小1280 x 720,所以我会放INPUT.MIN_SIZE(720,)
。那么我将用什么来填充最大变量,算法将如何处理?
答案与ResizeShortestEdge
文档中所说的完全一样:
它试图将较短的边缩放到给定的short_edge_length,只要较长的边不超过max_size。如果达到max_size,则缩小比例,使较长的边不超过max _size。
您也可以在源代码中看到这一点,它计算新形状(粘贴在下面以便于参考(。
def get_output_shape(
oldh: int, oldw: int, short_edge_length: int, max_size: int
) -> Tuple[int, int]:
"""
Compute the output size given input size and target short edge length.
"""
h, w = oldh, oldw
size = short_edge_length * 1.0
scale = size / min(h, w)
if h < w:
newh, neww = size, scale * w
else:
newh, neww = scale * h, size
if max(newh, neww) > max_size:
scale = max_size * 1.0 / max(newh, neww)
newh = newh * scale
neww = neww * scale
neww = int(neww + 0.5)
newh = int(newh + 0.5)
return (newh, neww)
因此,在您的情况下,您将short_edge_length设置为720,max_size将设置为1280。如果你这样做,参考上面的代码,你会看到,
a( 首先,在线scale = size / min(h, w)
处将缩放因子计算为0.5。
b( 然后在线newh, neww = size, scale * w
处将新的宽度和高度分别计算为1280和720。
c( 最后,条件if max(newh, neww) > max_size:
不满足,因此不计算新的缩放因子并且不更新新的宽度和高度。
请注意,您也可以将max_size设置为高于1280,这不会有任何区别。如果您将其设置为低于1280,则(c(中提到的条件将为真,因此将计算新的比例,并缩小新的宽度和高度。