一、Python两大法宝
Python语法有两大法宝:dir()、help() 函数。
dir():打开,看见里面有多少分区、多少工具。
help():说明书,查看使用方法。
import torch
print(torch.cuda.is_available())
help(torch.cuda.is_available) # 查看 torch.cuda.is_available 的用法
dir(torch) # 查看torch包中有哪些区、有哪些工具
二、Pytorch加载数据
1.Pytorch中加载数据需要Dataset、Dataloader。
Dataset提供一种方式去获取每个数据及其对应的label,告诉我们总共有多少个数据。
Dataloader为后面的网络提供不同的数据形式,它将一批一批数据进行一个打包。
2.常用数据集两种形式
常用的第一种数据形式,文件夹的名称是它的label。
常用的第二种形式,lebel为文本格式,文本名称为图片名称,文本中的内容为对应的label。
from torch.utils.data import Dataset
help(Dataset)
使用help函数,显示该如何运用
3.路径直接加载数据
from PIL import Image
img_path = "Data/FirstTypeData/train/ants/0013035.jpg"
img = Image.open(img_path)
img.show()
4. Dataset加载数据
from torch.utils.data import Dataset
from PIL import Image
import os
class MyData(Dataset):
def __init__(self,root_dir,label_dir): # 该魔术方法当创建一个事例对象时,会自动调用该函数
self.root_dir = root_dir # self.root_dir 相当于类中的全局变量
self.label_dir = label_dir
self.path = os.path.join(self.root_dir,self.label_dir) # 字符串拼接,根据是Windows或Lixus系统情况进行拼接
self.img_path = os.listdir(self.path) # 获得路径下所有图片的地址
def __getitem__(self,idx):
img_name = self.img_path[idx]
img_item_path = os.path.join(self.root_dir,self.label_dir,img_name)
img = Image.open(img_item_path)
label = self.label_dir
return img, label
def __len__(self):
return len(self.img_path)
root_dir = "Data/FirstTypeData/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)
print(len(ants_dataset))
print(len(bees_dataset))
train_dataset = ants_dataset + bees_dataset # train_dataset 就是两个数据集的集合了
print(len(train_dataset))
img,label = train_dataset[200]
print("label:",label)
img.show()
三、Tensorboard用途
Tensorboad 可以用来查看loss是否按照我们预想的变化,或者查看训练到某一步输出的图像是什么样。
1.tensorboard写日志
如果正确安装tensorboard之后,重新运行代码,还是报错在torch.utils.tensorboard中找不到SummaryWriter,请通过pip进行安装: pip install -i https://mirrors.aliyun.com/pypi/simple/ tensorboardX,因为SummaryWriter是存在于tensorboardX(其作为tensorboard的子模块)同时请将报错的: from torch.utils.tensorboard import SummaryWriter 改为: from tensorboardX import SummaryWriter
from tensorboardX import SummaryWriter
writer = SummaryWriter("logs2") # 创建一个logs文件夹,writer写的文件都在该文件夹下
#writer.add_image()
for i in range(100):
writer.add_scalar("y+2x", 2*i, i)
writer.close()
2. Tensorboard 读日志
在 Anaconda 终端里面,激活环境,再输入 tensorboard --logdir=C:\Users\wangy\Desktop\03CV\logs 命令,将网址赋值浏览器的网址栏,回车,即可查看tensorboard显示日志情况。
为避免多人使用端口导致冲突,也可以在后面加上后缀,使得端口独立,tensorboard --logdir=C:\Users\wangy\Desktop\03CV\logs --port=6008
输入网址可得Tensorboard界面。
3. Tensorboard 读图片
from tensorboardX import SummaryWriter
from PIL import Image
import numpy as np
img_path1 = "dataset/train/ants/45472593_bfd624f8dc.jpg"
img_PIL1 = Image.open(img_path1)
img_array1 = np.array(img_PIL1)
img_path2 = "dataset/train/bees/95238259_98470c5b10.jpg"
img_PIL2 = Image.open(img_path2)
img_array2 = np.array(img_PIL2)
writer = SummaryWriter("logs")
writer.add_image("test",img_array1,1,dataformats="HWC") # 1 表示该图片在第1步
writer.add_image("test",img_array2,2,dataformats="HWC") # 2 表示该图片在第2步
writer.close()
四、transforms的使用
1.transforms的用途
Transforms当成工具箱的话,里面的class就是不同的工具。例如像totensor、resize这些工具。
Transforms拿一些特定格式的图片,经过Transforms里面的工具,获得我们想要的结果。
2.Transforms该如何使用
2.1 transforms.Totensor使用
from torchvision import transforms
from PIL import Image
# 图像文件路径
img_path = "dataset/train/bees/90179376_abc234e5f4.jpg"
# 使用PIL库打开图像文件
img = Image.open(img_path)
# 创建transforms.ToTensor类的实例化对象
tensor_trans = transforms.ToTensor()
# 调用transforms.ToTensor类的__call__的魔术方法,将图像转换为张量
tensor_img = tensor_trans(img)
# 打印转换后的张量
print(tensor_img)
2.2 需要Tensor数据类型原因
Tensor有一些属性,比如反向传播、梯度等属性,它包装了神经网络需要的一些属性。
# 导入必要的库
from tensorboardX import SummaryWriter # 导入用于TensorBoard可视化的库
from torchvision import transforms # 导入用于图像转换的库
from PIL import Image # 导入用于图像处理的库
import cv2 # 导入OpenCV库
# 图像文件路径
img_path = "dataset/train/bees/85112639_6e860b0469.jpg"
# 使用PIL库打开图像文件
img = Image.open(img_path)
# 创建TensorBoard的SummaryWriter对象,用于记录日志和可视化
writer = SummaryWriter("logs")
# 创建图像转换操作,将PIL图像转换为PyTorch张量
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)
# 将图像张量添加到TensorBoard日志中,"Temsor_img"是可视化时显示的图像名称
writer.add_image("Tensor_img", tensor_img)
# 关闭SummaryWriter,确保将日志写入到TensorBoard文件
writer.close()
下面操作与上一步相同,就不在说明了
3. 常见的Transforms工具
3.1 __call__魔术方法使用
class Person:
def __call__(self, name):
print("__call__ " + "Hello " + name)
def hello(self, name):
print("hello " + name)
person = Person() # 实例化对象
person("zhangsan") # 调用__call__魔术方法
person.hello("list") # 调用hello方法
3.2 Normanize归一化
# 导入必要的库
from tensorboardX import SummaryWriter # 用于 TensorBoard 可视化的库
from torchvision import transforms # 用于图像转换的库
from PIL import Image # Python Imaging Library,用于图像处理
import cv2 # OpenCV 库,用于计算机视觉任务
# 图像文件路径
img_path = "dataset/train/bees/154600396_53e1252e52.jpg"
# 使用 PIL 库打开图像文件
img = Image.open(img_path)
# 创建 TensorBoard 的 SummaryWriter 对象,用于记录日志和可视化
writer = SummaryWriter("logs")
# 创建图像转换操作,将 PIL 图像转换为 PyTorch 张量
tensor_trans = transforms.ToTensor()
img_tensor = tensor_trans(img)
# 打印原始图像张量中第一个像素的值
print("原始图像张量中第一个像素的值:", img_tensor[0][0][0])
# 创建图像标准化转换操作,将原始图像张量标准化
tensor_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = tensor_norm(img_tensor)
# 打印标准化后图像张量中第一个像素的值
print("标准化后图像张量中第一个像素的值:", img_norm[0][0][0])
# 将原始图像张量和标准化后的图像张量添加到 TensorBoard 日志中
writer.add_image("img_tensor", img_tensor)
writer.add_image("img_norm", img_norm)
# 关闭 SummaryWriter,确保将日志写入到 TensorBoard 文件
writer.close()
tensor(0.2627)
tensor(-0.4745)
3.3 Resize裁剪
3.3.1 Resize裁剪方法一
# 导入必要的库
from tensorboardX import SummaryWriter # 用于 TensorBoard 可视化的库
from torchvision import transforms # 用于图像转换的库
from PIL import Image # Python Imaging Library,用于图像处理
import cv2 # OpenCV 库,用于计算机视觉任务
# 图像文件路径
img_path = "dataset/train/bees/174142798_e5ad6d76e0.jpg"
# 使用 PIL 库打开图像文件
img = Image.open(img_path)
print("原始图像信息:", img) # PIL 类型的图片原始比例为 500×464
# 创建 TensorBoard 的 SummaryWriter 对象,用于记录日志和可视化
writer = SummaryWriter("logs")
# 创建图像转换操作,将 PIL 图像转换为 PyTorch 张量
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
# 创建图像 resize 操作,将图像大小调整为 (512, 512)
trans_resize = transforms.Resize((512, 512))
# 图像 resize 操作:PIL 数据类型的 img -> resize -> PIL 数据类型的 img_resize
img_resize = trans_resize(img)
# 图像 resize 后再进行 totensor 操作:PIL 数据类型的 PIL -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)
# 打印 resize 后的图像张量大小
print("resize 后图像张量的大小:", img_resize.size()) # PIL 数据类型的图片原始比例为 3×512×512,3 通道
# 将原始图像张量和 resize 后的图像张量添加到 TensorBoard 日志中
writer.add_image("img_tensor", img_tensor)
writer.add_image("img_resize", img_resize)
# 关闭 SummaryWriter,确保将日志写入到 TensorBoard 文件
writer.close()
3.3.2 Resize裁剪方法二
# 导入必要的库
from tensorboardX import SummaryWriter # 用于 TensorBoard 可视化的库
from torchvision import transforms # 用于图像转换的库
from PIL import Image # Python Imaging Library,用于图像处理
import cv2 # OpenCV 库,用于计算机视觉任务
# 图像文件路径
img_path = "dataset/train/bees/174142798_e5ad6d76e0.jpg"
# 使用 PIL 库打开图像文件
img = Image.open(img_path)
print("原始图像信息:", img) # PIL 类型的图片原始比例为 500×464
# 创建 TensorBoard 的 SummaryWriter 对象,用于记录日志和可视化
writer = SummaryWriter("logs")
# 创建图像转换操作,将 PIL 图像转换为 PyTorch 张量
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
# 创建第二个图像 resize 操作,将图像大小调整为 (512, 512)
trans_resize_2 = transforms.Resize((512, 512))
# 使用 transforms.Compose 创建一个复合转换
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
# 应用复合转换到原始图像
img_composed = trans_compose(img)
# 打印复合转换后的图像张量大小
print("复合转换后图像张量的大小:", img_composed.size()) # PIL 数据类型的图片原始比例为 3×512×512,3 通道
# 将原始图像张量和复合转换后的图像张量添加到 TensorBoard 日志中
writer.add_image("img_tensor", img_tensor)
writer.add_image("img_composed", img_composed)
# 关闭 SummaryWriter,确保将日志写入到 TensorBoard 文件
writer.close()
原始图像信息: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x289 at 0x29C5ABEFA48>
复合转换后图像张量的大小: torch.Size([3, 512, 512])
3.4 RandomCrop随即裁剪
3.4.1 Resize裁剪方法一
# 导入必要的库
from tensorboardX import SummaryWriter # 用于 TensorBoard 可视化的库
from torchvision import transforms # 用于图像转换的库
from PIL import Image # Python Imaging Library,用于图像处理
import cv2 # OpenCV 库,用于计算机视觉任务
# 图像文件路径
img_path = "dataset/train/bees/174142798_e5ad6d76e0.jpg"
# 使用 PIL 库打开图像文件
img = Image.open(img_path)
print("原始图像信息:", img)
# 创建 TensorBoard 的 SummaryWriter 对象,用于记录日志和可视化
writer = SummaryWriter("logs")
# 创建图像转换操作,将 PIL 图像转换为 PyTorch 张量
tensor_trans = transforms.ToTensor()
img_tensor = tensor_trans(img)
# 将原始图像张量添加到 TensorBoard 日志中
writer.add_image("img_tensor", img_tensor)
# 创建随机裁剪转换操作,将图像大小裁剪为 (256, 256)
trans_random = transforms.RandomCrop(256)
# 使用 transforms.Compose 创建一个复合转换
trans_compose_2 = transforms.Compose([trans_random, tensor_trans])
# 多次应用复合转换,添加裁剪后的图像到 TensorBoard 日志中
for i in range(10):
img_crop = trans_compose_2(img)
writer.add_image("RandomCrop", img_crop, i)
print("裁剪后图像大小:", img_crop.size())
# 关闭 SummaryWriter,确保将日志写入到 TensorBoard 文件
writer.close()
原始图像信息: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x289 at 0x181EC32FCC8>
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
注意:裁剪后的尺寸大小不能超过本身的长和宽
3.4.2 RandomCrop随即裁剪方式二
# 导入必要的库
from tensorboardX import SummaryWriter # 用于 TensorBoard 可视化的库
from torchvision import transforms # 用于图像转换的库
from PIL import Image # Python Imaging Library,用于图像处理
import cv2 # OpenCV 库,用于计算机视觉任务
# 图像文件路径
img_path = "dataset/train/bees/132826773_dbbcb117b9.jpg"
# 使用 PIL 库打开图像文件
img = Image.open(img_path)
print("原始图像信息:", img)
# 创建 TensorBoard 的 SummaryWriter 对象,用于记录日志和可视化
writer = SummaryWriter("logs")
# 创建图像转换操作,将 PIL 图像转换为 PyTorch 张量
tensor_trans = transforms.ToTensor()
img_tensor = tensor_trans(img)
# 将原始图像张量添加到 TensorBoard 日志中
writer.add_image("img_tensor", img_tensor)
# 创建随机裁剪转换操作,将图像大小裁剪为 (312, 100)
trans_random = transforms.RandomCrop((100, 100)) # 指定随机裁剪的宽和高
trans_compose_2 = transforms.Compose([trans_random, tensor_trans])
# 多次应用复合转换,添加裁剪后的图像到 TensorBoard 日志中
for i in range(10):
img_crop = trans_compose_2(img)
writer.add_image("RandomCrop", img_crop, i)
print("裁剪后图像大小:", img_crop.size())
# 关闭 SummaryWriter,确保将日志写入到 TensorBoard 文件
writer.close()
原始图像信息: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x334 at 0x17071CDFF88>
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])