1枚の画像を表示したい。 ImageLoader
を使用してロードされ、PyTorch Tensor
に保存されます。
plt.imshow(image)
で表示しようとすると、次のようになります。
TypeError: Invalid dimensions for image data
.shape
テンソルは:
torch.Size([3, 244, 244])
このPyTorchテンソルに含まれる画像を表示するにはどうすればよいですか?
画像を表すTensor
が与えられた場合、 .permute()
を使用します:
_plt.imshow( tensor_image.permute(1, 2, 0) )
_
注: permute
はメモリのコピーまたは割り当てを行いません 、そして from_numpy()
はどちらも行いません。
ご覧のとおり、matplotlib
はnumpy
配列に変換しなくても問題なく機能します。ただし、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])
画像のパス名img_path
を指定した完全な例:
from PIL import Image
image = Image.open(img_path)
plt.imshow(transforms.ToPILImage()(transforms.ToTensor()(image)), interpolation="bicubic")
transforms.*
は関数を返すことに注意してください。これがファンキーなブラケットの理由です。
画像が説明どおりに読み込まれ、変数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()