图像类型错误导致执行报错:TypeError: img should be PIL image or NumPy array. Got <class 'list'>.

1. 系统环境

硬件环境(Ascend/GPU/CPU): GPU
软件环境: MindSpore 版本: 1.7.0
执行模式: 动态图(PYNATIVE_MODE) – Python 版本: 3.7.6
操作系统平台: linux

2. 报错信息

2.1 问题描述

图像的类型应该是PIL image or NumPy array,但传入的是list类型的,导致执行报错。

2.2 报错信息

TypeError: img should be PIL image or NumPy array. Got <class 'list'>.

2.3 脚本代码

if __name__ == '__main__':

    inputs = AFR.load_data('opencv_photo/input/')
    targets = AFR.load_data('opencv_photo/target/')
    adversarial = AFR.Attack(inputs, targets)
    attack_method = "non-target attack"
    adversarial_tensor, mask_tensor  = adversarial.train(attack_method)


class Attack(object):
    def __init__(self,input_img,target_img,seed=None):
        if (seed != None): np.random.seed(seed)
        self.MEAN = Tensor([0.485, 0.456, 0.406])
        self.STD = Tensor([0.229, 0.224, 0.225])
        self.LOSS = Tensor(0)
        self.expand_dims = mindspore.ops.ExpandDims()
        self.imageize = ToPILImage()
        self.tensorize = ToTensor()
        self.normalize = P.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
        self.resnet = get_net()
        self.input_tensor = Tensor(self.normalize(self.tensorize(input_img)))
        self.target_tensor = Tensor(self.normalize(self.tensorize(target_img)))

3. 根因分析

看报错信息,翻译的意思是img应该是PIL图像或NumPy数组。而不应该是list类型。定位到错误代码行self.input_tensor = Tensor(self.normalize(self.tensorize(input_img))),说明是传入的input_img类型有问题。
调试发现input_img类型是list。
查看生成input_img的函数,发现input_img是被保存在一个列表中,所以处理图片时需要将list里面的图像拿出来。

4. 解决方案

解决方案说明:把图像从list中取出。
修改后代码:

if __name__ == '__main__':

    inputs = AFR.load_data('opencv_photo/input/')
    targets = AFR.load_data('opencv_photo/target/')
    adversarial = AFR.Attack(inputs[0], targets[0])
    attack_method = "non-target attack"
    adversarial_tensor, mask_tensor  = adversarial.train(attack_method)

inputs[0], targets[0],即是从列表中取出具体的图片。
修改后正常运行。