学习目标:
入门pytorch
笔记来自 小土堆P7
学习内容:
掌握数据操作基本流程:
1.创建类继承dataset并初始化
class Mydata(Dataset):#创建类继承dataset
def __init__(self,root_dir,label_dir):#初始化:为整个类提供一个全局变量
self.root_dir = root_dir#将传入的 root_dir 参数存储为类的实例变量。
self.label_dir = label_dir#将传入的 label_dir 参数存储为类的实例变量。
self.path = os.path.join(self.root_dir,self.label_dir)#将 root_dir 和 label_dir 连接起来,形成完整的数据集路径,然后存储在 self.path 中。
self.img_path = os.listdir(self.path)#列出 self.path 目录下的所有文件和子目录,将结果存储在 self.img_path 中。 这个列表包含了数据集中所有图像文件的文件名。
注:变量不能相互传递,self相当于指定类中的全局变量
root_dir可以轻松地切换到不同的数据集或文件集合;label_dir用来找标签
2.创建数据列表(先创建列表才能读取数据,注意列表需要获取路径,此处创建了一个包含图像和对应标签的列表)
def __getitem__(self,idx):#用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)#读取数据,将图像加载到 img 变量中
label = self.label_dir#将 label 变量设置为数据集的标签目录(在这个例子中是 ants 或 bees)。
return img,label#返回了图像和标签,允许你通过索引来访问数据集中的图像和标签。
3.创建实例
root_dir = r"D:\data\hymenoptera_data\train"
ants_label_dir = r"ants"
bees_label_dir = r"bees"
ants_dataset = Mydata(root_dir,ants_label_dir)#创建实例
bees_dataset = Mydata(root_dir,bees_label_dir)
4.读取图片
上接3,使用idx读取
img,label = bees_dataset[1]
img.show()
其他方法,添加图片地址读取
from PIL import Image
img_path = r"D:\data\hymenoptera_data\train\ants\0013035.jpg" #"前面加一个r
img = Image.open(img_path)
img.size
img.show()
``
扩展:
1.os库拼接两个属性相同的数据集
import os
dir_path = r"D:\data\hymenoptera_data\train\ants"
img_path_list = os.listdir(dir_path) #将这个文件夹下的东西变成一个列表
root_dir = r"D:\data\hymenoptera_data\train"
label_dir = r"ants"
path = os.path.join(root_dir,label_dir) #将两个路径粘合
2.将数据集分类
import os
root_dir = r"D:\z_pycharm\小土堆\data\hymenoptera_data\train"
target_dir = 'ants_image'
img_path = os.listdir(os.path.join(root_dir, target_dir))
label = target_dir.split('_')[idx]#从 target_dir 变量中提取标签信息。
# 将 target_dir 字符串按照下划线 _ 分割成多个部分,并根据索引 idx 选择其中一个部分作为标签。请注意,代码中没有明确定义 idx 的值,
# 所以它必须在之前的代码中被定义。
out_dir = 'ants_label'#定义了一个名为 out_dir 的字符串变量,表示存储标签文件的目标目录。
for i in img_path:#开始一个循环,遍历 img_path 列表中的每个图像文件名。
file_name = i.split('.jpg')[idx]#对每个图像文件名进行处理,使用 split('.jpg') 方法按照字符串 ".jpg" 进行分割,
# 并根据索引 idx 选择其中一个部分作为文件名。这可能是为了去掉文件扩展名,以便用文件名作为标签文件的名称。
with open(os.path.join(root_dir, out_dir,"{}.txt".format(file_name)),'w') as f:#使用 open 函数创建一个文件对象,
# 将文件路径构建为 root_dir、out_dir 和文件名的组合,文件名以 ".txt" 结尾。以写入模式 'w' 打开文件,并将文件对象赋给名为 f 的变量
# 这行代码准备创建一个标签文件。
f.write(label)