Pytorch数据变换(Transform)
实例化数据库的时候,有一个可选的参数可以对数据进行转换,满足大多神经网络的要求输入固定尺寸的图片,因此要对原图进行Rescale
或者Crop操作,然后返回的数据需要转换成Tensor如:
- import FaceLandmarksDataset
- face_dataset = FaceLandmarksDataset(csv_file='data/faces/face_landmarks.csv',
- root_dir='data/faces/',
- transform=transforms.Compose([ Rescale(256), RandomCrop(224), ToTensor()]) )
数据转换(Transfrom)发生在数据库中的__getitem__操作中。以上代码中,transforms.Compose(transform_list),Compose即组合的意思,其参数是一个转换操作的列表。如上是[ Rescale(256), RandomCrop(224), ToTensor()],以下是实现这三个转换类。我们将把它们写成可调用的类,而不是简单的函数,这样在每次调用转换时就不需要传递它的参数。为此,我们只需要实现__call__方法,如果需要,还需要实现__init__方法。然后我们可以使用这样的变换:
- #创建一个转换可调用类的实例
- tsfm = Transform(params)
- #使用转换操作实例对样本sample进行转换
- transformed_sample = tsfm(sample)
下面观察这些转换是如何应用于图像和标注的。(注:每一个操作对应一个类)
- class Rescale(object):
- """Rescale the image in a sample to a given size.
- Args:
- output_size (tuple or int): Desired output size. If tuple, output is
- matched to output_size. If int, smaller of image edges is matched
- to output_size keeping aspect ratio the same.
- """
- def __init__(self, output_size):
- assert isinstance(output_size, (int, tuple))
- self.output_size = output_size
- def __call__(self, sample):
- image, landmarks = sample['image'], sample['landmarks']
- h, w = image.shape[:2]
- if isinstance(self.output_size, int):
- if h > w:
- new_h, new_w = self.output_size * h / w, self.output_size
- else:
- new_h, new_w = self.output_size, self.output_size * w / h
- else:
- new_h, new_w = self.output_size
- new_h, new_w = int(new_h), int(new_w)
- img = transform.resize(image, (new_h, new_w))
- # h and w are swapped for landmarks because for images,
- # x and y axes are axis 1 and 0 respectively
- landmarks = landmarks * [new_w / w, new_h / h]
- return {'image': img, 'landmarks': landmarks}
- class RandomCrop(object):
- """Crop randomly the image in a sample.
- Args:
- output_size (tuple or int): Desired output size. If int, square crop
- is made.
- """
- def __init__(self, output_size):
- assert isinstance(output_size, (int, tuple))
- if isinstance(output_size, int):
- self.output_size = (output_size, output_size)
- else:
- assert len(output_size) == 2
- self.output_size = output_size
- def __call__(self, sample):
- image, landmarks = sample['image'], sample['landmarks']
- h, w = image.shape[:2]
- new_h, new_w = self.output_size
- top = np.random.randint(0, h - new_h)
- left = np.random.randint(0, w - new_w)
- image = image[top: top + new_h,
- left: left + new_w]
- landmarks = landmarks - [left, top]
- return {'image': image, 'landmarks': landmarks}
- class ToTensor(object):
- """Convert ndarrays in sample to Tensors."""
- def __call__(self, sample):
- image, landmarks = sample['image'], sample['landmarks']
- # swap color axis because
- # numpy image: H x W x C
- # torch image: C X H X W
- image = image.transpose((2, 0, 1))
- return {'image': torch.from_numpy(image),
- 'landmarks': torch.from_numpy(landmarks)}
以下来介绍转换的用法。
- #获取一条数据
- sample = face_dataset[index]
- #单独进行操作
- scale = Rescale(256)
- crope= RandomCrop(224)
- scale(sample)
- crope(sample)
- #使用Compose组合操作
- compose = transforms.Compose([Rescale(256),RandomCrop(224)])
- compose(sample)
上述转换后数据仍然是PIL类型,如果要求返回是一个tensor,那么还得在Compose的最后一个元素进行Totensor操作。
Pytorch数据变换(Transform)的更多相关文章
- pytorch空间变换网络
pytorch空间变换网络 本文将学习如何使用称为空间变换器网络的视觉注意机制来扩充网络.可以在DeepMind paper 阅读更多有关空间变换器网络的内容. 空间变换器网络是对任何空间变换的差异化 ...
- PyTorch数据加载处理
PyTorch数据加载处理 PyTorch提供了许多工具来简化和希望数据加载,使代码更具可读性. 1.下载安装包 scikit-image:用于图像的IO和变换 pandas:用于更容易地进行csv解 ...
- Pytorch数据读取框架
训练一个模型需要有一个数据库,一个网络,一个优化函数.数据读取是训练的第一步,以下是pytorch数据输入框架. 1)实例化一个数据库 假设我们已经定义了一个FaceLandmarksDataset数 ...
- kaggle数据挖掘竞赛初步--Titanic<数据变换>
完整代码: https://github.com/cindycindyhi/kaggle-Titanic 特征工程系列: Titanic系列之原始数据分析和数据处理 Titanic系列之数据变换 Ti ...
- R学习笔记 第五篇:数据变换和清理
在使用R的分组操作之前,首先要了解R语言包,包实质上是实现特定功能的,预先写好的代码库(library),R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量的,在使用 ...
- 【转载】PyTorch系列 (二):pytorch数据读取
原文:https://likewind.top/2019/02/01/Pytorch-dataprocess/ Pytorch系列: PyTorch系列(一) - PyTorch使用总览 PyTorc ...
- css变换transform 以及 行内元素的一些说明
变换transform的用法比较简单:[变换其实和普通的css属性,如color等没什么区别,可以为变换应用过渡或动画,就像其他普通css属性一样]#test { transform: transla ...
- R实战 第六篇:数据变换(aggregate+dplyr)
数据分析的工作,80%的时间耗费在处理数据上,而数据处理的主要过程可以分为:分离-操作-结合(Split-Apply-Combine),也就是说,首先,把数据根据特定的字段分组,每个分组都是独立的:然 ...
- Pytorch数据类型转换
Pytorch数据类型转换 载入模块生成数据 import torch import numpy as np a_numpy = np.array([1,2,3]) Numpy转换为Tensor a_ ...
随机推荐
- 关于AC自动机和DP的联系
首先是描述个大概.不说一些特殊的DP 或者借用矩阵来状态转移 (这些本质都是一样的). 只讲AC自动机和DP的关系(个人理解). AC自动机 又可以叫做状态机. 我一开始的认为.AC 自动机提供了一些 ...
- Android热修复原理(一)热修复框架对比和代码修复
在Android应用开发中,热修复技术被越来越多的开发者所使用,也出现了很多热修复框架,比如:AndFix.Tinker.Dexposed和Nuwa等等.如果只是会这些热修复框架的使用那意义并不大,我 ...
- 【LOJ2541】【PKUWC2018】猎人杀(容斥,FFT)
[LOJ2541][PKUWC2018]猎人杀(容斥,FFT) 题面 LOJ 题解 这题好神仙啊. 直接考虑概率很麻烦,因为分母总是在变化. 但是,如果一个人死亡之后,我们不让他离场,假装给他打一个标 ...
- 51nod 1295 XOR key | 可持久化Trie树
51nod 1295 XOR key 这也是很久以前就想做的一道板子题了--学了一点可持久化之后我终于会做这道题了! 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X ...
- 洛谷 P3990 [SHOI2013]超级跳马 解题报告
P3990 [SHOI2013]超级跳马 题目描述 现有一个\(n\) 行 \(m\) 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘. ...
- python之旅:函数对象、函数嵌套、名称空间与作用域、装饰器
一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...
- 不知道怎么改的尴尬R语言的ARIMA模型预测
数据还有很多没弄好,程序还没弄完全好. > read.xlsx("H:/ProjectPaper/论文/1.xlsx","Sheet1") > it ...
- hihocoder #1162 矩阵加速dp
#1162 : 骨牌覆盖问题·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 前两周里,我们讲解了2xN,3xN骨牌覆盖的问题,并且引入了两种不同的递推方法.这一次我 ...
- 【Asp.net入门01】动态网站基础知识
本节将介绍: 网站搭建流程 动态网站相关基础概念 网页的访问原理 使用浏览器访问网站是我们几乎天天在做的事情.以前我们只需要关注网页内容,作为网站开发人员,从现在开始我们要关注更深层次的东西了. 1. ...
- TOML 详解
TOML的由来 配置文件的使用由来已久,从.ini.XML.JSON.YAML再到TOML,语言的表达能力越来越强,同时书写便捷性也在不断提升. TOML是前GitHub CEO, Tom Prest ...