- 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")
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
這是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
歸一化公式:
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()
可以看出來歸一化的結果還是有些不同的
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()