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算法)

章节目录

智能系统与技术丛书·AI安全之对抗样本入门所有内容均来自互联网,一曲书屋只为原作者兜哥的小说进行宣传。欢迎各位书友支持兜哥并收藏智能系统与技术丛书·AI安全之对抗样本入门最新章节