训练图像预处理函数功能(paddle)

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了训练图像预处理函数功能(paddle)相关的知识,希望对你有一定的参考价值。

简 介: 尽管我们可以通过 下面命令获得paddle.vision.transforms中的所有的函数。那么这些函数的具体使用说明如何能够获得呢?

关键词 数据预处理paddlevisiontransforms

数据预处理
文章目录
飞桨框架内
置数据集
自定义数据集
直接对图片操作
总 结
附录

 

§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 端图像预处理库

PyTorch 和Albumentations 在图像分割的应用

深度学习中图片数据增强方法

MixNet实战:使用MixNet实现图像分类

MaxViT实战:使用MaxViT实现图像分类任务