PyTorch - How to use "toPILImage" correctly

You can use PIL image but you're not actually loading the data as you would normally.

Try something like this instead:

import numpy as np
import matplotlib.pyplot as plt

for img,labels in train_data_loader:
    # load a batch from train data
    break

# this converts it from GPU to CPU and selects first image
img = img.cpu().numpy()[0]
#convert image back to Height,Width,Channels
img = np.transpose(img, (1,2,0))
#show the image
plt.imshow(img)
plt.show()  

As an update (02-10-2021):

import torchvision.transforms.functional as F
# load the image (creating a random image as an example)
img_data = torch.ByteTensor(4, 4, 3).random_(0, 255).numpy()
pil_image = F.to_pil_image(img_data)

Alternatively

import torchvision.transforms as transforms
img_data = torch.ByteTensor(4, 4, 3).random_(0, 255).numpy()
pil_image = transforms.ToPILImage()(img_data)

The second form can be integrated with dataset loader in pytorch or called directly as so.

I added a modified to_pil_image here

essentially it does what I suggested back in 2018 but it is integrated into pytorch now.


I would use something like this

# Open Image from dataset:
my_img, _ = train_data[248]
results = transforms.ToPILImage()(my_img)
results.show()

Tags:

Python

Pytorch