【论文笔记】目标跟踪算法之Siamese-RPN

SiamRPN在SiamFC基础上引入区域推荐网络(RPN),提升速度与精度,利用稀疏标注数据训练,实现实时目标跟踪,达到state-of-the-art水平。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

High Performance Visual Tracking with Siamese Region Proposal Network



论文地址:
pytorch代码

一、简介

这篇文章是在SiamFC的基础上改进的,其特征提取网络跟SiamFC一毛一样,不同的是引入了目标检测领域的区域推荐网络(RPN),通过RPN网络的回归避免多尺度测试,一方面提升了速度,另一方面可以得到更加准确的目标框。另一个强大的地方在于,该算法可以利用稀疏标注的数据进行训练,如Youtube-BB,该数据集不是每一帧都有标注,而是隔几十帧标注一帧,这样极大地扩充了训练数据,大家都知道跟踪届的数据是非常宝贵的。要训练一个好的模型,数据量大是关键啊。

二、补充知识

为了能更好的理解这个算法,开始之前先了解一下目标检测(object detection)领域的区域推荐网络(Region Proposal Network)。这得从Kaiming He大神的faster r-cnn说起。

在这里插入图片描述

图1.faster r-cnn结构(来自CS231n PPT)

上图可以总结为四步:

1、Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
2、Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals。
3、Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。另一种说法是,Roi Pooling层利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification
4、Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

在这里我们主要了解图中Region Proposal Network这个分支就行了。CNN提取出来的特征,送入RPN后输出两个东西,一个是前景-背景的分类分数,另一个是bounding box的坐标值,对应图中的两个loss(Classification loss 和 Bounding-box regression loss)。我们单独拿RPN结构出来讲,其结构如下图所示

在这里插入图片描述

可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得foreground和background(检测目标是foreground),下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

三、算法总体框架

在这里插入图片描述

图2.SiamRPN网路结构

看图2.SiamRPN算法由两部分组成,第一部分是Siamese Network用来提取特征,第二部分是Region Proposal Network,利用Siamese Network提取出来的特征进行给出跟踪目标的边框。我们把输入模板帧的分支(上支)叫做模板分支,把输入检测帧的分支(下支)称为检测分支。模板分支输出的特征图会分成两个两个分支,一支送给分类分支,另一支送给回归分支,这两支都要经过不同的卷积操作Conv进行升维,输入分类分支的特征图变为 4 × 4 × ( 2 k × 256 ) 4\times4\times(\boldsymbol2k\times256) 4×4×(2k×256),而送入回归分支的特征图变为 4 × 4 × ( 4 k × 256 ) 4\times4\times( \boldsymbol4k\times256) 4×4×(4k×256),其中 k k k指的是anchor的数量;检测分支输出的特征图也跟模板分支一样,分成两个分支分别送到分类分支和回归分支,不同的是检测分支输出的特征图不需要升维操作。在分类分支里,模板分支送过来的特征图与检测分支送过来的特征图进行相关操作 ⋆ \boldsymbol\star ,输出 17 × 17 × 2 k 17\times17\times2k 17×17×2k的特征图,表示一个2 k k k通道的向量,这个向量表示每个anchor在原图上对应位置的负激活和正激活值,即前景和背景的分数,这个分支用Softmax损失进行监督训练;在回归分支里,两个特征相关操作后,得到 17 × 17 × 4 k 17\times17\times4k 17×17×4k的特征图,表示一个4 k k k通道的向量,dx,dy,dw,dh表示anchor与对应groundthruth的距离。这里的相关操作 ⋆ \boldsymbol\star 指的是卷积操作,即特征图小的作为卷积核在特征图大的上面进行卷积。

四、具体实现

4.1 训练阶段

·SiameseRPN使用的损失函数与faster rcnn的损失函数一样。在分类上使用了softmax,回归bounding box使用了smooth L1损失。这里只简单介绍回归的损失。
首先来看看什么是smooth L1损失函数。
借用一下知乎尹博的图


在这里插入图片描述

从图中可以看到,在远离坐标原点处,图像和 L 1 L1 L1 损失很接近,而在坐标原点附近,转折十分平滑,不像 L 1 L1 L1损失那样有个尖角,因此叫做smooth L 1 L1 L1损失。
smooth L 1 L1 L1损失函数的数学表达式为

在这里插入图片描述

由数学公式和图可以看出,当预测框与ground truth差别过大时,梯度值不至于过大,当预测框与ground truth差别很小时,梯度值足够小。
下面再来看看RPN是怎么对边界框做回归的。用 T x , T y , T w , T h T_x,T_y,T_w,T_h TxTyTwTh表示ground truth的坐标 x , y x,y xy,和尺寸 w , h w,h wh,用 A x , A y , A w , A h A_x,A_y,A_w,A_h AxAyAwAh表示预测框的坐标 x , y x,y xy,和尺寸 w , h w,h wh,回归的量用 δ [ i ] \delta[i] δ[i]表示,其中 i = 0 , 1 , 2 , 3 i=0,1,2,3 i=0123


在这里插入图片描述

这里的 δ [ 0 ] 和 δ [ 1 ] \delta[0]和\delta[1] δ[0]δ[1]的分母的作用是用来忽略框的形状的影响,即不管设定的框是瘦长的还是正方形的,得到的损失都差不多。
δ [ i ] \delta[i] δ[i]带入到回归的损失函数里:

在这里插入图片描述

在训练跟踪器时总的损失是分类损失 L c l s L_{cls} Lcls和回归损失 L r e g L_{reg} Lreg的线性加权,权值 λ \lambda λ是超参数。

在这里插入图片描述

4.2 Tracking阶段

跟踪阶段示意图


在这里插入图片描述

模板帧将两个特征图计算好后并保留下来,检测分支只需要保留这两个特征,不再需要进行模板帧的前向传播。
为了保证模板的准确性,我们在测试过程中始终保持第一帧为模板,以防止跟踪过程中的误差进行不断的累积。在只需要第一帧做模板的情况下,跟踪的时候可以将网络根据输入的图像拆分成两个小网络,模板分支在第一帧根据模板图像提取两个特征,在后续帧中只做检测分支。如上图所示,模板分支只在第一帧输入模板帧,得到两个特征向量。按照训练框架中描述,这里跟踪器将这两个特征向量转化为两个不带Bias的卷积层,即图中的两个用粗线双箭头连接着的Conv和特征。经过这样的转变,检测分支变成了一个简单的检测网络。在经过特征提取网络后,分别经过两个卷积层,获得最终的分类结果和回归的结果。根据网络的输出,可以得到网络预测出的所有框及其对应分数。经过高斯窗口的抑制以及形状的抑制,可以得到加权后的分数,从中选出分数最高的对应的框,即作为最终网络预测的目标位置。

五、实验结果

在VOT2015的结果。
VOT2015数据集中包含60段视频。在测试过程中,当VOT工具包发现跟踪结果与实际目标位置重合度为0的时候会将跟踪器重启。所以跟踪算法的性能需要由精度和鲁棒性两方面来评估。精度指跟踪过程中平均的重合度,而鲁棒性则是用于衡量跟踪算法在这60段视频上的丢失次数。同时VOT又提出了EAO来综合两项指标,作为排名依据。

在这里插入图片描述

评价指标说明
EAO:Expect Average Overlap Rate,期望平均重叠率,用来评价性能的。
EFO:Equivalent Filter Operations,等效过滤操作,是用来评价性能的。因为性能的比较常常因为计算机性能不同而不够直观,EFO评价指标考虑到了这一点,使用600x600的图像,做30x30窗口的滤波来得到机器的性能,然后使用跟踪算法处理每帧图像的评价时间除以以上滤波操作的时间,得到了一个归一化的性能参数,就是EFO,是VOT14提出来的标准,一直沿用到现在。

在VOT2016的结果
VOT2016的数据集和VOT2015的一样,但在2016年VOT组委会更换了标注规则,由原来的外接框改为了现在的先分割,再计算出最优矩形框。改变了标注规则之后,框变得更加紧致,所以跟踪算法更容易丢了

在这里插入图片描述

排名情况


在这里插入图片描述

在VOT2017的结果


在这里插入图片描述

ps : VOT2017挑战赛对结果的评测指标做了修改,也就是如果速度没达到25FPS的,直接利用最后一帧的Bounding box作为最终结果。

在OTB2015的结果
OTB由跟踪社区经常使用的视频中挑选出的100段视频组成。OTB中主要包的评测指标是成功和精度的曲线。精度曲线表现跟踪过程中,预测框与标注中心点小于某像素的帧的占比;成功率曲线是跟踪过程中,预测框与标注框的重合度超过某一阈值的帧的占比。这两个曲线根据不同的阈值(成功率曲线阈值为01,精度曲线阈值为050像素)作为横坐标,不同的占比作为纵坐标,可以画出曲线,曲线下积分作为最后的分数。特别的,成功率曲线的曲线下面积(AUC)用于跟踪算法的排名。

在这里插入图片描述

Precision: 表示跟踪结果与目标距离在20像素以内的帧数百分比
Success: 表示阈值在0到1之间变化时成功帧的比例,其中成功帧表示其重叠大于给定阈值。
这次没有比四项benchmark(因为并没有碾压到别人),这次比实时准确率。
帧率达到25fps的算法才有资格称为“实时”,在所有实时算法里只有SiamRPN的准确率最高,完全达到了实时tracking的state-of-the-art。本着很多场景下实时才能用的原则来看,SiamRPN称得上应用性很强的算法了。

### 单目标跟踪算法概述 单目标跟踪是指在视频序列中自动定位并跟随特定对象的过程。该过程通常涉及初始化阶段,在此期间指定要跟踪的对象,随后算法将在每一帧中估计对象的位置。 常见的单目标跟踪框架可以分为两大类:基于生成的方法和基于判别的方法[^1]。前者试图建模目标外观的变化;后者则通过区分目标与背景来实现更鲁棒的跟踪性能。 ### 原理阐述 为了有效地执行单目标跟踪,许多现代算法依赖于机器学习技术,尤其是深度神经网络(DNN)。这些模型能够捕捉复杂的特征表示,从而提高跟踪精度。具体来说: - **特征提取**:利用预训练好的卷积神经网络作为骨干网,用于从输入图像中抽取高层次语义信息。 - **响应图构建**:对于给定的目标模板,计算候选区域相对于模板的相似度得分,形成所谓的“响应图”。 - **位置更新机制**:依据上一步得到的最大响应值及其坐标,调整当前帧中的边界框位置,完成一次迭代式的预测。 此外,遗传算法作为一种全局优化策略也被应用于某些场景下的参数调优或路径规划任务之中。不过需要注意的是,这并非主流做法,而是针对特定需求的一种补充手段。 ### 实现流程展示 下面给出一段简化版Python代码片段,模拟了一个典型的相关滤波器(CFNet)风格的单目标跟踪程序结构: ```python import cv2 from dlib import correlation_tracker as tracker def init_first_frame(image, bbox): trk = tracker() rect = dlib.rectangle(*map(int,bbox)) trk.start_track(image,rect) return trk def track_object(video_path, initial_bbox): cap = cv2.VideoCapture(video_path) ret, frame = cap.read() if not ret: raise ValueError("Failed to load video") # 初始化第一个frame上的tracker trk = init_first_frame(frame,initial_bbox) while True: success, img = cap.read() if not success: break trk.update(img) pos = trk.get_position() # 绘制矩形边框显示追踪结果 pt1 = (int(pos.left()), int(pos.top())) pt2 = (int(pos.right()), int(pos.bottom())) cv2.rectangle(img,pt1,pt2,(0,255,0),3) cv2.imshow('Tracking',img) k=cv2.waitKey(1)&0xff if k==ord('q'): break cap.release() cv2.destroyAllWindows() ``` 上述例子采用了dlib库提供的correlation_tracker组件来进行实际操作。当然,这只是众多可能实施方案之一,其他流行的选择还包括但不限于SiameseFC、SiamRPN++等更为先进的架构设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值