获得数据集是深度学习代码的首要步骤。下面我们使用相同的场景对PIL、cv2、Dataloader进行比较。
假设图像处于/single_images/images/目录下,尺寸64x64x3。
import numpy as np
import os
import matplotlib.pyplot as plt
1.PIL
from PIL import Imageimages = os.listdir('./single_images/images/')
length = len(images)
for i in range(length):img = Image.open('./single_images/images/' + images[i]) img0 = np.asarray(img,dtype='float32')
使用PIL得到的img0尺寸是(64x64x3),通道为RGB,取值范围0-255。
print(np.max(img0))
print(np.min(img0))
print(img0.shape)
2.DataLoader
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torchvision.datasets import ImageFoldertransform = transforms.ToTensor()
dataset = ImageFolder('single_images',transform=transform)
dataloader = DataLoader(dataset, batch_size=4, shuffle=False, num_workers=0, drop_last=True)
for i,data in enumerate(dataloader): print(i)real, _ = data for j in range(real.size()[0]):img_ = real[j,:,:,:] img1 = np.array(img_)
使用DataLoader得到的img1尺寸是(3x64x64),通道为RGB,适用于pytorch卷积的尺寸。取值范围是0-1。
print(img_.min())
print(img_.max())
print(img_.size())
3.cv2
import cv2
images = os.listdir('./single_images/images/')
length = len(images)for i in range(length):img = cv2.imread('./single_images/images/' + images[i])
img2 = np.asarray(img,dtype='float32') img2 = img2[...,::-1] img2 = np.asarray(img2,dtype='float32')
使用cv2得到的img2尺寸是(64x64x3),通道为BGR,取值范围0-255。
print(np.max(img2))
print(np.min(img2))
print(img2.shape)
PIL/DataLoader/cv2三者关系
1.PIL和DataLoader:
将img0和img1进行对比:
img0 = np.transpose(img0,(2,0,1))
img00 = img0/255
sum(sum(sum(img00-img1)))
可以看出,**PIL的图像转为(3x64x64)之后再除以255归一化,就和DataLoader的像素是一样的。**所以,如果要训练图片,首选是DataLoader,输出类型就是归一化的tensor,而PIL改变尺寸再归一化变成tensor之后也是一样的。
2.PIL和cv2:
都是(64x64x3),但是RGB的顺序不同,对cv2的结果进行转换:
img2 = img2[...,::-1]
sum(sum(sum(img2-img0)))
发现PIL和cv2结果的像素值存在部分差异。
4.plt
最后说显示的plt
输入的尺寸应该是(3x64x64)的。所以对于cv2和PIL都是不需要转换尺寸的。但是cv2需要转换通道顺序为RGB。