Data Loading and Processing Tutorial

 1 import os                 #路径组合
 2 import torch # is_tensor
 3 import pandas as pd       #读取csv 
 4 import numpy as np       #ndarray , reshape, 
 5 from torch.utils.data import Dataset, DataLoader     #实现数据集和数据集的分组
 6 from skimage import io                         #for image io
 7 import matplotlib.pyplot as plt                 #for plotting
 8 from torchvision import transforms, utils         #transforms.compose ,utils.make_grid()
 9 from skimage import io, transform              #读取图片, transform.resize
10 import warnings

 

panda: 用于解析csv文件

scikit-iamge:读取图像和图像转换

os.path.join():把不同路径部分拼接在一起,并用 / 隔开,如果最后一个组分是“”,会在最后的路径名后加上 /

自己的数据集类继承与dataset,必须满足

landmark的x,y 与 image的h,w顺序相反

numpy和torch的image的尺寸顺序不一样   transpsoe(())要会用 

magic method:   __init__, __call__

from sys import argv

argv and input()

the difference has to do with where the user is reuqired to give input.  one in command, one when this script is running

tensor.tolist(),  tensor仅含一个值时,同item(),返回一个python数字,否则返回一个list

dict.items()返回的是key和value

pandas.DataFrame.as_matrix() 返回ndarray

np.arrray() 返回ndarray

assert isinstance(output_size, (int, tuple))

enumerate()返回的是一个iterable enumerate对象,参数必须是sequence 或者iterable,里面是tuples

.transpose()  numpy

 

what to do:

处理csv文件,得到landmarks

landmarks与image结合,并进行transform,得到transformed_sample

用data_loader分成batch

how to do:

sci什么的读取一下文件,转换成ndarray,把名字截掉,然后transpose为  68 by 2 (2为x, y坐标)

转换为sample需要一个class,继承data,class需要包含__init__(memory efficient)和__getitem__,还要传一个transform对象,传参时根据路径读取一下图片,把image和landmark放到词典里,执行transform

 


python语法

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):   
        if cls._instance is None:
            cls._instance = object.__new__(cls, *args, **kwargs)

        return cls._instance

s1 = Singleton()
s2 = Singleton()
print(s1)
print(s2) 

cls代表需要被实例化的类

输出:

<__main__.Singleton object at 0x7fdef58b1190>
<__main__.Singleton object at 0x7fdef58b1190>

还有工厂化,用到再说吧,留坑


 

 

torchvision.utils.make_grid(images_batch), 把图片放到格子里,此时的image_batch是(B ,C, W, H)的tensor, 或者是相同尺寸图片的list,padding默认为2, pad_value默认为0


 

导入一张图片并输出:io.imread(img_name)和 scipy.misc.face()

导入sci文件,输出{‘image': image, 'sample': sample} , pd.read_csv, frame.iloc,frame.as_matrix():

 

FaceLandmarkDataset

1、 继承Dataset

2、 实现__init__和__getitem__和__len__

3、 __init__的参数为  csv_file, root_dir, transform(可选),局部变量为landmarks_frame, root_dir, transform 实现读取csv_file

4、__len__返回landmarks_frame的长度

5、__getitem__参数为idx, 实现读取图片,截取对应的landmarks的坐标,转换为ndarray并转置,返回landmarks和image组成的词典。在getitem内实现数据的转变,而不是一次性读取所有的照片,节省内存

返回的landmarks是ndarray,图片也是ndarray

Transform

1、实现__init__和__call__, init设置变量,__call__传递样本

2、__init__的参数为int或者(int, int)计算output.size, call进行对sample进行对应的操作,并返回output (词典)

torchvision.transforms.Compose(transforms)将多个transform组合起来使用, transforms用[]括起来

transform里还要实现一个ToTensor的操作,把landmarks和images转换为Tensor


 

划分Batch,使用DataLoader,输入DataSet对象:

 

DataLoader,实现数据集的划分,传入dataset

from torch.utils.data import Dataset, DataLoader

DataLoader可以迭代,支持map-style和iterable-style两种DataSet

对于map-style的dataset,每个batch也是一个词典,使用Key获得image batch和label batch

 


 

输出图片和landmarks

torchvison.utils.make_grid(),接收tensor  , plt.imshow(grid), 图片全框,padding默认为2

plt.scatter()接受的numpy array


 

plt.需要的是np.ndarray,torchvison.utils.make_grid(),接收tensor

        # numpy image: H x W x C
        # torch image: C x H x W

practice实现,读取faces图片和相应的csv保存的label,制作出DataSet,数据格式为tensor,transform使用torchvision里已经做好的


 

 

用到的画图:

plt.figure()

plt.imshow()

plt.scatter

plt.subpltot() 至少3个参数,前两个控制几行几列,第三个控制子图位置

plt.tight_layout()

plt.title()

plt.axi()

plt.ioff

torchvsion.utils.make_grid,传进去的是n张tensor表示的图片,返回的仍然是tensor,用plt画图时需要先转换为numpy,并注意调整维度顺序。

plt.show()

 

posted on 2019-09-18 13:31  Vitavi  阅读(166)  评论(0编辑  收藏  举报

导航