从暑假开始就一直在尝试保存图片,奈何没有图像基础,尝试几天后放弃了,想着到学校后能不能问一问,开学后一直在读论文也没动手,寒假回到家开始跑实验了,而对抗样本代码整合还是不好做的,唯一好做的我认为应该是收集足够的对抗样本做实验,顺便说一下对抗样本是没有数据集的,实验数据都要自己生成,所以又回到了老问题,图像保存........
1、pytorch没有内置函数能够保存tensor格式的数据类型,需要转换
adv=(pig_tensor + delta)[0].detach().numpy()
adv表示对抗样本,pig_tensor表示原图,delta就是计算好的扰动合,detach()是报错说需要加这个,查阅后是生成了一个新的张量来保存,等于不能在原图中修改,最后numpy()是数据转换,具体来说是ndarray
2、对抗样本生成的tensor数据类型都是经过归一化后的结果,所以想要保存图像需要转回0-255
#错误代码
adv =int(adv*255)
转回0-255直接乘以255没有问题,问题出在不能进行强制转换,具体原因不清楚,一步一步试出来的。
#正确代码
adv =(adv*255)
adv=np.floor(adv)
3、考虑到范围是0-255,所以小于0或者大于255的部分要进行裁剪
#裁剪操作
adv [adv<0]=0
adv [adv>255]=255
这里不能使用if判断去做,赋值时会把所有数组都变了,最终结果如下:
4、使用cv2.imwrite函数进行保存
#保存adv图片
cv2.imwrite("/home/shao/sun/data/adv{}.jpg".format(1), adv)
到这里你以为结束了吗,依然报错:
报错查询结果如下:
很明显我的代码并不是这个问题,最后终于发现应该将CHW转为HWC,这才是opencv的最终存储格式。
转numpy那里修改一下
#转numpy
adv=(pig_tensor + delta)[0].detach().numpy().transpose(1,2,0)
[0]的意思是去除了batchsize,等于将4维变为了3维,transpose函数用于交换维度,从CHW变为HWC。
最终adv的格式:
总结
网上都说tensor格式的数据也能存,几乎试了所有方法发现还是不行,这也是暑假为什么实验无法成功的主要原因。如果想要批量保存图片,加一个for循环就好了,记得在format()里填一个变量。