首先提一句:这篇论文虽然是今年CVPR的oral,但是它的整体思路与SiamBAN基本相同。所以在本篇论文中我将主要的重点放在与SiamBAN不同的地方。
我之前的关于SiamBAN的博客。
整体把握
本篇论文通过anchor-free的策略,将网络的回归输出变成了特征图映射在搜索补丁上点与选定的gt框四条边的距离。通过观察分类得分图和中心度得分图,决定最佳目标中心点。然后提取最佳目标中心点与gt框四条边的距离,得到预测框,从而实现跟踪。具体的过程如下所示:
SiamCAR的思路跟SiamFC相似,不过比SiamFC更加强大的点在于添加了对跟踪框尺寸的讨论。
SiamCAR的思路也跟SiamRPN相似,不过比SiamRPN更加强大的点在于去掉了anchor参数的影响,使网络的速度更快。
由此可见SiamCAR是一篇取长补短的文章,对之后科研的研究还是留下了无限的遐想。
网络结构
特征提取子网
上图中左边部分。
与SiamBAN的特征提取子网基本相同不做过多赘述。但是通过阅读代码,发现了两个跟踪器之间存在着些许的不同:三个互相关特征图的融合部分。
三个互相关特征图的由来:取模板补丁和搜索补丁的三个卷积块结果进行两两互相关得来。如下图所示:
当我们获得三个互相关特征图后,需要将它们融合在一起,变为一个互相关特征图,这时SiamBAN和SiamCAR产生了分歧。
SiamBAN:将三个互相关特征图的相同位置的值相加,再取平均,从而将三张互相关特征图融合为一张。示意图如下:
SiamCAR:利用torch.cat
函数将三个互相关特征图拼接在一起
features = torch.cat([features,features_new],1)
那么此时features
特征图的维度为
256
×
3
256\times 3
256×3.之后作者利用torch.nn.ConvTranspose2d
进行降维:
torch.nn.ConvTranspose2d(256*3,256,1,1)
将维度从
256
×
3
256\times 3
256×3转换成
256
256
256,此时就实现了三个互相关特征图的融合。
而且这种融合方法涉及到了网络权重,那么后期可以通过训练不断修改权重,找到三个互相关特征图的最佳融合方法。
相比较SiamBAN直接加权平均,这种可学习的融合方法精度会更高,但可能会影响速度。
分类和回归子网
第一张图片的右边部分。
该部分也与SiamBAN相似,只是多出了中心度分支。
中心度分支的提出源自于一项研究,该研究认为那些离目标中心点越远的点生成的预测框的质量水平越差,所以设立中心度分支对远离中心点的位置进行约束(也就是分配更低的分数)。
实际上,中心度分支可能与高斯矩阵起的作用差不多,都是为了抑制目标过大位移。
至于中心度特征图是如何得到的,下文中会提到,不过肯定是给了网络一种训练的方法。
小总结
这样就差不多将第一张流程图里“网络”之前的部分交代清楚了,但是SiamCAR网络的训练部分还是有与SiamBAN的不同之处。
训练
观察SiamCAR的输出:分类得分图、偏差坐标图、中心度图,所以网络应该有三种训练方法。分类得分图与SiamBAN相同略过。
偏差坐标训练
总体来说SiamCAR的回归训练与SiamBAN的大致相同,都是将预测的偏差坐标转换成预测框,通过比较预测框和真实框的IOU来训练。唯一不同的是IOU损失函数的选取。
SiamBAN中IOU损失的选择就是很简单的:
1
−
I
O
U
1-IOU
1−IOU。如果预测框与真实框重合,那么损失为0。
SiamCAR中的IOU损失为:
−
ln
I
O
U
-\ln IOU
−lnIOU,这是一种比较优秀的IOU损失,增加了非线性的因素,使得训练更准确。
还有值得注意的是SiamCAR的训练样本的选取,它只选取特征图映射在搜索补丁上,且落在第一帧选定的bbox的点。
但是说实话,我通过查看这两个跟踪器的代码,发现他们的回归损失函数设置其实都是一样的,虽然SiamBAN在论文中没有提到这种损失函数,毕竟谁不想让自己的跟踪器性能提升呢。
中心度训练
这个分支完完全全是由SiamCAR独有的。它的理念与高斯函数相当,是为了抑制过大的位移。
训练过程中是预测值和真实值之间的博弈。在中心度训练中,数据集中是没有直接的中心度分数,于是作者认为设定中心度真实值,公式为:
C
(
i
,
j
)
=
I
∗
m
i
n
(
l
,
t
)
m
a
x
(
l
,
t
)
×
m
i
n
(
r
,
b
)
m
a
x
(
r
,
b
)
C(i,j)=I*\sqrt{\frac{min(l,t)}{max(l,t)}\times\frac{min(r,b)}{max(r,b)}}
C(i,j)=I∗max(l,t)min(l,t)×max(r,b)min(r,b)
其中:
I
=
{
1
特
征
图
点
(
i
,
j
)
对
应
搜
索
补
丁
的
点
落
在
第
一
帧
划
定
的
b
b
o
x
内
0
特
征
图
点
(
i
,
j
)
对
应
搜
索
补
丁
的
点
落
在
第
一
帧
划
定
的
b
b
o
x
外
I= \begin{cases} 1&特征图点(i,j)对应搜索补丁的点落在第一帧划定的bbox内\\ 0&特征图点(i,j)对应搜索补丁的点落在第一帧划定的bbox外 \end{cases}
I={10特征图点(i,j)对应搜索补丁的点落在第一帧划定的bbox内特征图点(i,j)对应搜索补丁的点落在第一帧划定的bbox外
l
、
t
、
r
、
b
l、t、r、b
l、t、r、b代表特征图点(i,j)对应搜索补丁的点与第一帧划定的bbox的左、上、右、下边的距离。
从中心度的标定上不难发现训练样本只取落在bbox内的点。
当真实值标定之后,中心度分支的损失函数选取为:
该损失函数类似于二分类交叉熵。
跟踪过程(“中心点确定”是重点,有创新)
- 将模板补丁和搜索补丁输入网络,得到cls、cen、lrtbs三种特征图
- 对cls特征图上的点添加尺度惩罚、宽高比惩罚、余弦窗惩罚,生成新的特征图hp_cls
- 将网路输出的特征图都resize,也就是都从(25,25)变为(196,196)。使用的函数为
cv2.resize
,插值方式为双三次线性插值。
cls->cls_up
hp_cls->hp_cls_up
cen->cen_up
ltrbs->ltrbs_up. - 计算resize前后的倍数和reize后cls和cen的乘积
score_up=cls_up*cen_up
scale_score=196/25
- 获取中心点
-
获取hp_cls_up中最大值的行数max_r_up和列数max_c_up。使用函数`np.unravel_index()
-
由于之前将特征图从(25,25)resize到(196,196)使用的是
cv2.resize(model=INTER_CUBIC)
函数。所以resize前后特征图上的点有对应关系: ( x 前 , y 前 ) = ( x 后 ∗ 边 长 前 边 长 后 , y 后 ∗ 边 长 前 边 长 后 ) (x_{前},y_{前})=(x_后*\frac{边长_前}{边长_后},y_后*\frac{边长_前}{边长_后}) (x前,y前)=(x后∗边长后边长前,y后∗边长后边长前)。那么,可以将hp_cls_up下获得的最大值的行数和列数转换成hp_cls下最大值的行数max_r和列数max_c。(注:resize前后矩阵属性不变,即resize前最大值的位置对应resize后的位置也应该是最大值) -
根据在hp_cls上找到最大值的行数max_r和列数max_c,在ltrbs特征图上找到对应的偏差坐标。其实说实话,前三步跟SiamBAN一模一样,都是通过添加惩罚后选择最佳点。不过SiamBAN就到此为止,而SiamCAR之后还有处理
-
因为之前的偏差坐标指的是目标中心点到预测边的距离,所以作者规定了最小偏差距离(最小预测框的长度):min_box= 0.1 ∗ 127 0.1*127 0.1∗127;最大偏差距离(最大预测框的长度):max_box= 0.44 ∗ 127 0.44*127 0.44∗127。注意这里的最小、最大预测框长度并不是说最终预测框的长度,这是的目的是用来求出目标中心点,不必纠结于这个地方。后面自然会有预测框长度的确定方法。
-
对根据max_r和max_c从ltrbs特征图上获得的偏差坐标进行规范:
1. 左、上偏差:
(1)偏差最小为min_box;最大为max_box
(2)根据min_box和max_box可以生成相应的预测框,但是要考虑生成的预测框会不会超出边界,也就是考虑目标中心点产生的最小预测框会不会超出边界,于是代码中用:int(min(max_r_up_hp, bbox_clip(bbox_region[0], min_bbox, max_bbox)))
表示。示意图如下所示:
- 右、下偏差:
(1)偏差最小为min_box;最大为max_box
(2)根据min_box和max_box可以生成相应的预测框,但是要考虑生成的预测框会不会超出边界,也就是考虑目标中心点产生的最小预测框会不会超出边界,于是代码中用:int(min(upsize - max_r_up_hp, bbox_clip(bbox_region[0], min_bbox, max_bbox)))
表示。 - 注意左、上偏差考虑超出边界的坐标
max_r_up_hp
、右、下偏差考虑超出边界的坐标upsize-max_r_up_hp
。(upsize=196)
- 右、下偏差:
-
通过第5步规范后的偏差,能够确定预测框的范围。于是(196,196)的零矩阵在预测框的范围内生成全为1的mask。
-
将通过cls_up*cen_up得到的(196,196)矩阵乘以上述包含mask的(196,196)矩阵,得到全新的(196,196)矩阵。
-
计算出mask中最大值的行数max_r_up和列数max_c_up
-
由于此时的行数和列数是在(196,196)中求的,与输入搜索补丁的(255,255)不匹配。所以作者使用了简单粗暴的方式:(255-196)//2=29,然后:
{ 行 数 = 行 数 + 29 列 数 = 列 数 + 29 \begin{cases} 行数=行数+29\\ 列数=列数+29 \end{cases} {行数=行数+29列数=列数+29
但个人觉得不是很精确,resize前后像素值不能简单的相加。 -
根据第9步求出最大值的行数和列数,即预测目标点坐标。计算预测目标点与前一帧目标点的相对位移,用disp表示。
-
由于设置搜索补丁时,我们是将截取补丁统一resize为255,所以搜索补丁与截取补丁之间可能存在一定的变形,而这变形会影响第10步求出来的相对位移。所以要将拉伸的影响去除:disp_ori=disp/scale_z,scale_z=搜索补丁边长/截取补丁边长
-
将第11步的相对位移与前一帧目标的中心点坐标相加,得到当前目标的中心点。
-
- 获取w、h
- 根据得到的预测目标中心点,找到其对应的偏差坐标
- 因为截取补丁和搜索补丁的拉伸问题,所以也要去除偏差坐标的拉伸影响。与上相同。
- 按理说现在应该就可以了,但是作者认为需要平滑处理,即跟踪框的变化不要太过于剧烈。于是进行平滑处理后得到了最终的预测框的w、h
- 计算插值学习率lr=预测框的尺度、宽高比惩罚得分x预测目标点的分类得分x0.3
- 根据第2步得到的偏差坐标求出预测框的w1、h1
- 确定最终的w、h:
{ w = w 1 × l r + g t w × ( 1 − l r ) h = h 1 × l r + g t h × ( 1 − l r ) \begin{cases} w=w1\times lr+gt_w\times (1-lr)\\ h=h1\times lr+gt_h\times (1-lr) \end{cases} {w=w1×lr+gtw×(1−lr)h=h1×lr+gth×(1−lr)
其中 g t w 、 g t h gt_w、gt_h gtw、gth代表前一帧的bbox的w、h,代表平滑过渡。
- 计算插值学习率lr=预测框的尺度、宽高比惩罚得分x预测目标点的分类得分x0.3
- 根据获得的中心点和w、h获得跟踪框,实现跟踪。
总结
SiamCAR多出了一个中心度分支其实是为了更好的确定目标中心点的位置,代码部分也有了创新,除此以外与SiamBAN几乎一样。还有我原来以为两篇论文相同,没有阅读的必要,看来还是自己年轻,不可小视。