Билинейный upsample в тензорном потоке?

Я хочу сделать простой билинейный размер (не обязательно целочисленным фактором) в TensorFlow. Например, начиная с тензора (32,3,64,64), я хотел бы тензор (32,3,96,96), где каждый 64x64 был масштабирован в 1,5 раза с использованием билинейной интерполяции. Как лучше всего это сделать?

Я хотел бы, чтобы это поддерживало произвольные факторы > 1, а не только 1.5.

Примечание: операция на каждом 64x64 будет такой же, как what skimage.transform.rescale (scale=1.5, order=1) делает.

2 ответов


tf.изображение.resize_images должны делать то, что вам нужно. Он принимает как 3D (одно изображение), так и 4D (партия изображений) тензоров, с произвольной глубиной (количество каналов). Так что, надеюсь, это сработает:

# it's height, width in TF - not width, height
new_height = int(round(old_height * scale))
new_width = int(round(old_width * scale))
resized = tf.image.resize_images(input_tensor, [new_height, new_width])

билинейная интерполяция по умолчанию, поэтому вам не нужно указывать его. Вы также можете использовать resize_bilinear напрямую.


Я бы предложил не использовать tf.image.resize_* функции они страдают от неприятных ошибок что будет не будет исправлено.

новый, другой набор функций пересчета изображений, по-видимому, находится в конвейере. В то же время, вы можете найти некоторые примеры в интернете о том, как сделать это самостоятельно, используя, например,перенесены извилин. К сожалению, это гораздо менее эффективно, что на канал upsampling, но правильно лучше чем быстрее.