gpt4 book ai didi

tensorflow - Tensorflow 中是否有与 PyTorch 的 RandomResizedCrop 等效的功能?

转载 作者:行者123 更新时间:2023-12-05 06:08:15 34 4
gpt4 key购买 nike

Torchvision 的 RandomResizedCrop当我处理不同尺寸和纵横比的高分辨率图像数据集并且需要将它们的大小调整为统一的尺寸和纵横比而不需要挤压和拉伸(stretch)时,我发现这是一个非常方便的工具。

在 TensorFlow 中是否有与此等效的东西可以映射到 TensorFlow 数据集,或者使用 TensorFlow 操作的 lambda 函数来实现相同的有效结果?

最佳答案

我在库中找不到任何等效项,但 the NNCLR tutorial 中提供了一个有点“官方”的解决方案.它确实依赖于 the tf.image.crop_and_resize function ,正如@TFer 指出的那样。

我对其进行了一些修改,以确保它也具有 PyTorch 实现中的 size 参数的等价物,我称之为 crop_shape 我发现它更清晰:

import tensorflow as tf


class RandomResizedCrop(tf.keras.layers.Layer):
# taken from
# https://keras.io/examples/vision/nnclr/#random-resized-crops
def __init__(self, scale, ratio, crop_shape):
super(RandomResizedCrop, self).__init__()
self.scale = scale
self.log_ratio = (tf.math.log(ratio[0]), tf.math.log(ratio[1]))
self.crop_shape = crop_shape

def call(self, images):
batch_size = tf.shape(images)[0]

random_scales = tf.random.uniform(
(batch_size,),
self.scale[0],
self.scale[1]
)
random_ratios = tf.exp(tf.random.uniform(
(batch_size,),
self.log_ratio[0],
self.log_ratio[1]
))

new_heights = tf.clip_by_value(
tf.sqrt(random_scales / random_ratios),
0,
1,
)
new_widths = tf.clip_by_value(
tf.sqrt(random_scales * random_ratios),
0,
1,
)
height_offsets = tf.random.uniform(
(batch_size,),
0,
1 - new_heights,
)
width_offsets = tf.random.uniform(
(batch_size,),
0,
1 - new_widths,
)

bounding_boxes = tf.stack(
[
height_offsets,
width_offsets,
height_offsets + new_heights,
width_offsets + new_widths,
],
axis=1,
)
images = tf.image.crop_and_resize(
images,
bounding_boxes,
tf.range(batch_size),
self.crop_shape,
)
return images

关于tensorflow - Tensorflow 中是否有与 PyTorch 的 RandomResizedCrop 等效的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65164442/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com