Pytorch——数据加载和处理

Pytorch中进行数据处理的工具

scikit-image:用于图像的IO和变换
pandas:用于更容易地进行csv解析
此处下载数据集。
数据存于“data / faces /”的目录中。这个数据集实际上是imagenet数据集标
注为face的图片当中在 dlib 面部检测 (dlib’s pose estimation) 表现良好的图片。我们要处理的是一个面部姿态的数据集。如下图
在这里插入图片描述
数据集类
torch.utils.data.Dataset 表示数据集的抽象类。
自定义数据集应继承Dataset并覆盖以下方法 * __len__ 实现 len(dataset) 返还数据集的尺寸。 * __getitem__ 用来获取一些索引数据,例如 dataset[i] 中的(i)。

建立数据集类
为面部数据集创建一个数据集类。我们将在 __init__ 中读取csv的文件内容,在 __getitem__ 中读取图片。
我们的数据样本将按这样一个字典 {‘image’: image, ‘landmarks’: landmarks} 组织。
我们的数据集类将添加一个可选参数 transform 以方便对样本进行预处理。 init 方法如下图所示:

class FaceLandmarksDataset(Dataset):
    """面部标记数据集."""
    
    def __init__(self, csv_file, root_dir, transform=None):
        """
        csv_file(string):带注释的csv文件的路径。
           root_dir(string):包含所有图像的目录。
            transform(callable, optional):一个样本上的可用的可选变换
        """
        self.landmarks_frame = pd.read_csv(csv_file)
        self.root_dir = root_dir
        self.transform = transform
    
    def __len__(self):
        return len(self.landmarks_frame)

    def __getitem__(self, idx):
        img_name = os.path.join(self.root_dir,self.landmarks_frame.iloc[idx, 0])
        image = io.imread(img_name)
        landmarks = self.landmarks_frame.iloc[idx, 1:]
        landmarks = np.array([landmarks])
        landmarks = landmarks.astype('float').reshape(-1, 2)
        sample = {'image': image, 'landmarks': landmarks}
    
        if self.transform:
            sample = self.transform(sample)

        return sample

数据可视化

face_dataset = FaceLandmarksDataset(csv_file='data/faces/face_landmarks.csv',root_dir='data/faces/')

fig = plt.figure()

for i in range(len(face_dataset)):
    sample = face_dataset[i]
    
    print(i, sample['image'].shape, sample['landmarks'].shape)
    
    ax = plt.subplot(1, 4, i + 1)
    plt.tight_layout()
    ax.set_title('Sample #{}'.format(i))
    ax.axis('off')
    show_landmarks(**sample)
    
    if i == 3:
        plt.show()
        break

在这里插入图片描述
在这里插入图片描述
数据变换
通过上面的例子我们会发现图片并不是同样的尺寸。
绝大多数神经网络都假定图片的尺寸相同。
因此我们需要做一些预处理。让我们创建三个转换:
* Rescale :缩放图片
* RandomCrop :对图片进行随机裁剪。
* ToTensor :这是一种数据增强操作,把numpy格式图片转为torch格式图片 (我们需要交换坐标轴).
我们会把它们写成可调用的类的形式而不是简单的函数,这样就不需要每次调用时传递一遍参数。我们只需要实现 call 方法,必 要的时候实现 init 方法。我们可以这样调用这些转换:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值