Transfrom是什麼?
可以看作是一個影像處理的工具箱,透過檢視Transform類可以找到不同的影像處理方法
更準確的說,Transform中有各種類的的定義,我們可以透過繼承或者構造這些類,然後呼叫裡面的方法來實現相應的功能
可以透過結構來便捷的檢視transform中的類和方法,然後實現對應的物件即可。其中__call__函式的作用就是在呼叫這個物件的時候自動呼叫的函式比如這是Totensor類的定義,可以看到就是將其他格式的影像轉化為tensor格式的影像
具體的程式碼如下,輸出的就是tensor型別的影像
from torchvision import transforms
from PIL import Image
image_path="dataset/hymenoptera_data/train/ants_image/7759525_1363d24e88.jpg"
image=Image.open(image_path)
transform_class = transforms.ToTensor() # 構造transform中的ToTensor類
image_tensor =transform_class(image) # 呼叫類將影像轉化為tensor格式(__call__函式)
print(type(image_tensor))
Tensor格式有什麼用
相較於PIL的image格式和numpy的array格式,tensor影像格式的作用在於它包含了用於神經網路的一些屬性,比如反向傳遞、使用的是CPU還是GPU進行訓練等等,所以tensor影像格式更適合用來進行神經網路的訓練
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
image_path="dataset/hymenoptera_data/train/ants_image/7759525_1363d24e88.jpg"
image=Image.open(image_path)
transform_class = transforms.ToTensor() # 構造transform中的ToTensor類
image_tensor =transform_class(image) # 呼叫類將影像轉化為tensor格式(__call__函式)
writer = SummaryWriter("logs")
writer.add_image("tensor_image",image_tensor,1) # 用tensor格式顯示影像
writer.close()
此外,我們可以看到,使用PIL處理的影像格式是Jpeg格式,opencv處理的影像是numpy的array格式,transform處理的影像是tensor格式,三者是不相同的
各種格式以及對應的呼叫方法如下: