Pytorch入門-Transforms

cxy8發表於2024-03-13

目錄
  • Compose
  • ToTensor
  • Normalize
  • Resize

在PyTorch中,transforms是一個用於影像預處理和資料增強的模組,通常與torchvision庫一起使用。torchvision提供了大量預先定義的transforms,它們可以方便地應用於影像資料,以進行預處理或增強。這些transforms對於訓練和評估機器學習模型(尤其是深度學習模型)非常有用。

python中的call方法
在Python中,__call__ 是一個特殊方法,也被稱為“魔法方法”或“雙下劃線方法”。當一個物件例項被當作函式一樣呼叫時,Python會自動呼叫該物件的 __call__ 方法。這意味著你可以定義你自己的物件,使其能夠被“呼叫”,就像呼叫一個函式一樣。

class Person:
    def __call__(self,name):
        print("__call__"+"Hello"+name)

    def hello(self,name):
        print("hello"+name)

person = Person()
person("zhangsan")
person.hello("lisi")

image

class CallableClass:  
    def __init__(self, value):  
        self.value = value  
  
    def __call__(self, *args, **kwargs):  
        print(f"Called with {args} and {kwargs}")  
        return self.value  
  
# 建立一個例項  
obj = CallableClass(42)  
  
# 使用該例項,就像呼叫一個函式一樣  
result = obj(1, 2, 3, a=4, b=5)  
  
print(result)  # 輸出: 42

Compose

在PyTorch中,Compose是一個功能強大的工具,它允許你將多個轉換(transforms)組合成一個單一的轉換序列。這樣,你就可以一次性地對資料進行一系列複雜的預處理操作。Compose通常與torchvision.transforms模組一起使用,該模組提供了許多預定義的轉換函式。

from torchvision import transforms  
  
# 定義一系列的轉換  
transform_sequence = transforms.Compose([  
    transform1,  
    transform2,  
    transform3,  
    # ...  
])  
  
# 然後你可以將這個轉換序列應用於影像  
transformed_image = transform_sequence(image)
from torchvision import transforms  
from PIL import Image  
  
# 載入一張影像  
image = Image.open('path_to_image.jpg')  
  
# 定義轉換序列  
transform = transforms.Compose([  
    transforms.Resize((256, 256)),  # 將影像大小調整為256x256  
    transforms.CenterCrop(224),     # 從中心裁剪出224x224的區域  
    transforms.ToTensor(),           # 將PIL影像或NumPy ndarray轉換為torch.Tensor  
    transforms.Normalize(           # 對影像進行標準化  
        mean=[0.485, 0.456, 0.406], # 使用ImageNet資料集上的RGB通道的均值  
        std=[0.229, 0.224, 0.225]   # 使用ImageNet資料集上的RGB通道的標準差  
    )  
])  
  
# 應用轉換序列到影像  
transformed_image = transform(image)

在這個例子中,我們首先使用Resize將影像大小調整為256x256,然後使用CenterCrop從中心裁剪出224x224的區域。接著,使用ToTensor將影像轉換為PyTorch張量,最後使用Normalize對影像進行標準化處理。所有這些轉換都被組合在一起,並透過一次呼叫transform(image)來應用。

ToTensor

image

這是transforms原始碼中的解釋

在PyTorch中是一個常用的轉換函式,用於將PIL Image或NumPy ndarray轉換為torch.Tensor。但是,在轉換過程中,它會自動將影像的畫素值範圍從[0, 255]縮放到[0.0, 1.0]。這通常是因為神經網路的輸入通常期望在[0.0, 1.0]範圍內。

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

writer = SummaryWriter("logs")
imge_path = "images/OIP.jpg"
imge = Image.open(imge_path)
trans_totensor = transforms.ToTensor()
# 這是就是call函式的呼叫
imge_tensor = trans_totensor(imge)

writer.add_image("ToTensor",imge_tensor)
writer.close()

Normalize

image
歸一化公式:

\[output[channel] = \frac{(input[channel] - mean[channel])}{std[channel]} \]

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

writer = SummaryWriter("logs")
imge_path = "images/OIP.jpg"
imge = Image.open(imge_path)

# ToTensor
trans_totensor = transforms.ToTensor()
imge_tensor = trans_totensor(imge)
writer.add_image("ToTensor", imge_tensor)

print(imge_tensor[0][0][0])
# Normalize
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(imge_tensor)
print(img_norm[0][0][0])
writer.add_image("Norm",img_norm)


writer.close()

可以看出來歸一化的結果還是有些不同的
image

Resize

# Resize
print(imge.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(imge)

print(img_resize)
img_resize=trans_totensor(img_resize)
writer.add_image("Resize",img_resize,0)

writer.close()

相關文章