栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

基于Pyrorch深度学习之分类问题二(制作自己的数据集)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于Pyrorch深度学习之分类问题二(制作自己的数据集)

本文基于Pytorch框架,制作自己的Dataset及DataLoader。完成代码,请移步Go-for-i。


 开始步骤:

1.准备自己需要分类的数据。该文以二分类为例,其中,0_image和1_image中分别存放自己的数据集。

2. 生成train.txt文件和test.txt文件。其中,两个.txt文件中存放,图片的路径以及图片所对应的label。具体代码及生成的结果如下:

train_ratio = 0.9
test_ratio = 1-train_ratio
rootdata = r"dataset"
train_list, test_list = [], []
data_list = []
class_flag = -1
for a, b, c in os.walk(rootdata):
    for i in range(0, int(len(c)*train_ratio)):
        train_data = os.path.join(a, c[i])+'t'+str(class_flag)+'n'
        train_list.append(train_data)
    for i in range(int(len(c) * train_ratio), len(c)):
        test_data = os.path.join(a, c[i]) + 't' + str(class_flag)+'n'
        test_list.append(test_data)
    class_flag += 1
print(train_list)
random.shuffle(train_list)
random.shuffle(test_list)
with open('train.txt', 'w', encoding='UTF-8') as f:
    for train_img in train_list:
        f.write(str(train_img))
with open('test.txt', 'w', encoding='UTF-8') as f:
    for test_img in test_list:
        f.write(test_img)

 

 3.对图片进行处理,放入DataLoader中。具体代码如下:

# 图像标准化
transform_BZ = transforms.Normalize(
    mean=[0.5, 0.5, 0.5],  # 取决于数据集
    std=[0.5, 0.5, 0.5]
)

class LoadData(Dataset):
    def __init__(self, txt_path, train_flag=True):
        self.imgs_info = self.get_images(txt_path)
        self.train_flag = train_flag

        self.train_tf = transforms.Compose([
                transforms.Resize(224),
                transforms.RandomHorizontalFlip(),
                transforms.RandomVerticalFlip(),
                transforms.ToTensor(),
                transform_BZ
            ])
        self.val_tf = transforms.Compose([
                transforms.Resize(224),
                transforms.ToTensor(),
                transform_BZ
            ])
    def get_images(self, txt_path):
        with open(txt_path, 'r', encoding='utf-8') as f:
            imgs_info = f.readlines()
            imgs_info = list(map(lambda x: x.strip().split('t'), imgs_info))
        return imgs_info
    def padding_black(self, img):
        w, h = img.size
        scale = 224. / max(w, h)
        img_fg = img.resize([int(x) for x in [w * scale, h * scale]])
        size_fg = img_fg.size
        size_bg = 224
        img_bg = Image.new("RGB", (size_bg, size_bg))
        img_bg.paste(img_fg, ((size_bg - size_fg[0]) // 2,
                              (size_bg - size_fg[1]) // 2))
        img = img_bg
        return img
    def __getitem__(self, index):
        img_path, label = self.imgs_info[index]
        img = Image.open(img_path)
        img = img.convert('RGB')
        img = self.padding_black(img)
        if self.train_flag:
            img = self.train_tf(img)
        else:
            img = self.val_tf(img)
        label = int(label)

        return img, label

    def __len__(self):
        return len(self.imgs_info)

if __name__ == "__main__":
    train_dataset = LoadData("train.txt", True)
    print("训练数据个数:", len(train_dataset))
    train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                               batch_size=10,
                                               shuffle=True)
    for image, label in train_loader:
        print(image.shape)
        print(image)
        # img = transform_BZ(image)
        # print(img)
        print(label)
    test_dataset = LoadData("test.txt", False)
    print("测试数据个数:", len(test_dataset))
    test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
                                               batch_size=10,
                                               shuffle=False)
    for image, label in test_loader:
        print(image.shape)
        print(label)

欢迎交流、沟通、批评、指正。最后,别忘了点赞哦!

 (本文仅为记录自己的学习过程,无其他用途)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955121.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号