小白Debug路上的第一败笔 MESSIDOR眼底图片数据集

用图片加.xls格式的label读入数据集

先来看看我的代码吧:

import os
import xlrd
#*******************制作‘路径 标签’格式的.txt文件****************************
xl = xlrd.open_workbook(r'E:\Python\project\DIY\MESSIDOR\val\Annotation_Base2.xls')
table = xl.sheets()[0]
nRow=table.nrows #行数
nCol=table.ncols #列数
list=[]

# for i in range(nCol):
for j in range(1,nRow):
    list.append(str(table.row_values(j)[2]))   #[n] n为要读取数据的列数

for i in range(len(list)):
    try:
        list[i] = float(list[i])
        list[i] = int(list[i])
    except:
        pass
print(list)

list1=[]
for j in range(1,nRow):
    list1.append(str(table.row_values(j)[0]))   #[n] n为要读取数据的列数

# for i in range(len(list)):
#     try:
#         list[i] = float(list[i])
#         list[i] = int(list[i])
#     except:
#         pass
print(list1)

def generate(dir, label, Pic_name):
    i=0
    files = os.listdir(dir)
    files.sort()
    print('****************')
    print('input :', dir)
    print('start...')
    # listText = open(dir + '\\' + 'list.txt', 'w')
    listText = open('E:/Python/project/DIY/MESSIDOR/val' + '\\' + 'list.txt', 'w')

    for file in files:
        fileType = os.path.split(file)
        if fileType[1] == '.txt':
            continue
        name =dir + '/' + str(Pic_name[i]) + ' ' + str(label[i]) + '\n'
        listText.write(name)
        i=i+1
        if i==360:
            i=0
    # listText.close()
    print('down!')
    print('****************')


if __name__ == '__main__':
    # generate('E:/Python/project/DIY/MESSIDOR/train/Base1', list,list1)
    generate('E:/Python/project/DIY/MESSIDOR/val/Base2', list,list1)
    # generate('E:/Python/project/DIY/MESSIDOR/all/Base', list, list1)

我的数据集的格式为:所有的图片都在一个文件夹里面,然后是.xls格式的label。之前有试过制作cifar10格式的数据集,结果卡在了.meta文件这个步骤上。后来又查找了好多大神的教程,圈定了这个比较友好的制作数据集的格式。制作一个.txt格式的文件,之后可以自己定义一个dataload类读取数据集
label的格式是这个样子的:小白Debug路上的第一败笔 MESSIDOR眼底图片数据集_第1张图片
图片数据集的格式是这样的
小白Debug路上的第一败笔 MESSIDOR眼底图片数据集_第2张图片
在网络里可以直接读取这个.txt格式的文件,list.txt中的图片地址可以直接链接到图片,list.txt中的label直接就读成label就行。这对小白很友好啊有没有

# 首先继承上面的dataset类。然后在__init__()方法中得到图像的路径,然后将图像路径组成一个数组,这样在__getitim__()中就可以直接读取:
class MyDataset(Dataset):  # 创建自己的类:MyDataset,这个类是继承的torch.utils.data.Dataset
    def __init__(self, txt, transform=None, target_transform=None, loader=default_loader):  # 初始化一些需要传入的参数
        super(MyDataset, self).__init__()  # 对继承自父类的属性进行初始化
        fh = open(txt, 'r')  # 按照传入的路径和txt文本参数,打开这个文本,并读取内容
        imgs = []
        for line in fh:  # 迭代该列表#按行循环txt文本中的内
            line = line.strip('\n')
            line = line.rstrip('\n')  # 删除 本行string 字符串末尾的指定字符,这个方法的详细介绍自己查询python
            words = line.split()  # 用split将该行分割成列表  split的默认参数是空格,所以不传递任何参数时分割空格
            imgs.append((words[0], int(words[1])))  # 把txt里的内容读入imgs列表保存,具体是words几要看txt内容而定
            # 很显然,根据我刚才截图所示txt的内容,words[0]是图片信息,words[1]是lable
        self.imgs = imgs
        self.transform = transform
        self.target_transform = target_transform
        self.loader = loader

    def __getitem__(self, index):  # 这个方法是必须要有的,用于按照索引读取每个元素的具体内容
        fn, label = self.imgs[index]  # fn是图片path #fn和label分别获得imgs[index]也即是刚才每行中word[0]和word[1]的信息
        img = self.loader(fn)  # 按照路径读取图片
        if self.transform is not None:
            img = self.transform(img)  # 数据标签转换为Tensor
        return img, label  # return回哪些内容,那么我们在训练时循环读取每个batch时,就能获得哪些内容

    def __len__(self):  # 这个函数也必须要写,它返回的是数据集的长度,也就是多少张图片,要和loader的长度作区分
        return len(self.imgs)

大部分的代码及注释来自网络,我再找一找加上引用。(大神们请原谅)

# 数据集加载方式设置
train_data = MyDataset(txt=root1 + 'list.txt', transform=train_transforms)
test_data = MyDataset(txt=root2 + 'list.txt', transform=text_transforms)
# 然后就是调用DataLoader和刚刚创建的数据集,来创建dataloader,这里提一句,每次加载loader的长度是有多少个batch,所以和batch_size有关
train_loader = DataLoader(dataset=train_data, batch_size=Batch_Size, shuffle=True, num_workers=0,drop_last=False)
test_loader = DataLoader(dataset=test_data, batch_size=Batch_Size, shuffle=True, num_workers=0,drop_last=False)

可是后来我发现,我的.txt文件的第一个与最后一个是一样的

在这里插入图片描述
在这里插入图片描述
于是我就从新检查我的.txt文件的制作过程
发现自己手贱非要在不该清零的地方给i清零了

 for file in files:
        fileType = os.path.split(file)
        if fileType[1] == '.txt':
            continue
        name =dir + '/' + str(Pic_name[i]) + ' ' + str(label[i]) + '\n'
        listText.write(name)
        i=i+1
       # if i==360:  
       #    i=0
    listText.close()
    print('down!')
    print('****************')

大功告成!如果对您有帮助请给我点个赞再走哦,我想我会经常更新我的踩坑历程的欢迎关注!

你可能感兴趣的:(深度学习,pytorch)