前言
数据处理是ai算法工程师的基本功,一般数据可以分图片,语音,文本,以及结构化数据等等,数据的修改,清洗、增强以及不同采样都能直接影响模型的最终结果。
本章主要讲解paddlepaddle在图像数据处理方面的知识。
paddlepaddle图像处理
在paddle中有很好的图像处理,虽然其底层封装基本也是PIL库或者opencv。
其主要函数为paddle.vision.transforms,具体的处理方法如下:
import paddle
print('图像数据处理方法:', paddle.vision.transforms.__all__)
"""
['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']
"""
可以看到paddle里支持的图像数据处理方法相当的多,下面介绍几个经常使用的。
1.resize函数
import numpy as np
from PIL import Image
from paddle.vision.transforms import functional as F
img = (np.random.rand(256, 300, 3) * 255.).astype('uint8')
img = Image.fromarray(img)
converted_img = F.resize(img, 224)
print(converted_img.size)# (262, 224)
可以看到resize对图片进行了缩放,当高大于宽时,则被缩放到了300*(256/224)的大小即(262,224的大小)。
2.normalize函数
import numpy as np
from PIL import Image
from paddle.vision.transforms import functional as F
img = (np.random.rand(256, 300, 3) * 255.).astype('uint8')
img = Image.fromarray(img)
mean = [127.5, 127.5, 127.5]
std = [127.5, 127.5, 127.5]
normalized_img = F.normalize(fake_img, mean, std, data_format='HWC')
print(normalized_img.max(), normalized_img.min())
# 0.99215686 -1.0
normalize函数是对图片进行归一化的函数,可以看到,上述值被归一到[-1,1]的一个区间。
3.transpose函数
import numpy as np
from PIL import Image
from paddle.vision.transforms import Transpose
transform = Transpose()
img = Image.fromarray((np.random.rand(300, 320, 3) * 255.).astype(np.uint8))
img = transform(img)
print(img.shape)#(3,300,320)
transpose函数主要是将图片矩阵数据进行转置,如上述代码,将(300,320,3)的矩阵转置到(3,300,320)大小。
4.pad函数
import numpy as np
from PIL import Image
from paddle.vision.transforms import functional as F
img = (np.random.rand(256, 300, 3) * 255.).astype('uint8')
img = Image.fromarray(img)
padded_img = F.pad(img, padding=1)
print(padded_img.size)#(302, 258)
可以看到pad函数虽然设置的padding为1,但是其对图片上下左右两端均进行填充,所以最终大小变为了(302,258)。
5.center_crop函数
import numpy as np
from PIL import Image
from paddle.vision.transforms import functional as F
img = (np.random.rand(256, 300, 3) * 255.).astype('uint8')
img = Image.fromarray(img)
cropped_img = F.center_crop(img, (150, 100))
print(cropped_img.size)
# out: (100, 150) width,height
center_crop是中间裁剪,可以看到图片按我们所需的大小进行了裁剪。
6.to_tensor函数
import numpy as np
from PIL import Image
from paddle.vision.transforms import functional as F
img = (np.random.rand(256, 300, 3) * 255.).astype('uint8')
img = Image.fromarray(img)
tensor = F.to_tensor(img)
print(tensor.shape)#[3, 256, 300]
to_tensor就是将numpy或其他格式的向量转换为paddle的向量,可以看到paddle会自动将其转换为CHW的格式。
7.compose函数
from paddle.vision.datasets import Flowers
from paddle.vision.transforms import Normalize,Compose,Transpose,Resize
transform = Compose([Resize(227),Normalize(mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], data_format='HWC'),Transpose()])
用之前的举例,compose函数实际上就是将一系列图片处理的方法按顺序组合执行。
总结
在paddlepaddle里有相当多实用的图像处理方法,可供使用,可以说相当方便,简单,也能快速解决问题,当然具体情况还需具体分析,有时候手写图像处理也是必要的。