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],即是从列表中取出具体的图片。

修改后正常运行。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐