Towards Adversarially Robust Object Detection 论文笔记

2023-05-16

前言

许多工作证明分类器在面对对抗攻击(adversarial attack)时是非常脆弱的,比如有一种对抗样本,它只对原图进行很轻微地修改,但是在视觉上与原图相比是完全不同的。因此也有很多工作致力于提升分类器的鲁棒性。

最近的一些工作发现,目标检测器也会由于蓄意设计的输入而受到攻击,如下图所示,展示了标准检测器和鲁棒性更强的检测器分别检测clean和adversarial图像的效果,可以看到,标准检测器在检测adversarial图像时,检测结果非常糟糕,而鲁棒性更强的检测器在检测adversarial图像时可以得到合理的检测结果。
在这里插入图片描述

由于目标检测在监控和自动驾驶上的重要性,找出能够使目标检测器免受各种对抗攻击的方法是非常重要的。虽然很多工作证明攻击检测器是可行的,但仍不清楚能否提升检测器的鲁棒性。本文通过将对抗训练框架从分类泛化到检测上,来提高目标检测器面对不同类型的攻击时的鲁棒性,并提出实现这一目标的可行方法。

本文的贡献如下:

  • 对目标检测器的不同攻击进行分类与分析,找出它们的共同之处;
  • 强调并分析了不同的任务损失函数之间的相互作用,以及它们对检测器鲁棒性的影响;
  • 将对抗训练框架从分类泛化到检测上,提出一种对抗训练方法来处理任务损失函数之间的相互影响,以提升检测器的鲁棒性。

目标检测的任务损失函数

一个目标检测器将图像 x ∈ [ 0 , 255 ] n x \in [0,255]^n x[0,255]n作为输入,输出的是 K K K个检测到的目标,每个目标由 p k p_k pk b k b_k bk表示,即 f ( x ) → { p k , b k } k = 1 K f(x) \to \lbrace p_k,b_k \rbrace^K_{k=1} f(x){pk,bk}k=1K,其中 p k p_k pk是对于 C C C个类别的概率向量, b k = [ x k , y k , w k , h k ] b_k=[x_k,y_k,w_k,h_k] bk=[xk,yk,wk,hk]是bbox,最后通过NMS操作来得到最终的检测结果。损失函数为:
在这里插入图片描述
其中 { y k , b k } \lbrace y_k,b_k \rbrace {yk,bk}表示gt, x x x是输入图像,用 θ \theta θ对检测器 f ( ⋅ ) f(\cdot) f()进行参数化,那么检测器的训练就可以归结为 θ \theta θ的估计值。 L ( ⋅ ) L(\cdot) L()就是损失函数,它衡量的是输出 f θ ( ⋅ ) f_{\theta}(\cdot) fθ()和gt之间的不同,其最小值对应最合适的 θ \theta θ,这个损失函数可以表示为分类损失和定位损失的结合:
在这里插入图片描述
可以看到,分类和定位任务共享了一些中间计算,但是它们使用输出 f θ ( ⋅ ) f_{\theta}(\cdot) fθ()的不同部分来分别计算各自的损失,这可以作为多任务学习的一个实例。


目标检测中的攻击

对于目标检测来说,有许多不同的攻击方法,但从多任务学习这个角度来看的话,它们的框架和设计原则是相同的:通过利用单个任务损失函数的变体或其组合来实现对检测器的攻击。根据这个思路,本文将攻击方法进行分类,如下表所示,可以看到,有些方法使用的是分类损失,有些方法使用的是分类损失和定位损失的结合。
在这里插入图片描述
单个任务损失函数对生成攻击的有效性有以下两个方面:

  • 分类和定位任务共享同一个base-net,也就是说base-net的弱点也会由其上的所有任务共享;
  • 虽然分类和定位的输出是在base-net 上的两个不同的分支,但是由于测试阶段的NMS操作使它们又被耦合到一起,即使用类别分数和bbox定位来去除多余的检测结果,如下图所示:
    在这里插入图片描述

任务损失函数对鲁棒性的影响

由于分类和定位任务共享同一个base-net,因此这两个任务之间不可避免地会产生相互影响,接下来从不同的角度来分析任务损失函数对模型鲁棒性的影响。

1. 任务损失函数的相互影响

不同的任务会相互影响,针对一个任务进行的对抗攻击可能会降低模型在另一个任务上的性能。

为了说明这一点,本文在研究一个因素的同时会边际化另一个因素。比如,当考虑分类时,会忽视定位这一因素,那么问题就会变成多标签分类任务;当考虑定位时,会忽视分类这一因素,那么就变成与类别无关的目标检测问题。由于NMS操作也会使分类和定位耦合,因此只观察输出结果在经过NMS操作之前的模型的性能。如果anchor box与任意一个gt的IoU大于0.5,那么该anchor box就是正样本,也就是前景。对于分类任务,计算的是anchor box的分类精度;对于定位任务,计算的是预测的bbox与gt之间的平均IoU,两个任务损失之间的相互影响如下图所示:
在这里插入图片描述

  • 基于分类损失( l o s s c l s loss_{cls} losscls)的攻击降低了分类的性能,并且同时降低了定位的性能,如左边的柱状图所示;
  • 基于定位损失( l o s s l o c loss_{loc} lossloc)的攻击不仅降低了定位的性能,也降低了分类的性能,如右边的柱状图所示。

这可以被看成是一种交叉任务攻击,也就是说,当仅使用分类损失来生成对抗图像时,攻击会被转移到定位任务上,并使定位的性能降低。这也就是基于单个任务损失生成的对抗图像为什么能够攻击整个目标检测器的原因之一

2. 任务梯度的错位

两个任务的梯度共享同一方向的一定级别,但并未完全对齐,从而导致任务梯度错位,可能会混淆后续的对抗性训练。

为了说明这一点,本文分析了从两个损失中导出的图像梯度, g c = Δ x l o s s c l s g_c= \Delta_xloss_{cls} gc=Δxlosscls g l = Δ x l o s s l o c g_l=\Delta_xloss_{loc} gl=Δxlossloc g c g_c gc g l g_l gl之间的element-wise的散点图如下图所示:
在这里插入图片描述

  • 两个任务梯度的量级是不同的,也就是说两个任务梯度的值的范围是不同的,从图中可以看出 g l g_l gl的值的范围明显比 g c g_c gc大,这说明两个任务损失之间潜在的不平衡;
  • 任务梯度的方向是不连续的,即点在图中呈现的是非对角的形式,这说明两个任务梯度之间存在潜在的冲突。

为了表示每个任务的最大化梯度的任务域,本文还对任务梯度域进行可视化,如下图所示:
在这里插入图片描述
给定一个单一的clean图像x,上图中的每个点表示一个对抗样本,不同颜色表示用来生成对抗样本的不同的任务损失,即 l o s s c l s loss_{cls} losscls l o s s l o c loss_{loc} lossloc,从图中可以看出,两个域并没有被完全分离开,它们有重叠的部分也有分离的部分,重叠的部分证明了两个任务损失之间的相互影响,分离的部分是任务梯度错位的一种反映。


通过对抗训练增强检测的鲁棒性

根据以上的分析,本文提出以下公式来使目标检测的训练更有鲁棒性:
在这里插入图片描述
其中面向任务的域 S c l s S_{cls} Scls S l o c S_{loc} Sloc分别表示每个任务产生的可行域(permissible domain)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
B ( x , ϵ ) B(x,\epsilon) B(x,ϵ)表示以clean图像 x x x为中心,半径为perturbation budget ϵ \epsilon ϵ l ∞ l_∞ l球,设 P S x ( ⋅ ) P_{S_x}(\cdot) PSx()表示将输入投影到可行区域 S x S_x Sx中的投影算子。

本文的对抗训练与常规的对抗训练相比有以下几处差异:

  • 使用多任务监督源来进行对抗训练。在分类案例的对抗训练中,只涉及一个来源,而在本文的对抗训练中,有多个(在存在多个目标的情况下)和异类(分类和定位)的监督源,来生成对抗样本,进行对抗训练;
  • 面向任务的域约束。常规的对抗训练使用任务不可知(task-agnostic)域约束 S x S_x Sx,而本文引入面向任务的域约束 S c l s ∪ S l o c S_{cls}∪S_{loc} SclsSloc,该约束将可行域限制为一个图像集,这个图像集对分类损失或定位损失进行最大化处理。最终用于训练的对抗样本就是这个图像集中能够最大化整体损失的那个样本。本文提出的面向任务的域约束的优点为,可以生成由每个任务指导的对抗样本,而不会受到它们之间的干扰。

如果将面向任务的域放宽到 S x S_x Sx,设置与整个图像相对应的bbox坐标,为图像分配一个单一的类别标签,那么就变成了分类设置下的常规对抗训练。因此,本文为鲁棒性的检测而提出的对抗训练,就可以被视为分类设置下的常规对抗训练的一种自然的泛化。然而,虽然两个任务根据其整体优势都有助于提高模型的鲁棒性,但由于面向任务的域与 S x S_x Sx是不同的,因此在生成单个对抗样本的任务之间没有任何干扰。


总结

本文提出了一种方法来增强目标检测器面对对抗攻击时的鲁棒性,作者认为,在分类的情况下,clean图像的检测精度,与目标检测器的鲁棒性之间存在一种trade-off,如何使这个trade-off达到最佳就是以后的工作了。而且,通过将目标检测看作是多任务学习的一个实例,本文也可以作为提升其它多任务学习鲁棒性的一个参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Towards Adversarially Robust Object Detection 论文笔记 的相关文章

  • 改进 cvFindChessboardCorners

    不幸的是 我无法找到我的问题的任何解决方案 我想做的是使用 OpenCV 方法改进结果cvFindChessboardCorners为了能够实现更好的相机校准 因为我认为这就是为什么我在不扭曲 校正图像时得到较差结果的原因 就像我之前的问题
  • Java 中将对象与 null 进行比较

    我正在尝试验证一个对象是否是null或不 使用以下语法 void renderSearch Customer c System out println search customer rendering gt try if c equals
  • 查找数组中值最接近的对象

    我需要通过最接近的值获取数组中的对象 让我通过一个例子来解释一下 const data age 52 age 53 age 54 age 60 some data age 66 something else age 72 age 78 ag
  • Java 中的对象与扩展

    我可能是错的 因为我没有太多的 Java 经验 但这里有一个问题 我有一个包含许多方法的类 基本上它是一个简单的库 我创建了这个类的一个对象MyLibrary obj new MyLibrary parameters 这些参数设置库正确运行
  • 将我的数据库类与项目中的其他类一起使用

    我有一个自己编写的自定义数据库类 还有一个用户类和一个站点类 MySQL 类有这样的方法 connect query clean fetch 用户等级 register login logout resetPass 站点类别 updateT
  • Angular 2 - 通过引用传递对象字段。可重复使用的编辑对象的方式

    我正在创建可重用的表组件 该组件将允许编辑对象字段 以准备将它们发送到 API 拥有一个对象 person name John job type IT title Software Engineer 我想将对象嵌套字段传递给组件并进行编辑
  • 如何创建要添加到 JavaScript 对象变量的动态键 [重复]

    这个问题在这里已经有答案了 我正在尝试类似的事情 但这个例子不起作用 jsObj for var i 1 i lt 10 i jsObj key i example 1 我该怎么做才能制作这样的动态密钥 方括号 jsObj key i ex
  • CMake:将为 lib 构建的对象文件重用到另一个 lib 目标中

    我正在尝试将我的项目转移到CMake 同时对编译过程进行一些优化 这是交易 我有几个子目录 必须 每个子目录都编译成静态库 这有效 我想将每个子目录中的所有目标文件收集到另一个更大的 完整的静态库中 它看起来像这样 libBig a mad
  • Qt 对象的生命周期

    Qt 对象的生命周期是多少 Such as QTcpSocket socket new QTcpSocket 套接字什么时候会被销毁 我应该使用 delete socket 有什么区别吗 QTcpSocket socket 我找不到有关此的
  • super 在 python 中真正做什么[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我刚刚读过方法解析顺序 http python history blogspot com 2010 06 method resolution
  • 动态添加变量名称值对到 JSON 对象

    我有一个充满 ips 的 json 对象 例如 var ips 然后我将 ip 对象添加到该对象 如下所示 ips ipID 然后我需要向每个 ip 添加动态 变量名称值对 所以我使用这样的代码 var name var value var
  • Object.assign 方法不绑定“this”

    我正在尝试绑定this变量到一个新对象 function Parent sub component constructors this components node function this name jordan subcompone
  • Javascript 中“是……的实例”是什么意思?

    这个问题的答案 JavaScript 函数的原型属性的初始值是多少 https stackoverflow com questions 4073677 what is the initial value of a javascript fu
  • 如何动态创建新属性

    如何从对象方法内的给定参数创建属性 class Foo public function createProperty var name val here how can I create a property named var name
  • R中整数类和数字类有什么区别

    我想先说我是一个绝对的编程初学者 所以请原谅这个问题是多么基本 我试图更好地理解 R 中的 原子 类 也许这适用于一般编程中的类 我理解字符 逻辑和复杂数据类之间的区别 但我正在努力寻找数字类和整数类之间的根本区别 假设我有一个简单的向量x
  • 如何在没有引用的情况下复制对象?

    PHP5 OOP 有据可查对象通过引用传递 http php net manual en language oop5 references php默认情况下 如果这是默认的 在我看来 有一种非默认的方式可以在没有参考的情况下进行复制 如何
  • Javascript - deepEqual 比较

    问题 来自 Eloquent Javascript 第二版 第 4 章 练习 4 编写一个函数 deepEqual 它接受两个值 并且仅当它们相等时才返回 true 是相同的值或具有相同属性的对象 其值也是 与对 deepEqual 的递归
  • 如何从嵌套的对象数组中获取每个父级的值

    所以我有多个对象数组 每个对象都包含一个子对象 e g const data id 1 name parent 1 children id c1 name child 1 children id g1 name grand 1 childr
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • 将多维数组转换为单数组(Javascript)

    我有一个对象数组 来自 XLSX js 解析器 因此其长度和内容各不相同 表示已给予项目的资助 简化后 它看起来像这样 var grants id p 1 location loc 1 type A funds 5000 id p 2 lo

随机推荐