学习笔记-Part6 Dataset类代码实战

看的课程是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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值