8.1.4 噪声对鲁棒性的影响
第4章介绍了机器视觉领域常见的几种噪声,比如高斯噪声和椒盐噪声。下面我们结合实际的例子来介绍高斯噪声和椒盐噪声对鲁棒性的影响,对应的代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/8-
case4-cw.ipynb
首先使用cw算法生成对抗样本,定向攻击目标标签为288,要求概率大于80%。
skimage库提供了skimage.util.random_noise函数用于增加噪声。
skimage.util.random_noise(image, mode=’gaussian’, seed=none, clip=true,
**kwargs)
其中主要参数的含义如下。
? image:原始图像。
? mode:叠加噪声的类型,常用的类型包括gaussian、salt、pepper和s & p。
? seed:随机数种子。
? clip:表示是否截断超出范围的值,默认为true。
? amount:噪声点的比例,默认为0.05。
当使用高斯噪声时,还可以设置均值mean和方差var,默认均值为0,方差为0.01。需要特别指出的是,该函数的返回值是归一化后的图像数据。
如图8-15所示,针对熊猫图像分别叠加均值为0,标准差为0.05、0.10和0.15的高斯噪声,可见均值一定时,方差越大噪声效果越明显,图像越难分辨。
import skimage
from scipy import *
from matplotlib import pyplot as plt
img=cv2.imread("../picture/cropped_panda.jpg")
img=cv2.cvtcolor(img, cv2.color_bgr2rgb)
img1=img.copy()
img2=img.copy()
img2=skimage.util.random_noise(img2, mode="gaussian", seed=none,
clip=true,mean=0,var=0.05**2)
img3=img.copy()
img4=img.copy()
img3=skimage.util.random_noise(img3, mode="gaussian", seed=none,
clip=true,mean=0,var=0.10**2)
img4=skimage.util.random_noise(img4, mode="gaussian", seed=none,
clip=true,mean=0,var=0.15**2)
图8-15 高斯噪声叠加效果示例
下面我们在对抗样本上叠加高斯噪声,均值为0,标准差调整范围为0.01到0.20,每次增加0.01,并记录下标准差的值和对抗样本预测为熊猫及定向攻击目标的概率。
#验证高斯噪声对于对抗样本的影响
import skimage
#标准差调整范围为0.01到0.20
std_range = np.arange(0.01,0.20,0.01)
adv_288_pro = []
adv_388_pro = []
for i in std_range:
#记录下标准差的值和对抗样本预测为熊猫及定向攻击目标的概率
gaussian_img=skimage.util.random_noise(adv.copy(), mode="gaussian",
seed=none, clip=true,mean=0,var=i**2)
pro_388=infer_img(gaussian_img.copy()*256.0,388)
pro_288=infer_img(gaussian_img.copy()*256.0,288)
print("std={} pro[388]={} pro[288]={}".format(i,pro_388,pro_288))
adv_288_pro += [pro_288]
adv_388_pro += [pro_388]
#横轴代表高斯噪声标准差的值,纵轴代表预测概率
#实线代表对抗样本预测为熊猫的概率,虚线代表对抗样本预测为定向攻击目标的概率
fig, ax = plt.subplots()
ax.plot(np.array(std_range), np.array(adv_288_pro), 'b--', label=
'probability of class 288')
ax.plot(np.array(std_range), np.array(adv_388_pro), 'r', label='probability
of class 388')
legend = ax.legend(loc='best', shadow=true, fontsize='large')
legend.get_frame().set_facecolor('#ffffff')
plt.xlabel('std range')
plt.ylabel('probability')
plt.show()
如图8-16所示,横轴代表高斯噪声标准差的值,纵轴代表预测概率,实线代表对抗样本预测为熊猫的概率,虚线代表对抗样本预测为定向攻击目标的概率。我们假设概率大于50%时,分类结果可信,可见在该案例中,高斯噪声的标准差大于0.01时,对抗样本定向攻击失效。当高斯噪声的标准差大于0.25时,对抗样本预测为定向攻击的目标的概率几乎为0。当亮度调整范围大于约0.01并且小于0.1时,模型可以把对抗样本识别为熊猫,没有被欺骗。
下面我们在原始图像和对抗样本上均叠加高斯噪声,均值为0,标准差调整范围为0.01到0.20,每次增加0.01,并记录下标准差的值和预测为熊猫对应标签的概率。
import matplotlib.pyplot as plt
import skimage
#综合分析高斯噪声对于对抗样本和正常图片分类的影响
std_range = np.arange(0.01,0.20,0.01)
original_pro = []
adv_pro = []
for i in std_range:
gaussian_adv_img=skimage.util.random_noise(adv.copy(), mode="gaussian",
seed=none, clip=true,mean=0,var=i**2)
pro_388=infer_img(gaussian_adv_img.copy()*256.0,388)
adv_pro+= [pro_388]
gaussian_img=skimage.util.random_noise(orig.copy(), mode="gaussian",
seed=none, clip=true,mean=0,var=i**2)
pro=infer_img(gaussian_img.copy()*256.0,388)
original_pro += [pro]
print("std={} adv_pro[388]={} original_pro[388]={}".format(i,pro_388,pro))
#横轴代表高斯噪声的标准差的值,纵轴代表预测概率
#实线代表原始图片预测为熊猫的概率,虚线代表对抗样本预测为熊猫的概率
fig, ax = plt.subplots()
ax.plot(np.array(std_range), np.array(adv_pro), 'b--', label='probability
of adversarial')
ax.plot(np.array(std_range), np.array(original_pro), 'r', label='probability
of original')
legend = ax.legend(loc='best', shadow=true, fontsize='large')
legend.get_frame().set_facecolor('#ffffff')
plt.xlabel('std range')
plt.ylabel('probability')
plt.show()
图8-16 高斯噪声对对抗样本的鲁棒性影响示例(cw算法)
如图8-17所示,横轴代表高斯噪声的标准差的值,纵轴代表预测概率,实线代表原始图片预测为熊猫的概率,虚线代表对抗样本预测为熊猫的概率。我们假设概率大于50%时,分类结果可信,可见在该案例中,当高斯噪声的标准差大于0.01且小于0.08时,可以兼顾对抗样本和正常图片的识别,对抗样本和原始图片被识别为熊猫的概率均大于50%。
图8-17 高斯噪声对对抗样本和原始图片的鲁棒性影响示例(cw算法)
下面我们来看下椒盐噪声的情况。如图8-18所示,针对熊猫图像分别叠加比例为5%、10%和20%的均值和标准差为默认值的椒盐噪声,可见比例越大噪声效果越明显,图像越难分辨。
#演示增加椒盐噪声
import numpy as np
import cv2
import skimage
from scipy import *
from matplotlib import pyplot as plt
img=cv2.imread("../picture/cropped_panda.jpg")
img=cv2.cvtcolor(img, cv2.color_bgr2rgb)
img1=img.copy()
img2=img.copy()
img2=skimage.util.random_noise(img2, mode="s&p", seed=none,
clip=true,amount=0.05)
img3=img.copy()
img4=img.copy()
img3=skimage.util.random_noise(img3, mode="s&p", seed=none,
clip=true,amount=0.10)
img4=skimage.util.random_noise(img4, mode="s&p", seed=none,
clip=true,amount=0.20)
图8-18 椒盐噪声叠加演示效果
下面我们在对抗样本上叠加椒盐噪声,均值和标准差为默认值,椒盐噪声占原始图像的比例调整范围为0.1%到2%,每次增加0.1%,并记录下椒盐噪声的比例和对抗样本预测为熊猫和定向攻击目标的概率。
#验证椒盐噪声对于对抗样本的影响
import skimage
std_range = np.arange(0.001,0.02,0.001)
adv_288_pro = []
adv_388_pro = []
#椒盐噪声占原始图像的比例调整范围为0.1%到2%,每次增加0.1%
for i in std_range:
sp_img=skimage.util.random_noise(adv.copy(), mode="s&p", seed=none,
clip=true,amount=i)
pro_388=infer_img(sp_img.copy()*256.0,388)
pro_288=infer_img(sp_img.copy()*256.0,288)
print("std={} pro[388]={} pro[288]={}".format(i,pro_388,pro_288))
adv_288_pro += [pro_288]
adv_388_pro += [pro_388]
#横轴代表椒盐噪声标准差的值,纵轴代表预测概率
#实线代表对抗样本预测为熊猫的概率,虚线代表对抗样本预测为定向攻击目标的概率
fig, ax = plt.subplots()
ax.plot(np.array(std_range), np.array(adv_288_pro), 'b--', label=
'probability of class 288')
ax.plot(np.array(std_range), np.array(adv_388_pro), 'r', label='probability
of class 388')
legend = ax.legend(loc='best', shadow=true, fontsize='large')
legend.get_frame().set_facecolor('#ffffff')
plt.xlabel('amount range')
plt.ylabel('probability')
plt.show()
如图8-19所示,横轴代表椒盐噪声标准差的值,纵轴代表预测概率,实线代表对抗样本预测为熊猫的概率,虚线代表对抗样本预测为定向攻击目标的概率。我们假设概率大于50%时,分类结果可信,可见在该案例中,椒盐噪声的比例大于0.25%时,对抗样本定向攻击失效,且对抗样本预测为定向攻击目标的概率几乎为0。当比例调整范围小于1%时,模型可以把对抗样本识别为熊猫,没有被欺骗。
图8-19 椒盐噪声对对抗样本的鲁棒性影响示例(cw算法)
下面我们在原始图像和对抗样本上叠加椒盐噪声,均值和标准差为默认值,椒盐噪声的占原始图像的比例调整范围为0.1%到2%,每次增加0.1%,并记录下标准差的值和预测为熊猫对应标签的概率。
import matplotlib.pyplot as plt
import skimage
#综合分析椒盐噪声对于对抗样本和正常图片分类的影响
std_range = np.arange(0.001,0.02,0.001)
original_pro = []
adv_pro = []
for i in std_range:
sp_adv_img=skimage.util.random_noise(adv.copy(), mode="s&p", seed=none,
clip=true,amount=i)
pro_388=infer_img(sp_adv_img.copy()*256.0,388)
adv_pro+= [pro_388]
sp_img=skimage.util.random_noise(orig.copy(), mode="s&p", seed=none,
clip=true,amount=i)
pro=infer_img(sp_img.copy()*256.0,388)
original_pro += [pro]
print("amount={} adv_pro[388]={}
original_pro[388]={}".format(i,pro_388,pro))
#横轴代表椒盐噪声的比例,纵轴代表预测概率
#实线代表原始图片预测为熊猫的概率,虚线代表对抗样本预测为熊猫的概率
fig, ax = plt.subplots()
ax.plot(np.array(std_range), np.array(adv_pro), 'b--', label='probability
of adversarial')
ax.plot(np.array(std_range), np.array(original_pro), 'r', label='probability
of original')
legend = ax.legend(loc='best', shadow=true, fontsize='large')
legend.get_frame().set_facecolor('#ffffff')
plt.xlabel('amount range')
plt.ylabel('probability')
plt.show()
如图8-20所示,横轴代表椒盐噪声的比例,纵轴代表预测概率,实线代表原始图片预测为熊猫的概率,虚线代表对抗样本预测为熊猫的概率。我们假设概率大于50%时,分类结果可信,可见在该案例中,当椒盐噪声比例大于0.2%且小于1.0%时,可以兼顾对抗样本和正常图片的鉴别,对抗样本和原始图片被识别为熊猫的概率均大于50%。
图8-20 椒盐噪声对对抗样本和原始图片的鲁棒性影响示例(cw算法)