8.1.2 滤波器对鲁棒性的影响
8.1.2 滤波器对鲁棒性的影响
滤波器是图像领域中非常重要的一个基础功能组件,通常用于过滤图像中的噪声。高斯滤波在相当长一段时间内都是最优秀的滤波器,但是因为噪声是高频信号,边缘、纹理也是高频信息,高斯滤波会在滤除噪声的同时使得边缘模糊,于是人们发明了双边滤波器,即bilateral filter。双边滤波器是一种典型的保边去噪的滤波器。可以滤除图像数据中的噪声,同时保留住图像的边缘、纹理等。下面我们结合实际的例子来介绍滤波器对鲁棒性的影响,对应的代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/8-
case2.ipynb
在opencv中使用bilateralfilter实现了高斯双边滤波。
bilateralfilter(src, n, sigmacolor, sigmaspace, bordertype)
其中主要参数的含义如下:
? src,输入变换前图像。
? n,过滤过程中每个像素邻域的直径范围。
? sigmacolor,颜色空间过滤器的标准差值。
? sigmaspace,坐标空间中滤波器的标准差值。
? bordertype,用于推断图像外部像素的某种边界模式,默认值为border_default。
通常可以将两个标准差的值设置成相同的值。小于10对滤波器影响很小,大于150则会对滤波器产生较大的影响。
分别对熊猫图像依次设置10、50和100的标准差进行双边滤波。
img2=cv2.bilateralfilter(orig.copy(),11,10,10)
img3=cv2.bilateralfilter(orig.copy(),11,50,50)
img4=cv2.bilateralfilter(orig.copy(),11,100,100)
如图8-6所示,双边滤波很好地保护了图像的边缘和纹理。
下面我们对原始图像进行双边滤波,每次标准差增加10,并记录下标准差和预测为熊猫对应标签的概率。
#验证原始图片对滤波器的鲁棒性
std_range = range(0,300,10)
original_pro = []
#每次标准差增加10 记录下标准差和预测为熊猫对应标签的概率
for i in std_range:
bilateralfilter_img=cv2.bilateralfilter(orig.copy(),11,i,i)
#记录熊猫的概率
pro=infer_img(bilateralfilter_img.copy(),388)
print("rotate={} pro[388]={}".format(i,pro))
original_pro += [pro]
#横轴代表双边滤波器标准差,纵轴代表预测为熊猫对应标签的概率
fig, ax = plt.subplots()
ax.plot(np.array(std_range), np.array(original_pro), 'b--',
label='probability of class 388')
legend = ax.legend(loc='best', shadow=true, fontsize='large')
legend.get_frame().set_facecolor('#ffffff')
plt.xlabel('rotate range')
plt.ylabel('probability')
plt.show()
图8-6 不同参数下双边滤波的处理效果
如图8-7所示,横轴代表双边滤波器标准差,纵轴代表预测为熊猫对应标签的概率。我们假设分类概率大于50%表示不影响分类结果,可见当标准差小于280时不影响分类结果。如果以更加严格的要求,可以认为分类概率大于80%表示不影响分类结果,标准差小于约50时不影响分类结果。
图8-7 图像分类模型对滤波器的鲁棒性影响示例
我们针对熊猫图像,使用fgsm算法生成定向攻击的对抗样本,定向攻击的目标标签为288,并且概率大于一定的阈值才认为攻击成功。下面我们把对抗样本进行双边滤波,每次标准差增加10,并记录下标准差和预测为熊猫及定向攻击目标的概率。
#验证滤波器对于对抗样本的影响
std_range = range(0,300,10)
adv_288_pro = []
adv_388_pro = []
#每次标准差增加10
for i in std_range:
bilateralfilter_img=cv2.bilateralfilter(orig.copy(),11,i,i)
#记录下标准差和预测为熊猫及定向攻击目标的概率
pro_388=infer_img(bilateralfilter_img.copy(),388)
pro_288=infer_img(bilateralfilter_img.copy(),288)
print("rotate={} 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-8所示,横轴代表双边滤波器标准差,纵轴代表预测概率,实线代表预测为熊猫的概率,虚线代表预测为定向攻击目标的概率。我们假设分类概率大于50%时结果可信,可见当标准差小于280时可以抵御对抗样本攻击,把对抗样本识别为熊猫。如果以更加严格的要求,可以认为分类概率大于80%表示不影响分类结果,标准差小于50时可以抵御对抗样本攻击,把对抗样本识别为熊猫。
那么是否存在一种方式,经过滤波后,既不影响对原始图像的分类,又可以抵御对抗样本的影响呢?下面我们把对抗样本和原始图片均进行双边滤波,每次标准差增加10,并记录下标准差和预测为熊猫的概率。
#综合分析滤波器对于对抗样本和正常图片分类的影响
std_range = range(0,300,10)
original_pro = []
adv_pro = []
for i in std_range:
#记录下标准差和预测为熊猫的概率
bilateralfilter_adv_img=cv2.bilateralfilter(adv.copy(),11,i,i)
pro_388=infer_img(bilateralfilter_adv_img.copy(),388)
adv_pro+= [pro_388]
bilateralfilter_img=cv2.bilateralfilter(orig.copy(),11,i,i)
pro=infer_img(bilateralfilter_img.copy(),388)
original_pro += [pro]
print("rotate={} 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-8 滤波器对于对抗样本的鲁棒性影响示例(fgsm算法)
如图8-9所示,横轴代表双边滤波器标准差,纵轴代表预测概率,实线代表原始图像预测为熊猫的概率,虚线代表对抗样本预测为熊猫的概率。我们假设分类概率大于50%时结果可信,那么可以认为当双边滤波器标准差大于50且小于280时,原有模型可以有效抵御定向攻击样本,同时不影响正常图像分类。
使用攻击强度更高的cw算法重复以上攻击,如图8-10所示,结果相同。
图8-9 滤波器对原始图像和对抗样本的鲁棒性影响示例(fgsm算法)
图8-10 滤波器对原始图像和对抗样本的鲁棒性影响示例(cw算法)
滤波器是图像领域中非常重要的一个基础功能组件,通常用于过滤图像中的噪声。高斯滤波在相当长一段时间内都是最优秀的滤波器,但是因为噪声是高频信号,边缘、纹理也是高频信息,高斯滤波会在滤除噪声的同时使得边缘模糊,于是人们发明了双边滤波器,即bilateral filter。双边滤波器是一种典型的保边去噪的滤波器。可以滤除图像数据中的噪声,同时保留住图像的边缘、纹理等。下面我们结合实际的例子来介绍滤波器对鲁棒性的影响,对应的代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/8-
case2.ipynb
在opencv中使用bilateralfilter实现了高斯双边滤波。
bilateralfilter(src, n, sigmacolor, sigmaspace, bordertype)
其中主要参数的含义如下:
? src,输入变换前图像。
? n,过滤过程中每个像素邻域的直径范围。
? sigmacolor,颜色空间过滤器的标准差值。
? sigmaspace,坐标空间中滤波器的标准差值。
? bordertype,用于推断图像外部像素的某种边界模式,默认值为border_default。
通常可以将两个标准差的值设置成相同的值。小于10对滤波器影响很小,大于150则会对滤波器产生较大的影响。
分别对熊猫图像依次设置10、50和100的标准差进行双边滤波。
img2=cv2.bilateralfilter(orig.copy(),11,10,10)
img3=cv2.bilateralfilter(orig.copy(),11,50,50)
img4=cv2.bilateralfilter(orig.copy(),11,100,100)
如图8-6所示,双边滤波很好地保护了图像的边缘和纹理。
下面我们对原始图像进行双边滤波,每次标准差增加10,并记录下标准差和预测为熊猫对应标签的概率。
#验证原始图片对滤波器的鲁棒性
std_range = range(0,300,10)
original_pro = []
#每次标准差增加10 记录下标准差和预测为熊猫对应标签的概率
for i in std_range:
bilateralfilter_img=cv2.bilateralfilter(orig.copy(),11,i,i)
#记录熊猫的概率
pro=infer_img(bilateralfilter_img.copy(),388)
print("rotate={} pro[388]={}".format(i,pro))
original_pro += [pro]
#横轴代表双边滤波器标准差,纵轴代表预测为熊猫对应标签的概率
fig, ax = plt.subplots()
ax.plot(np.array(std_range), np.array(original_pro), 'b--',
label='probability of class 388')
legend = ax.legend(loc='best', shadow=true, fontsize='large')
legend.get_frame().set_facecolor('#ffffff')
plt.xlabel('rotate range')
plt.ylabel('probability')
plt.show()
图8-6 不同参数下双边滤波的处理效果
如图8-7所示,横轴代表双边滤波器标准差,纵轴代表预测为熊猫对应标签的概率。我们假设分类概率大于50%表示不影响分类结果,可见当标准差小于280时不影响分类结果。如果以更加严格的要求,可以认为分类概率大于80%表示不影响分类结果,标准差小于约50时不影响分类结果。
图8-7 图像分类模型对滤波器的鲁棒性影响示例
我们针对熊猫图像,使用fgsm算法生成定向攻击的对抗样本,定向攻击的目标标签为288,并且概率大于一定的阈值才认为攻击成功。下面我们把对抗样本进行双边滤波,每次标准差增加10,并记录下标准差和预测为熊猫及定向攻击目标的概率。
#验证滤波器对于对抗样本的影响
std_range = range(0,300,10)
adv_288_pro = []
adv_388_pro = []
#每次标准差增加10
for i in std_range:
bilateralfilter_img=cv2.bilateralfilter(orig.copy(),11,i,i)
#记录下标准差和预测为熊猫及定向攻击目标的概率
pro_388=infer_img(bilateralfilter_img.copy(),388)
pro_288=infer_img(bilateralfilter_img.copy(),288)
print("rotate={} 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-8所示,横轴代表双边滤波器标准差,纵轴代表预测概率,实线代表预测为熊猫的概率,虚线代表预测为定向攻击目标的概率。我们假设分类概率大于50%时结果可信,可见当标准差小于280时可以抵御对抗样本攻击,把对抗样本识别为熊猫。如果以更加严格的要求,可以认为分类概率大于80%表示不影响分类结果,标准差小于50时可以抵御对抗样本攻击,把对抗样本识别为熊猫。
那么是否存在一种方式,经过滤波后,既不影响对原始图像的分类,又可以抵御对抗样本的影响呢?下面我们把对抗样本和原始图片均进行双边滤波,每次标准差增加10,并记录下标准差和预测为熊猫的概率。
#综合分析滤波器对于对抗样本和正常图片分类的影响
std_range = range(0,300,10)
original_pro = []
adv_pro = []
for i in std_range:
#记录下标准差和预测为熊猫的概率
bilateralfilter_adv_img=cv2.bilateralfilter(adv.copy(),11,i,i)
pro_388=infer_img(bilateralfilter_adv_img.copy(),388)
adv_pro+= [pro_388]
bilateralfilter_img=cv2.bilateralfilter(orig.copy(),11,i,i)
pro=infer_img(bilateralfilter_img.copy(),388)
original_pro += [pro]
print("rotate={} 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-8 滤波器对于对抗样本的鲁棒性影响示例(fgsm算法)
如图8-9所示,横轴代表双边滤波器标准差,纵轴代表预测概率,实线代表原始图像预测为熊猫的概率,虚线代表对抗样本预测为熊猫的概率。我们假设分类概率大于50%时结果可信,那么可以认为当双边滤波器标准差大于50且小于280时,原有模型可以有效抵御定向攻击样本,同时不影响正常图像分类。
使用攻击强度更高的cw算法重复以上攻击,如图8-10所示,结果相同。
图8-9 滤波器对原始图像和对抗样本的鲁棒性影响示例(fgsm算法)
图8-10 滤波器对原始图像和对抗样本的鲁棒性影响示例(cw算法)