看的课程是B站up主小土堆的PyTorch深度学习快速入门教程
下面是在python console中输入以及返回的内容,在python控制台中不需要添加self,添加了会报错说没有self模块。
from PIL import Image
import os
root_dir = "hymenoptera_data/train"
label_dir = "ants"
path = os.path.join(root_dir,label_dir)
self.img_path = os.listdir(self.path)
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'self' is not defined
img_path = os.listdir(path)
idx = 0
img_name = img_path[idx]
img_item_path = os.path.join(root_dir,label_dir,img_name)
img = Image.open(img_item_path)
执行完在Special Variables(特殊变量)看到如下图。
.py文件如下。
from torch.utils.data import Dataset
#improt cv2
from PIL import Image
import os
class MyData(Dataset):
def __init__(self,root_dir,label_dir):
#初始化函数__init__,其中的双下划线是种规范
#self是全局变量的意思,添加self后的变量在之后的函数中也可以使用
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir,self.label_dir)
#os.path.joint是将两个路径连接起来,因为在Windows和Linux系统下使用的方式不同,在Windows下使用双斜杠(你使用也可以是反斜杠)
self.img_path = os.listdir(self.path)
#获得图片中所有的地址,list列表的意思
def __getitem__(self, idx):
#获取每一个图片
img_name = self.img_path[idx]
img_item_path = os.path.join(self.root_dir,self.label_dir,img_name)
#注意这里的self,root_dir和label_dir有self,但img_name自身就有self,这里就不用加了
#img相对于这个程序的相对路径,例如当idx=0时,有img_item_path = {str}'hymenoptera_data/train\\ants\\0013035.jpg'
img = Image.open(img_item_path)
#Image.open是一个函数,I要大写
label = self.label_dir
return img,label
#返回两个参数img和label
def __len__(self):
#获取列表的长度,也就是有多少张图片
return len(self.img_path)
#上面def只是定义,上面是类。这里创建两个变量,用上面的类创建一个实例才有输出
root_dir = "hymenoptera_data/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和bees的集合
train_dataset = ants_dataset + bees_dataset
在python控制台输入,因为def __getitem__(self, idx)的返回是img,label,所以这行是img,label = ants_dataset[0],于是img.show()执行后会显示ants文件夹中的第一张图片。同理可以显示bees文件夹中的图片。
ants_dataset[0]
(<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=768x512 at 0x2A8827D8DD8>, 'ants')
img,label = ants_dataset[0]
img.show()
训练集是ants和bees的集合,使用len(train_dataset)可以查看训练集的列表长度,这里蚂蚁是124张图片,蜜蜂是121张图片,相加是245张图片,所以123显示图片是蚂蚁,124显示图片是蜜蜂。这样可以添加一些仿造的数据集,还可以创建子数据集。
train_dataset = ants_dataset + bees_dataset
len(train_dataset)
245
len(ants_dataset)
124
len(bees_dataset)
121
img,label = train_dataset[123]
img.show()
img,label = train_dataset[124]
img.show()
最后,这个训练集的标签是ant或bee,比较简单,当标签比较复杂时,常用的训练集形式如下图,image存放图片,label存放标签,label里面是许多.txt文档,标签和图片的名称对应。例如,ants_image内的第一张图片名称是0013035.jpg,那么ants_label内的第一个标签名称是0013035.jpg.txt,这个.txt文档的内容是ant。