下列代码对原始数据集进行了处理,方便了对数据集的访问
import torch
from torch.utils.data import Dataset
from PIL import Image
import os
class MyData(Dataset):
def __init__(self, root_dir, label_dir): # self 的作用是指定一个类里的全局变量
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir, self.label_dir) # join函数,连接路径
self.img_path = os.listdir(self.path)
def __getitem__(self, idex):
img_name = self.img_path[idex]
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 = "dataset/train"
positive_label_dir = "positive"
negative_label_dir = "negative"
positive_dataset = MyData(root_dir, positive_label_dir)
negative_dataset = MyData(root_dir, negative_label_dir)
train_dataset = positive_dataset + negative_dataset ##数据集的拼接操作
上述情况,label是体现在文件夹的名称内,而使用最多的情况通常是这样的
positive_label文件夹内包含了与图片同名的txt文件,打开txt文件就是该图片的label,实现给图片创建对应txt的代码如下:
import os
root_dir = "dataset/train"
target_dir = "positive"
img_path = os.listdir(os.path.join(root_dir,target_dir))
label = target_dir
out_dir = "positive_label"
for i in img_path:
file_name = i.split(".png")[0]
with open(os.path.join(root_dir,out_dir,"{}.txt".format(file_name)),"w") as f:
f.write(label)
tensorboard我理解为一个看板,对结果进行可视化展示
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs") #创建类的一个实例 将事件文件(图像等)存到logs文件夹下
# writer.add_image()
for i in range(100):
writer.add_scalar("y=0.5x",i,2*i) #第一个i是y轴,第二个i是x轴,改变第一个参数可以避免几个图杂揉在一起的情况
writer.close()
#打开事件文件
#在Terminal窗口,输入命令:tensorboard --logdir=logs
#修改主机接口:tensorboard --logdir=logs --port=6007
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
writer = SummaryWriter("logs") #创建类的一个实例 将事件文件(图像等)存到logs文件夹下
image_path = "dataset/train/positive/1 (6).png"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL) #将PIL的文件格式转换为array格式,这样才能被add_image读取
#print(img_array.shape) array转化的图像通常是(H,W,C)格式的,因此要在add_image函数中说明
writer.add_image("test", img_array, 2, dataformats='HWC') #1是指global_step,这里是指第一步
#step可以展现出每一步的变化,非常炫酷
#for i in range(100):
#writer.add_scalar("y=0.5x",i,2*i) #第一个i是y轴,第二个i是x轴,改变第一个参数可以避免几个图杂揉在一起的情况
writer.close()
#打开事件文件
#在Terminal窗口,输入命令:tensorboard --logdir=logs
#修改主机接口:tensorboard --logdir=logs --port=6007
transform可以理解为一个工具箱,里面有很多工具(class类)
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
import cv2
#transforms相当于一个工具箱,里面有很多工具
#pycharm的左侧有个”structure“,可以方便的看到源代码的结构,相当于工具箱的说明书,前面几个类是最常用的
####python中的用法
###通过transform.ToTensor 去解决两个问题
###1.transform如何使用
###2.tensor的数据类型相较于其他数据类型有啥区别
img_path = "dataset/train/positive/1 (1).png"
img = Image.open(img_path) #这是PIL格式转化为tensor格式的方法
# print(img)
tensor_trans = transforms.ToTensor() #创建实例:tensor_trans
tensor_img = tensor_trans(img) #将PIL格式的图片转化为tensor数据类型的图片
###2.tensor数据类型内多了很多卷积神经网络需要的参数,这是其他数据类型不具备的特点
cv_img = cv2.imread(img_path) #数据类型是numpy array
writer = SummaryWriter("logs")
writer.add_image("Tensor_img", tensor_img, 1)
writer.close()
下面介绍python中类的概念,关于__call__函数的用法
class Person:
def __call__(self, name):
print("__call__"+"hello"+" "+name)
def hello(self, name):
print("hello"+" "+name)
person = Person()
person("zyj") #这种调用方法是直接传入一个参数,默认就会传递给__call__函数
person.hello("zy") #这种调用方法需要用点后接需指定的函数
下面介绍了transforms中常见的类的用法
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
writer = SummaryWriter("logs")
img = Image.open("dataset/train/positive/1 (14).jpg")
#ToTensor的使用
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("To_Tensor", img_tensor)
#Normalize的使用(归一化)
trans_norm = transforms.Normalize([6,5,0.5],[5,0.5,5]) ###第一个列表表示平均值
#,第二个列表表示标准差
##归一化的过程:
#计算公式:input(channel) = (input[channel] - mean[channel])/std[channel]
#其中,mean和std是transforms.Normalize中需要传入的参数(用户自定义)
#此处img_tensor的范围在[0,1],经过上述归一化后,范围变为了[-1,1]
img_norm = trans_norm(img_tensor)
writer.add_image("Normalize", img_norm, 1)
##Resize的使用 给定图片的尺寸。如果给两个数字,就会用长宽去匹配
#但是如果只给一个数字,就会用图片最小的边去匹配这个数字
print(img.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img_tensor)
#print(img_resize)
writer.add_image("Resize", img_resize)
##Randomcrop的用法 随机裁剪
trans_random = transforms.RandomCrop(512)
trans_compose2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
img_crop = trans_compose2(img)
writer.add_image("Randcrop", img_crop, i)
writer.close()
未完待续…