web-dev-qa-db-fra.com

Suréchantillonnage bilinéaire dans tensorflow?

Je veux faire un redimensionnement bilinéaire simple (pas nécessairement par un facteur entier) dans TensorFlow. Par exemple, à partir d'un tenseur (32,3,64,64), je voudrais un tenseur (32,3,96,96), où chaque 64x64 a été redimensionné par un facteur de 1,5 en utilisant une interpolation bilinéaire. Quelle est la meilleure façon de le faire?

Je voudrais que cela prenne en charge des facteurs arbitraires> 1, pas seulement 1,5 spécifiquement.

Remarque: l'opération sur chaque 64x64 serait la même que celle de skimage.transform.rescale (scale=1.5, order=1).

12
Alex I

tf.image.resize_images devrait faire ce dont vous avez besoin. Il accepte à la fois les tenseurs 3d (image unique) et 4d (lot d'images), avec une profondeur arbitraire (nombre de canaux). J'espère que cela devrait fonctionner:

# 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])

L'interpolation bilinéaire est la valeur par défaut, vous n'avez donc pas besoin de la spécifier. Vous pouvez également utiliser resize_bilinear directement.

15
etarion

Je suggère pas d'utiliser l'un des tf.image.resize_* fonctionne comme ils souffrent d'un bug méchant qui ne sera pas corrigé .

Un nouvel ensemble différent de fonctions de rééchantillonnage d'image est apparemment en préparation. En attendant, vous pouvez trouver des exemples sur le Web sur la façon de le faire vous-même en utilisant par exemple convolutions transposées . Il est malheureusement beaucoup moins efficace que le suréchantillonnage par canal, mais il vaut mieux que correct.

[~ # ~] modifier [~ # ~]

Ils ont finalement corrigé ce bug dans TF 2. :

  • image.resize considère maintenant les centres de pixels appropriés (...).

Ce correctif ne passe actuellement pas par le gradient, ce qui est ... un bug qui, espérons-le, sera également corrigé.

6
P-Gn

Keras prend en charge 'nearest' et 'bilinear' interpolation maintenant avec backend tensorflow. Vérifiez le documentation . Mais la valeur de taille par défaut est en effet (2,2) ou int, donc dans ce cas votre suréchantillonnage sera au moins le double.

Ce code a besoin de Keras 2.2.3 ou au-dessus. Si vous utilisez tf.keras, malheureusement, vous ne pouvez pas installer les keras séparément, ils sont fournis dans le cadre de l'installation de tensorflow. Par conséquent, trouvez la version tf ou installez la version nocturne.

pip3 install --upgrade tf-nightly

1
Milind Deore