web-dev-qa-db-ja.com

PyTorchで単一の画像を表示するにはどうすればよいですか?

1枚の画像を表示したい。 ImageLoaderを使用してロードされ、PyTorch Tensorに保存されます。

plt.imshow(image)で表示しようとすると、次のようになります。

TypeError: Invalid dimensions for image data

.shapeテンソルは:

torch.Size([3, 244, 244])

このPyTorchテンソルに含まれる画像を表示するにはどうすればよいですか?

11
Tom Hale

画像を表すTensorが与えられた場合、 .permute() を使用します:

_plt.imshow(  tensor_image.permute(1, 2, 0)  )
_

注: permuteはメモリのコピーまたは割り当てを行いません 、そして from_numpy()はどちらも行いません。

23
Tom Hale

ご覧のとおり、matplotlibnumpy配列に変換しなくても問題なく機能します。ただし、PyTorch Tensors(「イメージテンソル」)はチャネルファーストであるため、matplotlibで使用するには、これを再形成する必要があります。

コード:

from scipy.misc import face
import matplotlib.pyplot as plt
import torch

np_image = face()
print(type(np_image), np_image.shape)
tensor_image = torch.from_numpy(np_image)
print(type(tensor_image), tensor_image.shape)
# reshape to channel first:
tensor_image = tensor_image.view(tensor_image.shape[2], tensor_image.shape[0], tensor_image.shape[1])
print(type(tensor_image), tensor_image.shape)

# If you try to plot image with shape (C, H, W)
# You will get TypeError:
# plt.imshow(tensor_image)

# So we need to reshape it to (H, W, C):
tensor_image = tensor_image.view(tensor_image.shape[1], tensor_image.shape[2], tensor_image.shape[0])
print(type(tensor_image), tensor_image.shape)

plt.imshow(tensor_image)
plt.show()

出力:

<class 'numpy.ndarray'> (768, 1024, 3)
<class 'torch.Tensor'> torch.Size([768, 1024, 3])
<class 'torch.Tensor'> torch.Size([3, 768, 1024])
<class 'torch.Tensor'> torch.Size([768, 1024, 3])
8
trsvchn

画像のパス名img_pathを指定した完全な例:

from PIL import Image
image = Image.open(img_path)
plt.imshow(transforms.ToPILImage()(transforms.ToTensor()(image)), interpolation="bicubic")

transforms.*は関数を返すことに注意してください。これがファンキーなブラケットの理由です。

1
Tom Hale

画像が説明どおりに読み込まれ、変数imageに格納されているとします。

plt.imshow(transforms.ToPILImage()(image), interpolation="bicubic")

matplotlib画像チュートリアル はこう言います:

バイキュービック補間は、写真を爆破するときによく使用されます。人々は、ピクセルよりもぼやけを好む傾向があります。


または Soumithが推奨

%matplotlib inline
def show(img):
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)), interpolation='nearest')

または、ポップアップウィンドウで画像を開くには:

 transforms.ToPILImage()(image).show()
0
Tom Hale