pytorch 通过Image.split()将CUB_200图像的BGR转换为RGB

fhg3lkii  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(185)

我正在从CUB_200创建PyTorch数据集和数据加载器。当将图像作为药丸读取时,我需要将BGR通道更改为RGB,并使用以下代码:

def _read_images_from_list(imagefile_list):

   imgs = []
   mean=[0.485, 0.456, 0.406]
   std= [0.229, 0.224, 0.225]

   Transformations = transforms.Compose([transforms.Resize([224, 224]), transforms.ToTensor(), transforms.Normalize(mean, std)])

   for imagefile in imagefile_list:
      # read images as PIL instead of NUMPY
      img = Image.open(imagefile)
      b, g, r = img.split()
      img = Image.merge("RGB", (r, g, b))
   
      img = Transformations(img) # ToTensor and between [0,1], then normalized using image net mean and std, then transposed into shape (C,H,W)

     imgs += [img]
return imgs

在经历了许多类之后,我得到了以下错误。

ValueError: not enough values to unpack (expected 3, got 1)

我想知道我现在该怎么办?这意味着其中一个图像只有一个通道,而不是一个。是不是这种情况,或者我的代码有问题?我以前有一个不同的实现,但它的工作。我改变这个实现的原因是我不能规范化我的图像。这是旧的实现:

def _read_images_from_list(imagefile_list):
  imgs = []
  for imagefile in imagefile_list:
    
    img = cv2.imread(imagefile).astype(np.float32)
    img = cv2.resize(img, (224, 224))
    # Convert RGB to BGR
    img_r, img_g, img_b = np.split(img, 3, axis=2)
    img = np.concatenate((img_b, img_g, img_r), axis=2)
    # Extract mean
    img -= np.array((103.94,116.78,123.68), dtype=np.float32)  # BGR mean
    
    # HWC -> CHW, compatible with pytorch
    img = np.transpose(img, [2, 0, 1])
    imgs += [img]
return imgs
w46czmvw

w46czmvw1#

我强烈建议你使用skimage.io来加载图像,而不是opencv。它默认以RGB格式打开图像,这样就消除了你的洗牌开销,但是如果你想将BGR转换为RGB,你可以使用:

import numpy as np

img = np.arange(27).reshape(3,3,3)
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]

rgb = np.dstack([r,g,b])

print(img)
print("#"*20)
print(rgb)

相关问题