# Transform 图片数据预处理方法
这篇主要分为几个部分介绍 transforms:
- 裁剪
- 旋转和翻转
- 图像变换
- transforms 方法操作
- 自定义 transforms 方法
最后是数据增强的实战:对人民币二分类实验进行数增强。
由于图片经过 transform 操作之后是 tensor,像素值在 0~1 之间,并且标准差和方差不是正常图片的。所以定义了 `transform_invert()` 方法。功能是对 tensor 进行反标准化操作,并且把 tensor 转换为 image,方便可视化。
我们主要修改的是 `transforms.Compose` 代码块中的内容,其中 `transforms.Resize((224, 224))` 是把图片缩放到 (224, 224) 大小 (下面的所有操作都是基于缩放之后的图片进行的),然后再进行其他 transform 操作。
原图如下:
![](https://www.writebug.com/myres/static/uploads/2021/10/25/55cfafbc64ffd0373010d443da610adc.writebug)
经过缩放之后,图片如下:
![](https://www.writebug.com/myres/static/uploads/2021/10/25/922db26673b357b3d194fc3291fbcecb.writebug)
\# 裁剪
## transforms.CenterCrop
```
torchvision.transforms.CenterCrop(size)
```
功能:从图像中心裁剪图片
- size: 所需裁剪的图片尺寸
`transforms.CenterCrop(196)` 的效果如下:
![](https://www.writebug.com/myres/static/uploads/2021/10/25/246b698be290578361d34b745a321030.writebug)
如果裁剪的 size 比原图大,那么会填充值为 0 的像素。`transforms.CenterCrop(512)` 的效果如下:
![](https://www.writebug.com/myres/static/uploads/2021/10/25/43217c8d5884becee318839d5e53d081.writebug)
\## transforms.RandomCrop
```
torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')
```
功能:从图片中随机裁剪出尺寸为 size 的图片,如果有 padding,那么先进行 padding,再随机裁剪 size 大小的图片。
- size:
- padding: 设置填充大小
- 当为 a 时,上下左右均填充 a 个像素
- 当为 (a, b) 时,左右填充 a 个像素,上下填充 b 个像素
- 当为 (a, b, c, d) 时,左上右下分别填充 a,b,c,d
- pad_if_need: 当图片小于设置的 size,是否填充
- padding_mode:
- constant: 像素值由 fill 设定
- edge: 像素值由图像边缘像素设定
- reflect: 镜像填充,最后一个像素不镜像。([1,2,3,4] -> [3,2,1,2,3,4,3,2])
- symmetric: 镜像填充,最后一个像素也镜像。([1,2,3,4] -> [2,1,1,2,3,4,4,4,3])
- fill: 当 padding_mode 为 constant 时,设置填充的像素值
`transforms.RandomCrop(224, padding=16)` 的效果如下,这里的 padding 为 16,所以会先在 4 边进行 16 的 padding,默认填充 0,然后随机裁剪出 (224,224) 大小的图片,这里裁剪了左上角的区域。
![](https://www.writebug.com/myres/static/uploads/2021/10/25/62c07860d98bb2313419433314ddc2c6.writebug)
`transforms.RandomCrop(224, padding=(16, 64))` 的效果如下,首先在左右进行 16 的 padding,上下进行 64 的 padding,然后随机裁剪出 (224,224) 大小的图片。
![](https://www.writebug.com/myres/static/uploads/2021/10/25/8d92ab0b3cd89a4a14ec78922ec415ef.writebug)
`transforms.RandomCrop(224, padding=16, fill=(255, 0, 0))` 的效果如下,首先在上下左右进行 16 的 padding,填充值为 (255, 0, 0),然后随机裁剪出 (224,224) 大小的图片。
![](https://www.writebug.com/myres/static/uploads/2021/10/25/33b413b3b60881043fbeab713aa6a3d9.writebug)
`transforms.RandomCrop(512, pad_if_needed=True)` 的效果如下,设置 `pad_if_needed=True`,图片小于设置的 size,用 (0,0,0) 填充。
![](https://www.writebug.com/myres/static/uploads/2021/10/25/dedca9e251656975a922097cf4ddf73f.writebug)
`transforms.RandomCrop(224, padding=64, padding_mode='edge')` 的效果如下,首先在上下左右进行 64 的 padding,使用边缘像素填充,然后随机裁剪出 (224,224) 大小的图片。
![](https://www.writebug.com/myres/static/uploads/2021/10/25/a20c4245f5f850943d5667779ab41f6b.writebug)
`transforms.RandomCrop(224, padding=64, padding_mode='reflect')` 的效果如下,首先在上下左右进行 64 的 padding,使用镜像填充,然后随机裁剪出 (224,224) 大小的图片。
![](https://www.writebug.com/myres/static/uploads/2021/10/25/45ffb695bac758bb6d494317d5791fc8.writebug)
`transforms.RandomCrop(1024, padding=1024, padding_mode='symmetric')` 的效果如下,首先在上下左右进行 1024 的 padding,使用镜像填充,然后随机裁剪出 (1024, 1024) 大小的图片。
![](https://www.writebug.com/myres/static/uploads/2021/10/25/0e35a607055fe47d453e2a12fc49aee6.writebug)
\## transforms.RandomResizedCrop
```
torchvision.transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(0.75, 1.3333333333333333), interpolation=2)
```
功能:随机大小、随机宽高比裁剪图片。首先根据 scale 的比例裁剪原图,然后根据 ratio 的长宽比再裁剪,最后使用插值法把图片变换为 size 大小。
- size: 裁剪的图片尺寸
- scale: 随机缩放面积比例,默认随机选取 (0.08, 1) 之间的一个数
- ratio: 随机长宽比,默认随机选取 ($\displaystyle\frac{3}{4}$, $\displaystyle\frac{4}{3}$ ) 之间的一个数。因为超过这个比例会有明显的失真
- interpolation: 当裁剪出来的图片小于 size 时,就要使用插值方法 resize
- PIL.Image.NEAREST
- PIL.Image.BILINEAR
- PIL.Image.BICUBIC
`transforms.RandomResizedCrop(size=224, scale=(0.08, 1))` 的效果如下,首先随机选择 (0.08, 1) 中 的一个比例缩放,然后随机裁剪出 (224, 224) 大小的图片。
![](https://www.writebug.com/myres/static/uploads/2021/10/25/63ae9ba404117850f3d682d0f448cc06.writebug)
`transforms.RandomResizedCrop(size=224, scale=(0.5, 0.5))` 的效果如下,首先缩放 0.5 倍,然后随机裁剪出 (224, 224) 大小的图片。
![](https://www.writebug.com/myres/static/uploads/2021/10/25/fa289913765cf7dbb087ee09cc88f06a.writebug)
\## transforms.FiveCrop(TenCrop)
```
torchvision.transforms.FiveCrop(size)
torchvision.transforms.TenCrop(size, vertical_flip=False)
```
功能:`FiveCrop` 在图像的上下左右以及中心裁剪出尺寸为 size 的 5 张图片。`Tencrop` 对这 5 张图片进行水平或者垂直镜像获得 10 张图片。
- size: 最后裁剪的图片尺寸
- vertical_flip: 是否垂直翻转
由于这两个方法返回的是 tuple,每个元素表示一个图片,我们还需要把这个 tuple 转换为一张图片的 `tensor`。代码如下:
```
transforms.FiveCrop(112),
transforms.Lambda(lambda crops: torch.stack([(transforms.ToTensor()(crop)) for crop in crops]))
```
并且把 `transforms.Compose` 中最后两行注释:
```
# transforms.ToTensor(), # toTensor()接收的参数是 Image,由于上面已经进行了 toTensor(), 因此这里注释
# transforms.Normalize(norm_mean, norm_std), # 由于是 4 维的 Tensor,因此不能执行 Normalize() 方法
```
- `transforms.toTensor()` 接收的参数是 Image,由于上面已经进行了 `toTensor()`。因此注释这一行。
- `transforms.Normalize()` 方法接收的是 3 维的 tensor (在 `_is_tensor_image()` 方法 里检查是否满足这一条件,不满足则报错),而经过 `transforms.FiveCrop` 返回的是 4 维张量,因此注释这一行。
最后的 tensor 形状是 [ncrops, c, h, w],图片可视化的代码也需要做修改:
```
## 展示 FiveCrop 和 TenCrop 的图片
ncrops, c, h, w = img_tensor.shape
columns=2 # 两列
rows= math.ceil(ncrops/2) # 计算多少行
# 把每个 tensor ([c,h,w]) 转换为 image
for i in range(ncrops):
img = transform_invert(img_tensor[i], train_transform)
plt.subplot(rows, columns, i+1)
plt.imshow(img)
plt.show()
```
5 张图片分别是左上角,右上角,左下角,右下角,中心。图片如下:
![](https://www.writebug.com/myres/static/uploads/2021/10/25/382a853f1366f78c6532fcdec556
没有合适的资源?快使用搜索试试~ 我知道了~
基于 transforms图片数据预数据增强做图像二分类实战 附完整代码+数据
共14个文件
py:12个
md:1个
license:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 163 浏览量
2023-02-02
13:24:20
上传
评论
收藏 24KB ZIP 举报
温馨提示
基于 transforms图片数据预数据增强做图像二分类实战 附完整代码+数据 这篇主要分为几个部分介绍 transforms: 裁剪 旋转和翻转 图像变换 transforms 方法操作 自定义 transforms 方法 最后是数据增强的实战:对人民币二分类实验进行数增强。
资源推荐
资源详情
资源评论
收起资源包目录
picturedata-master.zip (14个子文件)
picturedata
LICENSE 1KB
rmb_classification
tools
__init__.py 0B
my_dataset.py 3KB
common_tools.py 1KB
split_dataset.py 2KB
model
__init__.py 0B
lenet.py 4KB
train_lenet.py 6KB
README.md 30KB
transforms
__init__.py 0B
RMB_data_augmentation.py 5KB
plot_rmb.py 1KB
addPepperNoise.py 2KB
transforms_methods_1.py 6KB
共 14 条
- 1
资源评论
- aRed_Panda2024-04-17资源不错,对我启发很大,获得了新的灵感,受益匪浅。
甜辣uu
- 粉丝: 8443
- 资源: 1103
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 使用Dockerfile配置Springboot应用服务发布Docker镜像-源码
- 万维考试系统-C语言题库-含题目-程序设计题导出-113道.doc
- Alibaba SpringCloud集成Nacos、openFeign实现负载均衡-源码
- 用户研究系列之Persona介绍(用户画像)
- Image_1715110604427.jpg
- mYzh..trashed-1716951334-.jpg
- Alibaba SpringCloud集成nacos实现配置中心
- 那些好的不像话的心流体验
- 基于pytorch的卷积神经网络识别是否为奥特曼的项目python源码+文档说明+数据集(课程设计)
- 基于卷积神经网络的图像风格迁移python源码+文档说明+界面图片(课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功