pytorch 中transforms的使用詳解
transforms
按住Ctrl查看transforms的源碼可以知道,transforms就是一個python文件,裡面定義瞭很多類,每一個類都是一個工具
在結構那裡,可以看到有很多的類
ToTensor
Convert a
PIL Image
ornumpy.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!
推薦閱讀:
- pytorch 把圖片數據轉化成tensor的操作
- Pytorch中的圖像增廣transforms類和預處理方法
- Pytorch使用transforms
- 初識Pytorch使用transforms的代碼
- pytorch 帶batch的tensor類型圖像顯示操作