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 .
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],即是从列表中取出具体的图片。
修改后正常运行。