论文一、TOOD Task-aligned One-stage Object Detection.pdf
论文二、Understanding the Effective Receptive Field in Deep Convolutional Neural Networks
一、TOOD的问题
分类任务是为了学习目标中比较显著的主要特征,但是目标的定位任务需要目标的整个边界,所以两种任务学习到的特征空间分布是不同的,但是one-stage目标检测认为,一个anchor可以给分类和定位准确的预测,论文里面说,这中机制有两个限制:
- 分类任务和定位任务批次独立,one-stage把两个任务放到两个并行、相互独立的head中,但是这两个任务在预测的时候没有充分交流,为什么会产生问题,是因为分类分支在回答,这个位置附近看起来像什么,定位分支在回答,这个位置应该框住什么?论文里面的Figure1的意思是,比如yolo里面8400个框,每个框都有位置和所有类别的分数,作者说,针对每个预测的框,有可能框和A类的iou值最大,但是在所有类别中,这个框的类别分数又是B类的分数最大。这种差异很好理解,因为分类分支在做分类的时候,不知道定位分支预测的位置,更不知道这个位置和哪个类别最近。
- 以一个具有大量候选预测位置的目标检测器为例,假设模型产生 8400 个候选预测,每个预测位置经过回归得到一个预测 bounding box。训练时,将这 8400 个预测框分别与 ground truth 进行匹配,并根据 IoU 或其他几何关系判断哪些预测是正样本、哪些是负样本。这里需要注意的是,在传统的 task-agnostic sample assignment 中,这一过程主要依据预测框与 ground truth 的几何关系完成,classification 分支的预测结果并不参与样本分配。也就是说,只要某个预测框在定位上满足 assignment 条件,它就会被作为正样本,同时用于 classification 和 localization 两个任务的训练。然而,这实际上默认了“对定位任务最合适的样本,同时也是对分类任务最合适的样本”,而这一假设并不一定成立。对于 classification,最优样本可能是那些具有更强目标语义特征、位于目标内部的预测位置;而对于 localization,最优样本则可能是那些能够产生更高 IoU、更精确 bounding box 的预测位置。因此,在所有候选预测中,classification 得分最高的预测位置与 localization 质量最高的预测位置可能并不一致。例如,预测 A 与 GT 的 IoU 很高,但分类置信度较低;预测 B 的 IoU 稍低,却具有更高的分类置信度。传统 assignment 仅根据 IoU 进行分配时,并不能区分 A 和 B 分别更适合哪个任务,从而导致 classification 和 localization 被迫共享一套并不一定适合双方的正样本。最终,这种任务无关的样本分配可能造成分类置信度与定位质量之间的不一致:一个框可能“分类很确定,但框得不准”,另一个框可能“框得很准,但分类分数较低”。在后续 NMS 中,由于通常按照分类置信度进行排序,前者甚至可能抑制后者,使定位更加准确的检测框被错误删除。
说到目标检测的分类分支和定位分支,我们这里展开梳理下,下面的代码是yolo里面定位分支和分类分支,cv2是专门来学习定位特征的,比如P3,最后一层的输出是 80x80x4, 最后一个nn.Conv2d(c2, 4, 1),最后一层的权重是c2 x 4,意思是在80x80xc2的特征上,在每个平面位置上,都用c2维的特征,去线性回归一个4维的数;同样道理,cv3是分类分支,在最后一个nn.Conv2d(c3, self.nc, 1)上,意思是在80x80xc3的特征上,在每个平面位置上,都用c3维特征,回归每个类别的概率。也就是,相同的特征进入C2 和 C3后,分别去完成各自的任务后,将结果合并起来使用。
所以相同的特征,经过不同的卷积参数以后,最终用于定位和分类的有效信息来源可以不同。
self.cv2=nn.ModuleList(nn.Sequential(Conv(x,c2,3),Conv(c2,c2,3),nn.Conv2d(c2,4,1))forxinch)self.cv3=(nn.ModuleList(nn.Sequential(Conv(x,c3,3),Conv(c3,c3,3),nn.Conv2d(c3,self.nc,1))forxinch))二、目标检测分类和定位
之前做过一个实验,就是把一张图片,除了目标外,其他都设置为114,但是模型依然很准确的将目标框回归出来,并且分类分数和正常图片一样,给人的感觉是,分类使用的内容就是在目标框内,分类没有使用上下文信息,其实不能这么直接的得到这个结论,只能说分类对上下文信息没有很强的依赖,所以这里让我很自然的想到了理论感受和有效感受野。
- 理论感受野就是根据网络结构、卷积核大小、stride、padding、dilation等计算出来的,这个是纯粹由网络结构决定的,比如说在80x80 的 (3,5)这个点上,根据网络结构,计算出来原图上的理论感受野为 160x160,意思是,原图上这个区域中的像素,理论上存在一条计算路径能够影响P3 (3,5),理论感受野一般都很大。
- 但是有效感受野一般都很小,意思是理论上,理论感受野中的每个像素都能影响某个点的特征,但是由于卷积权重,ReLU、BN、特征响应等,导致输入的像素对P3 (3,5)这个点上的特征影响程度不同,所以有效感受野就是改变原图的像素,对P3(3,5)特征产生多大的影响。
三、有效感受野
论文中有个简单的例子很有意思,而且很直白的说明了什么是理论感受野,什么是有效感受野。
论文中提出了一个非常简单的CNN网络,一共有n层卷积,每层卷积核都是kxk,sstride = 1,每层只有1个channel,没有ReLU Sigmoid等非线性,不考虑bias,因此整个网络实际上是一个深度卷积网络,而且每层卷积的权重都是1。
研究这么简单的网络,是作者在回答一个问题:一个输出像素,来自输入图像的不同位置,对最终输出的贡献是否完全一样?
记住,每层的权重都是1,
一层卷积理论感受野是一个 3x3的卷积核:
K=[111111111]K = \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}K=111111111
二层卷积理论感受野是一个 5x5的卷积核:
K∗K=[1232124642369632464212311]K *K= \begin{bmatrix} 1 & 2 & 3 & 2 & 1 \\ 2 & 4 & 6 & 4 & 2\\ 3 & 6 & 9 & 6 & 3 \\ 2 & 4 & 6 & 4 & 2 \\ 1 & 2 & 3 & 1 & 1 \end{bmatrix}K∗K=1232124642369632464112321
这个矩阵直接说明了一个问题:虽然理论感受野是整个5x5,但是不同位置的共享明显不同,中心位置9,角落位置1,也就是:越靠近处处对应位置的输入像素,对最终输出的影响越大。
有效感受野的中心化特性并不是因为网络学习到了某些特殊权重,而是深度卷积结构本身就会产生这种现象。
那接下来就问,有效感受野怎么计算?
论文中有效感受野的计算通过梯度来测量,即:
G(x,y)=∣∂y∂I(x,y)∣G(x,y) = |\frac{\partial y}{\partial I(x, y)}|G(x,y)=∣∂I(x,y)∂y∣
其中,y是某个输出神经元,I(x, y) 是原图上的像素,梯度越大,说明这个位置上对该输出越敏感,梯度越小,影响越弱。
四、输入图片的梯度
当时理解这里的时候有些疑惑,和训练时候的梯度弄混了,这里总结下:
- 在pytorch中,一个网络就是一个树结构,输入是根,输出是最上层叶子结点,权重是中间叶子结点,特征是中间树干,每层的树干的特征因为旁边权重叶子的不同而不同,矩阵相乘是把树干和树叶连接起来的树枝;
- 叶子节点,是由用户直接创建,不是通过当前计算图中的运算产生的Tensor;
- backward函数执行的是从当前结点向上计算所有需要梯度的权重叶子节点的梯度;
- loss不是叶子节点,是我们常用的开始计算梯度的位置;
- 可以在树结构的任何一个地方开始backward;
- 输入图片也是叶子节点,不过通常训练的时候不需要梯度;
- 所以这里计算有效感受野的时候,拿到了输入图片的梯度;