zoukankan      html  css  js  c++  java
  • pytorch torchvision.ImageFolder的使用

    参考:https://pytorch-cn.readthedocs.io/zh/latest/torchvision/torchvision-datasets/

    torchvision.datasets

    Datasets 拥有以下API:

    • __getitem__ 
    • __len__

    Datasets都是 torch.utils.data.Dataset的子类,所以,他们也可以通过torch.utils.data.DataLoader使用多线程(python的多进程)。

    举例说明: 

    torch.utils.data.DataLoader(coco_cap, batch_size=args.batchSize, shuffle=True, num_workers=args.nThreads)

    在构造函数中,不同的数据集直接的构造函数会有些许不同,但是他们共同拥有 keyword 参数。

    • transform: 一个函数,原始图片作为输入,返回一个转换后的图片。
    • target_transform - 一个函数,输入为target,输出对其的转换。例子,输入的是图片标注的string,输出为word的索引。

     

    ImageFolder

    一个通用的数据加载器,数据集中的数据以以下方式组织

    root/dog/xxx.png
    root/dog/xxy.png
    root/dog/xxz.png
    
    root/cat/123.png
    root/cat/nsdf3.png
    root/cat/asd932_.png

    既其默认你的数据集已经自觉按照要分配的类型分成了不同的文件夹,一种类型的文件夹下面只存放一种类型的图片

    运行命令为:

    import torchvision.datasets as dset
    dset.ImageFolder(root="root folder path", [transform, target_transform])
    • root : 指定图片存储的路径,在下面的例子中是'./data/dogcat_2'
    • transform: 一个函数,原始图片作为输入,返回一个转换后的图片。
    • target_transform - 一个函数,输入为target,输出对其的转换。例子,输入的是图片标注的string,输出为word的索引。

    有以下成员变量:

    • self.classes - 用一个list保存 类名
    • self.class_to_idx - 类名对应的 索引
    • self.imgs - 保存(img-path, class) tuple的list
    即后面可以通过查看返回的数据集对象来查看相应的值,下面举例说明:
     
    图片为:

    可见分成了cat和dog两类

    import torchvision.datasets as dset
    dataset = dset.ImageFolder('./data/dogcat_2') #没有transform,先看看取得的原始图像数据
    print(dataset.classes)  #根据分的文件夹的名字来确定的类别
    print(dataset.class_to_idx) #按顺序为这些类别定义索引为0,1...
    print(dataset.imgs) #返回从所有文件夹中得到的图片的路径以及其类别

    返回:

    ['cat', 'dog']
    {'cat': 0, 'dog': 1}
    [('./data/dogcat_2/cat/cat.12484.jpg', 0), ('./data/dogcat_2/cat/cat.12485.jpg', 0), ('./data/dogcat_2/cat/cat.12486.jpg', 0), ('./data/dogcat_2/cat/cat.12487.jpg', 0), ('./data/dogcat_2/dog/dog.12496.jpg', 1), ('./data/dogcat_2/dog/dog.12497.jpg', 1), ('./data/dogcat_2/dog/dog.12498.jpg', 1), ('./data/dogcat_2/dog/dog.12499.jpg', 1)]

    如果在数据下面又添加了一个类型'others',那么访问类型的时候返回的就是:

    ['cat', 'dog', 'others']
    {'cat': 0, 'dog': 1, 'others': 2}

    查看得到的图片数据:

    #从返回结果可见得到的数据仍是PIL Image对象
    print(dataset[0])
    print(dataset[0][0])
    print(dataset[0][1]) #得到的是类别0,即cat

    返回:

    (<PIL.Image.Image image mode=RGB size=497x500 at 0x11D99A9B0>, 0)
    <PIL.Image.Image image mode=RGB size=497x500 at 0x11DD24278>
    0

    然后定义一个对数据进行处理的transform:

    #可以看出来此时得到的图片数据已经是处理过后的tensor数据了
    print(dataset[0][0])
    print(dataset[0][0].size()) #大小也是经过设定后的大小224
    print(dataset[0][1]) #得到的是类别0,即cat

    返回:

    tensor([[[-0.7412, -0.7490, -0.7725,  ...,  0.3176,  0.3412,  0.3725],
             [-0.7333, -0.7412, -0.7882,  ...,  0.3255,  0.3647,  0.4039],
             [-0.7098, -0.7569, -0.8039,  ...,  0.3255,  0.3725,  0.4039],
             ...,
             [ 0.3961,  0.3961,  0.4039,  ...,  0.2627,  0.2627,  0.2549],
             [ 0.4196,  0.4039,  0.4118,  ...,  0.2549,  0.2392,  0.2314],
             [ 0.4275,  0.4275,  0.4431,  ...,  0.2314,  0.2314,  0.2235]],
    
            [[-0.7412, -0.7490, -0.7725,  ...,  0.3882,  0.3725,  0.3569],
             [-0.7333, -0.7412, -0.7882,  ...,  0.3961,  0.3961,  0.3882],
             [-0.7098, -0.7569, -0.8039,  ...,  0.3882,  0.4039,  0.3882],
             ...,
             [ 0.0431,  0.0510,  0.0667,  ..., -0.0824, -0.0824, -0.0902],
             [ 0.0510,  0.0431,  0.0588,  ..., -0.0824, -0.1059, -0.1137],
             [ 0.0353,  0.0353,  0.0510,  ..., -0.0902, -0.1059, -0.1216]],
    
            [[-0.8353, -0.8431, -0.8667,  ...,  0.3255,  0.3255,  0.3255],
             [-0.8196, -0.8275, -0.8824,  ...,  0.3333,  0.3490,  0.3569],
             [-0.7804, -0.8353, -0.8667,  ...,  0.3333,  0.3569,  0.3569],
             ...,
             [-0.2863, -0.2784, -0.2627,  ..., -0.3569, -0.3569, -0.3647],
             [-0.2549, -0.2706, -0.2549,  ..., -0.3569, -0.3804, -0.3882],
             [-0.2235, -0.2471, -0.2392,  ..., -0.3569, -0.3804, -0.4039]]])
    torch.Size([3, 224, 224])
    0
     
     
     
     
     
     
  • 相关阅读:
    python装饰器执行机制
    蓝桥网试题 java 基础练习 十进制转十六进制
    蓝桥网试题 java 基础练习 十六进制转十进制
    蓝桥网试题 java 基础练习 十六进制转八进制
    蓝桥网试题 java 基础练习 数列排序
    蓝桥网试题 java 入门训练 A+B问题
    蓝桥网试题 java 入门训练 序列求和
    蓝桥网试题 java 入门训练 圆的面积
    蓝桥网试题 java 入门训练 Fibonacci数列
    贪心算法
  • 原文地址:https://www.cnblogs.com/wanghui-garcia/p/10649364.html
Copyright © 2011-2022 走看看