pytorch 中transforms的使用詳解

transforms

按住Ctrl查看transforms的源碼可以知道,transforms就是一個python文件,裡面定義瞭很多類,每一個類都是一個工具
在結構那裡,可以看到有很多的類

ToTensor

Convert a PIL Image or numpy.ndarray to tensor. This transform does not support torchscript

通過ToTensor來學習transforms如何使用以及為什麼使用tensor數據類型

transforms使用

transforms裡面每一個類都可以看成是一個模具,我們可以用裡面的模具做出一個具體的工具,如何用這個具體的工具來實現具體的功能

比如ToTensor的使用:

from torchvision import transforms
from PIL import Image

img_path = "data/train/ants_image/0013035.jpg"
img = Image.open(img_path)

tensor_trans = transforms.ToTensor()#模具(也就是這個類的對象)
tensor_img = tensor_trans(img)#實現ToTensor的功能,將一個input(PIL Image)轉化成tensor

print(tensor_img)

為什麼需要tensor數據類型呢?

在使用tensorboard裡面常用的add_image時,裡面的第二個參數是圖片的數據類型,這個數據類型,可以是torch.Tensor, numpy.array, or string/blobname,上一篇博客用的是numpy.array,這裡,其實可以直接得到tensor類型後直接用

from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
from PIL import Image

img_path = "data/train/ants_image/0013035.jpg"
img = Image.open(img_path)

tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)

writer = SummaryWriter("logs")
writer.add_image("Tensor_image", tensor_img)

writer.close()

常見的transforms

內置方法__call__()

可以發現基本上transforms裡面的每一個類都有一個內置方法__call__(),這個方法和普通的方法的區別其實就是,普通方法一般是類的對象通過.的方式調用,但是call函數不需要,可以直接用對象加括號的形式調用

一個Person類,內置方法__call__和hello都有一個參數name,然後兩個方法都輸出name,一個通過person(“”)形式調用,一個通過person.hello(“”)調用

Normalize

Normalize a tensor image with mean and standard deviation.

這個方法進行歸一化的時候,傳入的參數是有兩個列表一個是均值,一個是標準差,每個列表的n表示維度,是根據輸入的channel數量決定的,比如我們的圖片是rgb那n=3,它能將每個信道的輸入進行歸一化

根據公式可以知道計算的結果其實就是

代碼示例:

from PIL import Image
from torchvision import transforms

img_path = "data/train/ants_image/0013035.jpg"
img = Image.open(img_path)

trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)

print(img_tensor[0][0][0])
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])

writer = SummaryWriter("logs")
writer.add_image("Normalize", img_norm)

writer.close()

輸出:

tensor(0.3137)
tensor(-0.3725)

Resize

Resize the input image to the given size

參數:
可以給一個(H,W)這樣的參數,改變圖片的大小,也可以指定一個int,改變長和寬的比例

代碼示例

print(img.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img)# 參數和返回值都是 img PIL
print(img_resize)

輸出結果:

變成瞭正方形

Compose

Composes several transforms together. This transform does not support torchscript.

可以將第一種類型轉化為第二種,參數一的類型做輸入,參數二的類型做輸出,輸入一定要對應,不然就會報錯

代碼示例

trans_totensor = transforms.ToTensor()
trans_resize_2 = transforms.Resize(512)
# PIL -> tensor
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)

到此這篇關於pytroch中transforms的使用詳解的文章就介紹到這瞭,更多相關pytroch transforms的使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: