热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(一)Pytorch处理VOC数据集以及dataset代码的编写

1、Dataset+DataLoader实现自定义数据集读取方法创建自己的数据集需要继承父类torch.utils.data.Dataset,同时需要重载两个私有成员函数:de

1、Dataset+DataLoader实现自定义数据集读取方法

创建自己的数据集需要继承父类torch.utils.data.Dataset,同时需要重载两个私有成员函数:def __len__(self)和def __getitem__(self, index) 。 def __len__(self)应该返回数据集的大小;def __getitem__(self, index)接收一个index,然后返回图片数据和标签,这个index通常指的是一个list的index,这个list的每个元素就包含了图片数据的路径和标签信息。如何制作这个list呢,通常的方法是将图片的路径和标签信息存储在一个txt中,然后从该txt中读取
整个流程如下:

 

 

 1.1整体框架

 1 class MyDataset(torch.utils.data.Dataset):#需要继承torch.utils.data.Dataset
 2     def __init__(self):
 3         #对继承自父类的属性进行初始化(好像没有这句也可以??)
 4         super(MyDataset,self).__init__()
 5         # TODO
 6         #1、初始化一些参数和函数,方便在__getitem__函数中调用。
 7         #2、制作__getitem__函数所要用到的图片和对应标签的list。
 8         #也就是在这个模块里,我们所做的工作就是初始化该类的一些基本参数。
 9         pass
10     def __getitem__(self, index):
11         # TODO
12         #1、根据list从文件中读取一个数据(例如,使用numpy.fromfile,PIL.Image.open)。
13         #2、预处理数据(例如torchvision.Transform)。
14         #3、返回数据对(例如图像和标签)。
15         #这里需要注意的是,这步所处理的是index所对应的一个样本。
16         pass
17     def __len__(self):
18         #返回数据集大小
19         return len()

1.2例子讲解

下面用VOC2012数据集的处理作为例子,我们使用UNet网络处理数据集。

1.2.1VOC数据集的介绍

 

 

 这是下载的一个voc2012的数据集,上边的是测试集,下边的是训练+验证集。

VOCdevkit_train结构如下:

 

 

 

该数据集不全是用来做图像分割的,也有目标检测等其他任务的。
Annotations是保存每一张图片的xml信息,其中包含是否用来分割等选项,目标检测Xmin,Xmax,Ymin,Ymax等信息,此处我们用不到
JPEGimages就是需要用到的图片
SegmentationClass是语义分割的label,需要复制整个文件夹
SegmentationObject是实例分割的,暂时用不到
ImageSets这里需要用到,里边有各种任务的txt文件--我们可以根据此来找图像分割需要用到的图片,下图为ImageSets里的文件:

 

 

 我们这里只用到下图的Segmentation部分,打开可以看到以下几个文件,我们可以根据这几个txt文件把图像分割需要的数据提取出去。

 

 

1.2.2具体代码 

 1 import os
 2 import os.path as osp
 3 import logging
 4 import pandas as pd
 5 import numpy as np
 6 from PIL import Image
 7 import torch
 8 from torch.utils.data import Dataset
 9 from PIL import Image
10 from cv2 import cv2 as cv
11 
12 class BasicDataset(Dataset):
13     def __init__(self, imgs_dir, labels_dir, text_dir):
14         self.imgs_dir = imgs_dir
15         self.labels_dir = labels_dir
16         f = open(text_dir, \'r\')
17         self.img_names = f.read().splitlines()
18         logging.info(f\'Creating dataset with {len(self.img_names)} examples\')
19 
20     def __len__(self):
21         return len(self.img_names)
22 
23     def preprocess(self, img):#对图像进行处理的函数
24         img = np.array(img)
25         if len(img.shape) == 2:#如果img数组的维度是二维,就把它变成三维的
26             # label target image
27             img = np.expand_dims(img, axis=2)#在最后增加一维
28 
29         img = img / 255.0 #把矩阵中的像素点值变成0-1范围中的数,这么做的目的是让目标与背景的差异变得明显
30         # HWC to CHW
31         img_trans = img.transpose((2, 0, 1))
32         #return img_trans
33 
34     def __getitem__(self, i):#这里的i就是从文件夹中提取的第i张图片,当作一个索引
35         img_name = self.img_names[i] #第i个图片的名字
36         img_path = osp.join(self.imgs_dir, img_name+\'.jpg\') #第i个图片的名字和路径
37         label_path = osp.join(self.labels_dir, img_name+\'.png\')#第i个标签图片的名字和路径
38 
39         #生成像素点的标签矩阵
40         label_img = Image.open(label_path)
41         label_img = np.array(label_img) #生成标签矩阵
42         # print label image
43         # label_img[label_img == 255] = 0
44         # cv.imwrite(\'/home/zms/zz/segmentation_models.pytorch-master/tests/test.jpg\', label_img)
45 
46         img = Image.open(img_path)
47         img = self.preprocess(img) #这是处理后的图片
48 
49         assert img.shape[1:] == label_img.shape, \
50             f\'Image and label {img_name} should be the same size, but are {img.size} and {label_img.size}\'
51 
52         return {\'image\': torch.from_numpy(img).type(torch.float), \'label\': torch.from_numpy(label_img).type(torch.uint8)} #就是torch.from_numpy()方法把数组转换成张量,且二者共享内存

(1)首先是对datasets类的属性进行初始化,在_init_中定义了(self,imgs_dir, labels_dir, text_dir)这里。我们定义了imgs、labels、text三个属性,这里的作用是输入这三个的路径。

(2)因为该数据集不全是用来做图像分割的,所以我们要先从ImageSets/Segmentation中读取train.txt文件,通过这个文件再从JPEGimages中取出对应的图片,具体代码:

1 f = open(text_dir, \'r\')#读取一个txt文件,路径为text_dir
2 self.img_names = f.read().splitlines()#取出text文件中的信息

Python中splitlines()函数的作用是:在定义了行边界的字符串中返回行的列表。除非指定了 keepends 参数,且把其值设置为 True, 否则行的边界符默认不会包含在字符串中。例如:

>>> str1 = \'ab c\n\nde fg\rkl\r\n\'
>>> print(str1.splitlines())
[\'ab c\', \'\', \'de fg\', \'kl\']
>>> print(str1.splitlines(True))
[\'ab c\n\', \'\n\', \'de fg\r\', \'kl\r\n\']

 


推荐阅读
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
author-avatar
路啦Nantale
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有