transforms
的ToTensor
模块可以将PIL或Opencv格式的图片转化为tensor格式的张量,利于在后续的神经网络中对图像的数据进行处理。
下面是代码的小例子
from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
img_path="hymenoptera_data/train/bees/17209602_fe5a5a746f.jpg"
img=Image.open(img_path)#先创造一个PIL格式的量
tensor_tran=transforms.ToTensor()#引用transforms.ToTensor的类
tensor_img=tensor_tran(img)#将经过处理的tensor进行存储
可以看到tensor_img的数据已经是tensor格式,且拥有grad、grad_fn等深度学习进行优化时需要的属性。
下面看下通过opencv处理图片
from torchvision import transforms
from PIL import Image
import cv2
img_path="hymenoptera_data/train/bees/17209602_fe5a5a746f.jpg"
tensor_tran=transforms.ToTensor()
img2=cv2.imread(img_path)
tensor_img2=tensor_tran(img2)
我们再来关注下img、img2的图像存储格式吧!
img为PIL格式存储,图像通道存储顺序为RGB
tensor_img的像素如下所示
img2为numpy(通过Opencv打开)格式存储,图像通道存储顺序为GBR,但是经过ToTensor后,存储顺序为RGB,且Size为CHW顺序
参考下方文章 pytorch个人学习笔记(2)—Normalize()参数详解及用法_吃米的鹰的博客-CSDN博客_normalize参数
T.Normalize(mean, std)
输入CHW形式的tensor
变量,并输入每个通道对应的均值和标准差对每个通道的数据进行标准化处理,使每层数据的均值为0,方差为1,公式如下图所示(注意,每个通道都要有相应的均值和方差:3个通道:T.Normalize([1,1,1],[1,1,1])
所输入的均值和标准差可由随机抽样得到。原本每个通道有各自的标准差和均值,但是若数据量较大,则会耗费很长的计算时间,所以需要人为取样。
将两个参数都设置为0.5并与transforms.ToTensor()
一起使用可以使将数据**强制缩放到[-1,1]**区间上,计算原理如下图所示
from torchvision import transforms
from PIL import Image
import cv2
from torch.utils.tensorboard import SummaryWriter
pytorchpicture_path="pytorchpicture.jpg"
pytorchpicture=Image.open(pytorchpicture_path)
writer=SummaryWriter("pytorchpicture")
totensor=transforms.ToTensor()
pytorchpicture_tensor=totensor(pytorchpicture)
writer.add_image("ToTensor",pytorchpicture_tensor)
trans_norm=transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
pytorchpicture_norm=trans_norm(pytorchpicture_tensor)
writer.add_image("Normalize",pytorchpicture_norm)
writer.close()
输入tensorboard --logdir=pytorchpicture --port=6009
即可打开图片
只可以输入tensor或PIL格式的数据
因为训练时所采用的数据集尺寸都是相当的,所以需要规范其长与宽transforms.Resize([h, w])
将图片短边缩放至x,长宽比保持不变:transforms.Resize(x)
Compose为封装函数,可以将Resize、ToTensor()、Normalize集合成一起使用
a=transforms.Compose([
transforms.Resize(512),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
img_tensor=a(img)