首頁 > 軟體

pytorch 中transforms的使用詳解

2022-06-06 14:02:29

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的使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com