1. Dataset类代码实践
加载数据集的类代码Dataset,获取所有根路径、标签路径,获取所有数据集图片,两个数据集连接
os.path.join()路径拼接
Image.open()打开图片PIL格式
from torch.utils.data import Dataset
from PIL import Image
import os
'''
获取数据集所有路径
import os
dir_path = "dataset/train/ants"
dir_path = "demo01/dataset/train/ants"
img_path_lists = os.listdir(dir_path) 通过os获取所有列表
img_path_list[1] 打印第1个图片
根目录和标签目录拼接起来
root_dir = "demo01/dataset/train"
label_dir = "ants"
path = os.path.join(root_dir, label_dir)
'''
class MyData(Dataset):
def __init__(self, root_dir, label_dir):# 获取所有标签目录 根目录和标签目录拼接起来
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir, self.label_dir)
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 = "demo01/dataset/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)
'''
展示其中一个数据集
ants_dataset[0]
Out[4]:
(,
'ants')
img,label = ants_dataset[0]
img.show()
'''
# 两个数据集相加
# 将两个数据集进行拼接,可以解决数据集不足
train_dataset = ants_dataset + bees_dataset
'''
train_dataset = ants_dataset + bees_dataset
len(ants_dataset)
Out[23]: 124
len(bees_dataset)
Out[24]: 121
len(train_dataset)
Out[25]: 245
'''
2. Tensorboard的使用
Tensorboard的工作流程简单来说是
1.将代码运行过程中的,某些你关心的数据保存在一个文件夹中:这一步由代码中的writer完成
2.再读取这个文件夹中的数据,用浏览器显示出来:这一步通过在命令行运行tensorboard完成。
SummaryWriter的作用就是,将数据以特定的格式存储到刚刚提到的那个文件夹中
这里传入的参数就是指向文件夹的路径,之后我们使用这个writer对象“拿出来”的任何数据都保存在这个路径之下的"log"文件中。
====================================
因为add_image只能接收tensor和numpy.array类型的数据所以,要将PIL类型的数据转换为这tensor和numpy.array类型的
用PIL Image开打图片的类型是JpegImageFile 不能用于add_image中
img =Image.open(img_path)
print(type(img))
print(img)
2.1 PILImage转 array
用numpy转为数组类型
img_array = np.array(img)
print(type(img_array))
numpy.array 转换之后是(C,H, W)类型,但是add_image默认的输入的是(C, H, W),如果是(H, W, C)这样的需要指定dataformats='HWC'
2.2 PILImage转tensor
转为tensor就是(C,H,W)不用添加dataformats
from torchvision import transforms img_ToTensor = transforms.ToTensor() img_tensor = img_ToTensor(img) print(img_tensor) print(img_tensor.shape) #torch.Size([3, 369, 500])
运行此文件后生成logs文件 打开此文件得时候由于没有安装markdown,导致运行tensorboard --logdir=事件文件所在得文件夹名,运行出错,安装markdown就可以了 tensorboard --logdir=demo01/logs
还可以设置端口号 tensorboard --logdir=demo01/logs --port 8787
打开地址就可以
====================================
from torch.utils.tensorboard import SummaryWriter from PIL import Image import numpy as np ''' Tensorboard的工作流程简单来说是 1.将代码运行过程中的,某些你关心的数据保存在一个文件夹中:这一步由代码中的writer完成 2.再读取这个文件夹中的数据,用浏览器显示出来:这一步通过在命令行运行tensorboard完成。 SummaryWriter的作用就是,将数据以特定的格式存储到刚刚提到的那个文件夹中 这里传入的参数就是指向文件夹的路径,之后我们使用这个writer对象“拿出来”的任何数据都保存在这个路径之下。"log" ==================================== 用PIL Image开打图片的类型是JpegImageFile img =Image.open(img_path) print(type(img))用numpy转为数组类型 img_array = np.array(img) print(type(img_array)) ==================================== ''' writer = SummaryWriter("logs") #获取图片 img_path = "dataset/train/ants_image/6240329_72c01e663e.jpg" img = Image.open(img_path) #将图片转为ndarray img_array = np.array(img) print(img_array.shape) #(512, 768, 3) # 这样通道数排列会出错,需要加上一个dataformats='HWC' #add_image这个函数需要一个tensor或者numpy类型数据 # 不同的图片设置不同的step就可以,如果不同图片分开显示,则给每张图片上设置不同的tag。 writer.add_image("test01",img_array, 2, dataformats='HWC') for i in range(100): #writer.add_scalar(tag, scalar_value, global_step=None, walltime=None) writer.add_scalar("y = 3*x" , 3, i) writer.close() ''' 运行此文件后生成logs文件 打开此文件得时候由于没有安装markdown,导致tensorboard --logdir=事件文件所在得文件夹名,运行出错,安装markdown就可以了 tensorboard --logdir=demo01/logs 还可以设置端口号 tensorboard --logdir=demo01/logs --port 8787 '''
3. Transforms的使用(一)
tranforms就是在一种设置图片的工具,将图片输入后通过tranforms工具进行设置,输出改变后的结果
========================================
PIL Image.open()
tensor ToTensor()
narrays cv.imread()
from torchvision import transforms from PIL import Image from torch.utils.tensorboard import SummaryWriter # python ---》tensor数据类型 # 通过totensor去看两个问题 # 1.tranforms该如何使用 # 2.为什么需要tensor的数据类型 img_path = "dataset/train/ants_image/0013035.jpg" img = Image.open(img_path) print(type(img))#writer = SummaryWriter("logs") # 1.如何使用transforms tensor_trans = transforms.ToTensor() img_tensor = tensor_trans(img) print(type(img_tensor))# writer.add_image("Tensor_Img" ,img_tensor) writer.close()
几种常见的transforms
ToTensor、Normalize、Resize、compose、RandomCrop
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
'''
关注输入和输出类型
多看官方文档
关注方法需要什么参数
不知道返回值的时候打印即可
'''
img_path = "../images/xw.jpg"
img = Image.open(img_path)
writer = SummaryWriter("../logs")
# 1. ToTensor
ToTensor_trans = transforms.ToTensor()
tensor_img = ToTensor_trans(img)
writer.add_image("image",tensor_img)
#2. Normalize
# input[channel] = (input[channel] - mean[channel]) / std[channel]
print(tensor_img[0][0][0])
trans_norm = transforms.Normalize([2, 3, 1], [0.1, 0.6, 0.8])#因为是RGB三通道所以有了三个值,三个均值和三个标准差
img_norm = trans_norm(tensor_img)
writer.add_image("Normlize", img_norm, 2)
print(img_norm[0][0][0])
# 3. Resize
'''
Resize 只能传入PIL格式,返回的也是PIL格式的
Args:
img (PIL Image): Image to be scaled.
Returns:
PIL Image: Rescaled image.
'''
print(img.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img) # 图片转变大小
img_resize_tensor = ToTensor_trans(img_resize)
writer.add_image("Resize",img_resize_tensor)
print(img_resize_tensor)
#4. compose
trans_resize_2 = transforms.Resize(512)
#compose 串联了多个图片的变换的操作
trans_compose = transforms.Compose([trans_resize, ToTensor_trans])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)
# 5. RandomCrop
trans_random = transforms.RandomCrop(52)#这里是要随机切割的图片的尺寸,也可以指定切割的高宽(52,52),按着指定的高宽进行裁剪
trans_compose_2 = transforms.Compose([trans_random, ToTensor_trans])
for i in range(10):
img_crop = trans_compose_2(img)
writer.add_image("RandomCrop", img_crop, i)
writer.close()



