如果你对数据处理不熟悉,可以看我的上篇博客,里面介绍了常用的数据处理方法
上篇博客地址:机器学习数据处理
目录
1、pytorch加载数据集
1、加载pytorch自带的数据集
2、图像读取和保存
1、PIL读取和保存图片:
2、cv2读取和保存图片:
3、matplotlib读取和保存图片:
4、torchvision.transforms图片处理
0、class torchvision.transforms.Compose (transforms)
1、class torchvision.transforms.CenterCrop(size)
2、class torchvision.transforms.FiveCrop(size)
3、class torchvision.transforms.Grayscale(num_output_channels=1)
4、class torchvision.transforms.Pad(padding, fill=0, padding_mode=‘constant’)
5、class torchvision.transforms.RandomAffine(degrees, translate=None, scale=None)
6、class torchvision.transforms.Resize(size,interpolation=2)
7. class torchvision.transforms.ToPILImage(mode=None)
下面两个在pytorch上操作
8、class torchvision.transforms.ToTensor
9.class torchvision.transforms.Normalize(mean,std)
torch.utils.data.Dataset
使用torchvision.datasets.‘数据集’ 可以加载下面几个个数据集
处理图像的方式有三种方式,分别使用PIL, matplotlib, CV2库
读取通道顺序:RGB
数据类型:PIL,
转成numpy后的像素类型和大小:uint8, 0~255
from PIL import Image
import numpy as np
img_path = './data/1.jpg' #图片路径
#PIL读取图片
PIL_img = Image.open(img_path) #读取图片,图片是PIL数据类型
#PIL保存图片
PIL_img.save('./data/2.jpg') #
#将PIL类型转成numpy类型, numpy数组格式(H,W,C=3)
np_img = np.asanyarray(PIL_img) #将PIL类型转成numpy类型,数据类型是uint8, (H, W, C)
#用PIL显示
PIL_img.show()
#用matplotlib.pyplot显示
plt.imshow(np_img) #读取通道是RGB, 不用转换
读取通道顺序:BRG,
数据类型:ndarray
像素类型:uint8, 0~255
import cv2
import numpy as np
#cv2读取图片,读取后的类型是numpy类型的数组, 读取的通道顺序是BRG
cv2_img = cv2.imread('./data/1.jpg') #numpy数组,元素类型是uinit8 0~255
#保存图片,第二个是numpy数组或mat数组,类型是jpg或png
cv2.imwrite('D:/data/1.jpg', cv2_img) #
#CV2显示图片,只能用来显示通道顺序为BRG的numpy数组,不然产生色差
cv2.imshow('labels',cv2_img)
cv2.waitKey(0)
#matplotlib.pyplot显示
plt.imshow(cv2_img[:,:,::-1]) #读取通道是BGR,所以[:,:,::-1]将其转换成RGB格式
读取通道顺序:RGB
数据类型:ndarray
数据类型:uint8, 0~255
注:这个uint8类型好像有争议,有的人说是0~1之间,我猜测是可能是因为版本太旧才会显示float。我电脑上上显示的是uint8
import matplotlib.pyplot as plt
#读取图片,读取通道的顺序是RGB
plt_img = plt.imread('./data/1.jpg') #uint8
#保存图片
plt.imsave('D:/data/3.png', plt_img) #类型可以是jpg或png
#显示图片
plt.imshow(plt_img)
这个模块只能处理PIL类型的数据,所以图片要么用PIL.Image读取,要么将ndarray图片数据转成PIL类型,
PIL和numpy相互转换方式如下:
from PIL import Image
#PIL image转成numpy
np_img = np.asarray(PIL_img) #参数时PIL类型的图片
或
np_img = np.array(PIL_img)
#将array准成PIL image
Image.fromarray(np.uint8(np_img))
下面处理的都是PIL图片
功能:将多个transforms进行组合
transforms.Compose([
transforms.CenterCrop(10),
transforms.ToTensor(),
])
功能:图片剪切,返回图片中心区域位置
参数:size(整数或tuple), 如果是整数,将自动剪切成正方形区域(size, size)
返回值:PIL图片
#取图片的中心区域,大小是(28, 28)
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')
cc_img = transforms.CenterCrop((128, 128))(PIL_img)
功能:将给定的PIL图像剪裁成四个角落区域和中心区域,这个变换返回的是一个图像元组(tuple of images), 也就是5张PIL图片。
参数:size(整数或tuple), 如果是整数,将自动裁剪成正方形区域(size, size)
返回值:返回一个PIL元祖,里面包含五张PIL图片
#生成5张,大小是(128,128)的PIL图片
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')
fc_img = transforms.FiveCrop((128, 128))(PIL_img)
功能:将图片转成灰度图片, r=g=b
参数: num_output_channels, 只能取1或3,代表输出通道的数量
返回值:PIL图片
#生成灰度图片, R=G=B
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')
gc_img = transforms.Grayscale(1)(PIL_img)
功能:对PIL图像的边缘进行填充,填充的像素数值为fill值
参数1:填充长度padding(整数或者tuple)——总共四个边界。如果padding是整数,那么会拉伸所有边界padding个长度。如果是tuple且长度为2,那么俩个数值分别被用于拉伸left/right(宽度) 和 top/bottom(高度)。如果tuple长度是4,那么分别被用来拉伸left, top ,right 和 bottom边界。例如,尺寸为宽度120, 高度130的图片,即120 x 160的图片。如果padding是10, 那么图片将变成尺寸为130 x 170。多出的像素点全部用fill值填充。fill默认是0
参数2:fill(整数或tuple), 填充的像素值。如果是整数, 那个填充区域的R,G,B的值为fill。如果是tuple,那么R,G,B = tuple.
tuple必须包含3个元素,对应R,G,B的值。
参数3:padding_mode (string) —— 填充的类型,必须为:constant, edge, reflect or symmetric,默认为 constant.
constant: 以常量值进行填充,常量值由 fill 确定。
edge: 用图片边界最后一个值进行填充
返回值:PIL图片
#将图片的宽度拉长10*2个像素, 高度拉长15*2个像素,用20, 110, 102分别填充R,G, B通道的值
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')
pd_img = transforms.Pad((10, 15), (20, 110, 102))(PIL_img)
功能:保持中心位置不变,对图片进行仿射变换
参数1:degree (旋转,tuple或者float或者int) —— 旋转的角度范围。如果角度是数值而不是类似于(min,max)的序列,
那 么将会转换成(-degree, +degree)序列。设为0则取消旋转。
参数2:transalate (平移,tuple,可选) —— 数组,其中元素为代表水平和垂直变换的最大绝对分数。
参数3:scale (缩放,tuple, 可选) —— 缩放因子区间。若scale=(a,b), 则缩放的值在a<=scale<=b 随机采样。默认情况下 没有缩放。
参数4:shear (错切,tuple或者 float 或者 int, 可选) —— 错切的程度。如果错切的程度是一个值,那么将会转换为 序列即(—degree, +degree)。默认情况下不使用错切。
返回值:PIL图片
#图片顺时针旋转90度,随机进行平移, -0.5<水平平移动距离dx<0.5, -0.3<垂直移动距离dy<0.3, 负代表
#向左移,和向下移
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')
ra_img = transforms.RandomAffine((90, 90), (0.5, 0.3))(PIL_img)
功能:将PIL图片转换成指定尺寸大小
参数:size(tuple 或者 int) —— 需要输出的图片的大小。如果size是类似于(h,w)的序列,输出的尺寸将会跟(h,w)一致。如果size是整型,图片较小的边界将会被置为这个尺寸。例如,如果height->width, 图片将会被置为 (size*height/width, size)
返回值:PIL图片
#图片尺寸被调整为120x203
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')
rs_img = transforms.Resize((120, 203))(PIL_img)
功能:将shape为(C,H,W)的Tensor或shape为(H,W,C)的numpy.ndarray转换成PIL.Image,值不变。
返回值:PIL图片
from torchvision import transforms
#将numpy数组转成PIL图片
PIL_img = transforms.ToPILImage()(np_img)
#将tensor张量转成PIL图片
PIL_img = transforms.ToPILImage()(tensor_img)
注意:只能作用在tensor上,不能是numpy和PIL类型数据
功能:把一个取值范围是[0,255]的PIL或者shape为(H,W,C)的numpy.ndarray,转换成形状为[C,H,W],取值范围是[0,1.0]的torch.FloadTensor
返回值:tensor张量
#将PIL图片转成tensor
tensor = transforms.ToTensor()(PIL_img)
用均值和标准差对张量图像进行标准化处理。给定n通道的均值(M1, … , Mn) 和标准差(S1, … ,Sn), 这个变化将会归一化根据均值和标准差归一化每个通道值。例如,input[channel] = (input[channel]-mean[channel])/std(channel)
功能:对tensor张量的图片数据进行标准化处理
参数:均值,标准差
返回值:tensor张量
from PIL import Image
import numpy as np
import torch
from torchvision import transforms
#先将图片读取成PIL类型,再转成tensor, 再进行标准化
PIL_img = Image.open('/data/1.jpg')
tensor_img = transforms.ToTensor()(PIL_img)
tm_img = transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))(tensor_img)