训练图像预处理函数功能(paddle)
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了训练图像预处理函数功能(paddle)相关的知识,希望对你有一定的参考价值。
简 介: 尽管我们可以通过 下面命令获得paddle.vision.transforms中的所有的函数。那么这些函数的具体使用说明如何能够获得呢?
关键词
: 数据预处理,paddle,vision,transforms
§01 数据预处理
对于神经网络的 输入数据进行预处理主要是为:
- 为了解决训练过程中的过拟合问题,其中一个方法就是对于训练数据进行增强;
- 使得输入图片满足网络的输入层对于数据尺寸的要求;
在 paddlepaddle的框架下,进行数据的预处理方法包括:
- 基于框架内置的数据集合;
- 基于自定义的数据集合;
下面是从 数据预处理-使用文档-PaddlePaddle深度学习平台 获得的一些关于paddle下数据预处理的内容。
1.1 飞桨框架内置数据集
对飞桨框架内置图像数据集的预处理,飞桨框架将这部分API
整合到paddle.vision.transforms
下,你可以通过以下方式查看:
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import paddle
print('Dataset process all method: '.format(paddle.vision.transforms.__all__))
Dataset process all method: ['BaseTransform', 'Compose', 'Resize', 'RandomResizedCrop', 'CenterCrop', 'RandomHorizontalFlip', 'RandomVerticalFlip', 'Transpose', 'Normalize', 'BrightnessTransform', 'SaturationTransform', 'ContrastTransform', 'HueTransform', 'ColorJitter', 'RandomCrop', 'Pad', 'RandomRotation', 'Grayscale', 'ToTensor', 'to_tensor', 'hflip', 'vflip', 'resize', 'pad', 'rotate', 'to_grayscale', 'crop', 'center_crop', 'adjust_brightness', 'adjust_contrast', 'adjust_hue', 'normalize']
BaseTransform Compose
Resize RandomResizedCrop
CenterCrop RandomHorizontalFlip
RandomVerticalFlip Transpose
Normalize BrightnessTransform
SaturationTransform ContrastTransform
HueTransform ColorJitter
RandomCrop Pad
RandomRotation Grayscale
ToTensor to_tensor
hflip vflip
resize pad
rotate to_grayscale
crop center_crop
adjust_brightness adjust_contrast
adjust_hue normalize
strid = 5
strall = tspgetdopstring(strid)
strall = strall.replace(':', '')
strall = strall.replace('\\'', '').replace(']','').replace('[','').replace(':','').split(',')
maxlen = max(len(s.strip(' ')) for s in strall)
strall = [s+' '*(maxlen - len(s)) for s in strall]
for s in list(zip(*([iter(strall)]*2))):
printff(*s)
你可以同构以下方式随机调整图像的亮度、对比度、饱和度,并调整图像的大小,对图像的其他调整,可以参考相关的API
文档。
1.1.1 测试预处理功能
通过 Compose,将Resize, ColorJitter增加到对于内置数据集合预处理中。
from paddle.vision.transforms import Compose,Resize,ColorJitter
transform = Compose([ColorJitter(), Resize(size=32)])
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
查看所获得的数据:
data = train_dataset[0]
print(data)
plt.imshow(data[0])
plt.show()
下面是所获得数据的格式。可以看到与处理前的不同包括:
- 图像的尺寸从28×28 变成了32×32;
- 由于图片是黑白图像,所以ColorJitter没有看到效果。
(<PIL.Image.Image image mode=L size=32x32 at 0x7F64D6557790>, array([5]))
▲ 图1.1.1 所获得的5 数字图片
▲ 图1.1.2 将图片Resize到64×64效果
1.2 自定义数据集
对于自定义的数据集,你可以在数据集的构造函数中进行数据增强方法的定义,之后对 __getitem__
中返回的数据进行应用,就可以完成自定义数据增强。
import paddle
from paddle.io import Dataset
from paddle.vision.transforms import Compose, Resize
BATCH_SIZE = 64
BATCH_NUM = 20
IMAGE_SIZE = (28, 28)
CLASS_NUM = 10
class MyDataset(Dataset):
def __init__(self, num_samples):
super(MyDataset, self).__init__()
self.num_samples = num_samples
# 在 `__init__` 中定义数据增强方法,此处为调整图像大小
self.transform = Compose([Resize(size=32)])
def __getitem__(self, index):
data = paddle.uniform(IMAGE_SIZE, dtype='float32')
# 在 `__getitem__` 中对数据集使用数据增强方法
data = self.transform(data.numpy())
label = paddle.randint(0, CLASS_NUM-1, dtype='int64')
return data, label
def __len__(self):
return self.num_samples
# 测试定义的数据集
custom_dataset = MyDataset(BATCH_SIZE * BATCH_NUM)
print('=============custom dataset=============')
for data, label in custom_dataset:
print(data.shape, label.shape)
break
=============custom dataset=============
(32, 32) [1]
1.3 直接对图片操作
从 【1.2:自定义数据集】给出的示例程序可以看出:
- 是可以直接对于图片数据应用 paddle.vision.transforms中的各种处理方法。
- 如果将图片预处理放置在MyDataset中 getitme 进行处理,这样会在生成训练数据集合的时候每次都重复调用这些数据预处理,这会降低网络训练速度。对于数据预处理应该放置在MyDataset中的外部进行。
1.3.1 测试图片
import cv2
picfile = '/home/aistudio/data/211217153712.BMP'
img = cv2.imread(picfile).T[::-1].T
plt.figure(figsize=(10,8))
plt.imshow(img)
plt.show()
▲ 图1.3.1 测试图片
1.3.2 不同的图片预处理方法
(1)Resize
from paddle.vision.transforms import Compose,Resize,ColorJitter
img1 = Resize(size=32)(img)
plt.figure(figsize=(10,8))
plt.imshow(img1)
plt.show()
▲ 图1.3.2 Resize(32)之后处理的效果
(2)ColorJitter
img1 = ColorJitter()(img)
ColorJitter处理后的效果,没有看出什么效果.
▲ 图1.3.3 ColorJitter处理后的效果,没有看出什么效果
(3)hflip,vflip
from paddle.vision.transforms import Compose,Resize,ColorJitter
from paddle.vision import transforms as PVT
img1 = PVT.hflip(img)
plt.figure(figsize=(10,8))
plt.imshow(img1)
plt.show()
vflip处理后的图像效果
▲ 图1.3.4 vflip处理后的图像效果
hflip处理后的效果。
▲ 图1.3.5 hflip处理后的效果
(4)rotate
img1 = PVT.rotate(img, 45)
旋转之后的图片效果。
▲ 图1.3.6 旋转之后的图片效果
import paddle
from paddle.vision.transforms import Compose,Resize,ColorJitter
from paddle.vision import transforms as PVT
for id,angle in enumerate(linspace(0, 360, 20)):
img1 = PVT.rotate(img, angle)
plt.figure(figsize=(10,8))
plt.imshow(img1)
plt.savefig('/home/aistudio/work/GIF/%d.jpg'%id)
plt.show()
▲ 图1.3.7 旋转的图片
※ 总 结 ※
尽管我们可以通过 下面命令获得paddle.vision.transforms中的所有的函数。那么这些函数的具体使用说明如何能够获得呢?
2.1 附录
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import paddle
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2021-12-17
#
# Note:
#============================================================
from headm import * # =
import paddle
#printf('Dataset process all method: '.format(paddle.vision.transforms.__all__))
#------------------------------------------------------------
from paddle.vision.transforms import Compose,Resize,ColorJitter
transform = Compose([ColorJitter(), Resize(size=64)])
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
#train_dataset = paddle.vision.datasets.MNIST(mode='train')
#train_dataset = paddle.vision.datasets.Cifar10(mode='train', transform=transform)
#train_dataset = paddle.vision.datasets.Cifar10(mode='train')
#------------------------------------------------------------
data = train_dataset[0]
printf(data)
plt.imshow(data[0])
plt.show()
#------------------------------------------------------------
import cv2
picfile = '/home/aistudio/data/211217153712.BMP'
img = cv2.imread(picfile).T[::-1].T
plt.figure(figsize=(10,8))
plt.imshow(img)
plt.show()
#------------------------------------------------------------
import paddle
from paddle.vision.transforms import Compose,Resize,ColorJitter
from paddle.vision import transforms as PVT
img1 = PVT.RandomCrop(0.2, img)
plt.imshow(img1)
#------------------------------------------------------------
for id,angle in enumerate(linspace(0, 360, 20)):
img1 = PVT.rotate(img, angle)
plt.figure(figsize=(10,8))
plt.imshow(img1)
plt.savefig('/home/aistudio/work/GIF/%d.jpg'%id)
plt.show()
#------------------------------------------------------------
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
■ 相关文献链接:
● 相关图表链接:
以上是关于训练图像预处理函数功能(paddle)的主要内容,如果未能解决你的问题,请参考以下文章
分布式训练---单机多卡与多机多卡组网(飞桨paddle2.0+)更加推荐spawn方式!
百度端侧推理引擎 Paddle Lite 新增 ARM 端图像预处理库