关于SiamFC++代码的几个要点

  • 1、data pair的生成和增强
  • 2、label的构造
  • 3、loss的写法
    • 3.1、focal loss
    • 3.2、binary cross entropy loss
    • 3.3、IoU loss
  • 4、tracking的流程
  • 5、Bonus
  • PS

paper: https://arxiv.org/abs/1911.06188【mirror site】
code: https://github.com/MegviiDetection/video_analyst
Siamfc++是较早发表的anchor-free的单目标跟踪器,可说是比较经典的,所以有精读的必要,就像siamfc一样。下面就几点代码中比较重要的部分写一下,以便后续回想。

1、data pair的生成和增强

datapipeline主要由下面三部分构成,在videoanalyst/data/datapipeline/builder.py有体现:

sampler = build_sampler(task, cfg.sampler, seed=seed)
transformers = build_transformer(task, cfg.transformer, seed=seed) # a list of TransformerBase
target = build_target(task, cfg.target)

build_sampler从同一个序列中产生一个positive pair或者是从不同序列中产生一个negative pair,然后,送给 build_transformer进行数据增广,主要有scale和shift,使search patch和templete patch并不是正好目标中心对着的,会有一点偏移【这一部分其实和siamfc是差不多的,只是用了一个集crop和resize的更高效的函数cv2.warpAffine,而不再是cv2.copyMakeBorder】;然后又送给build_target来构造label。都调用了三种方法的__call__方法,最后返回的是:

training_data = dict(im_z=im_z,             # 经过crop和resize之后的templete patchim_x=im_x,             # 经过crop和resize之后的search patchbbox_z=bbox_z,         #坐标相对于im_z的templete gt_bboxbbox_x=bbox_x,         #坐标相对于im_x的search gt_bboxcls_gt=cls_label,      # (h*w ,1)的cls labelctr_gt=ctr_label,      # (h*w ,1)的ctr labelbox_gt=box_label,      # (h*w ,4)的reg labelis_negative_pair=int(is_negative_pair),   # 标志位)

然后将training_data送入到DataLoader()中去构成batch的数据
其中build_transformer是比较难理解的,可以参考下面这幅图辅助理解:

下面是对visdrone的uav0000043_00377_s序列的可视化:

2、label的构造

因为有classification、regression和centerness分支,所以有三个头部的label【类似FCOS】:

  • classification分支:这个就像论文中说的,当score map的位置映射回search patch,如果在im_x的gt_bbox中,则赋值为1,其他为0,假定在其中的这块区域记作gt_on_fm(对于negative_pair,则1的地方为0,0的地方为-1)
  • centerness分支:在gt_on_fm中撒一些类似高斯分布的点,范围是[0, 1]
  • regression分支:在四个通道ltrbgt_on_fm区域分别赋值为bbox_x的(x0,y0,x1,y1)(x_{0},y_{0},x_{1},y_{1})(x0​,y0​,x1​,y1​)

进行可视化之后的样子是这样的:


这里面需要注意一点,centerness其实是从下面红框中选出来的(红框就是im_x上的GT BBox,具体请看make_densebox_target函数):

这一步最重要的就是如何判断score map的位置映射回search patch是否在在im_x的gt_bbox中,分享原作者的一次分享【这里面减1的原因是间距数是点数-1】:

3、loss的写法

loss的话因为有三个分支,所以也有三个部分:classification的focal loss;regression的IoU loss和centerness的BCE loss。

3.1、focal loss

focal loss的公式就是:
focalloss=−α(1−y^)γylog(y^)−(1−α)y^γ(1−y)log(1−y^)focal loss=-\alpha(1-\hat y)^{\gamma}ylog(\hat y)-(1-\alpha)\hat y^{\gamma} (1-y)log(1-\hat y)focalloss=−α(1−y^​)γylog(y^​)−(1−α)y^​γ(1−y)log(1−y^​)
其中α\alphaα用来关注正负样本,γ\gammaγ调节难易样本。学习的目标就是让预测的gt_on_fm区域接近1,其余接近0,因为只有一个输出通道(因为二分类,不像有的就是输出两个通道,都一样),下面是代码截图:注意,如果对于is_negative_pair只有neg_part的损失:

3.2、binary cross entropy loss

这是对于centerness分支的,BCE loss公式是:
BCEloss=−zlog(x)−(1−z)log(1−x)BCE loss=-zlog(x)-(1-z)log(1-x)BCEloss=−zlog(x)−(1−z)log(1−x),这里的xxx是logits,
有一个稳定版的:推导过程可以看这里
BCEloss=max(x,0)−x∗z+log(1+e−∣x∣)BCE loss=max(x, 0) - x * z + log(1 + e^{-\left|x \right|})BCEloss=max(x,0)−x∗z+log(1+e−∣x∣),所以代码如下:

但是这里为什么会有个loss_residual呢?因为我们的centerness label是介于[0, 1]直接的float数,而不是{0, 1},所以不同于一般的BCE loss的最小值为0,所以我们要算出此时情况下的最小值,然后减去这一项,推导过程如下(佩服作者的代码严谨性):

3.3、IoU loss

最初的IoU loss来自论文UnityBox,公式是:−ln(IoU)-ln(IoU)−ln(IoU),因为我们regression预测的是offsets,通过逆向求解出预测的bbox_pred(这其实是head的输出),而target是真实bbox_x的(x0,y0,x1,y1)(x_{0},y_{0},x_{1},y_{1})(x0​,y0​,x1​,y1​):
l∗=(⌊s2⌋+xs)−x0,t∗=(⌊s2⌋+ys)−y0r∗=x1−(⌊s2⌋+xs),b∗=y1−(⌊s2⌋+ys)\begin{array}{ll} l^{*}=\left(\left\lfloor\frac{s}{2}\right\rfloor+x s\right)-x_{0}, & t^{*}=\left(\left\lfloor\frac{s}{2}\right\rfloor+y s\right)-y_{0} \\ r^{*}=x_{1}-\left(\left\lfloor\frac{s}{2}\right\rfloor+x s\right), & b^{*}=y_{1}-\left(\left\lfloor\frac{s}{2}\right\rfloor+y s\right) \end{array}l∗=(⌊2s​⌋+xs)−x0​,r∗=x1​−(⌊2s​⌋+xs),​t∗=(⌊2s​⌋+ys)−y0​b∗=y1​−(⌊2s​⌋+ys)​然后计算他们之间的IoU及IoU loss(注意只计算gt_on_fm的点(x,y)(x, y)(x,y)映射回im_x后的框):

4、tracking的流程


其中update的第二步都是和第一帧的特征做互相关
这里放一下penalty和window influence的语句吧:

#r_c和s_c分别是当前预测框和上一帧目标的ratio和scale的比值,越大惩罚越强
penalty = np.exp(-(r_c * s_c - 1) * penalty_k)
pscore = penalty * score
# cos window (motion model)
window_influence = self._hyper_params['window_influence']
pscore = pscore * (1 - window_influence) + self._state['window'] * window_influence
best_pscore_id = np.argmax(pscore)

最后返回原图进行框中心的确定,然后采用线性更新策略来更新当前帧的框的大小:

pred_in_crop = box_wh[best_pscore_id, :] / np.float32(scale_x)
# about np.float32(scale_x)
# attention!, this casting is done implicitly
# which can influence final EAO heavily given a model & a set of hyper-parameters# box post-postprocessing
test_lr = self._hyper_params['test_lr']
lr = penalty[best_pscore_id] * score[best_pscore_id] * test_lr
res_x = pred_in_crop[0] + target_pos[0] - (x_size // 2) / scale_x
res_y = pred_in_crop[1] + target_pos[1] - (x_size // 2) / scale_x
res_w = target_sz[0] * (1 - lr) + pred_in_crop[2] * lr
res_h = target_sz[1] * (1 - lr) + pred_in_crop[3] * lr

原文关于测试阶段的描述

5、Bonus

视频讲解:https://www.bilibili.com/video/BV1Hp4y1S74D/

PS

  • 源码阅读笔记下载:https://download.csdn.net/download/laizi_laizi/12676399
    videoanalyst/pipeline/utils/crop.py下的cv2.warpAffine的用法可以参考这篇
  • 另一篇anchor-free tracking代码的讲解:关于SiamKPN代码的一些要点,里面总结了两个算法中coordinate remapping的写法。

关于SiamFC++代码的几个要点相关推荐

  1. SiamFC代码配置复现 matlab版本

    原创 SiamFC代码配置复现 2019-04-29 22:18:06 ZZXin_ 阅读数 1603更多 分类专栏: 深度学习 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议 ...

  2. SiamFC代码大乱炖 (pytorch)

    写前bb 最早是看了matlab的代码,搭了环境,demo也跑了,就再也没碰过了.之后想自己把测试和训练部分全部跑通,找了个用pytorch写的代码,看的过程中发现自己还是很多细节部分不是很清楚.虽然 ...

  3. 金融低代码开发平台建设要点与方法论

    近日,EAWorld汇聚专家智慧重磅推出<重塑>直播栏目,首期即聚焦金融领域数字化转型及建设低代码开发平台的演进历程,介绍了金融低代码开发平台建设要点与方法论.  访谈问题概览: 1. 金 ...

  4. 代码整洁之道要点(一)

    本系列出自于本人看过<代码整洁之道>后总结的一部分要点. 非常感谢这本书给我和广大程序员带来的快乐! 注: 需要该书电子版的朋友请私信我. 推荐歌曲:Try - Marlisa 阅读本书的 ...

  5. 如何将深度学习研究论文实现为代码的几个要点

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:Bipin Krishnan P 编译:ronghuaiyang 导读 如果深度学习是一种超能力 ...

  6. java 重用性_提高Java代码重用性的三个方法

    三种修改现有代码提高其可重用性的方法,它们分别是:改写类的实例方法,把参数类型改成接口,选择最简单的参数接口类型. 措施一:改写类的实例方法 通过类继承实现代码重用不是精确的代码重用技术,因此它并不是 ...

  7. 三、K3 Cloud 开发插件《K3 Cloud插件开发新手指导 + K3 Cloud插件开发代码调试》

    案例需求:在销售订单上新增一个按钮,在订单明细中新增一个字段,命名[即时库存]. 点击按钮,弹出"Hello World!",并获取订单明细物料的即时库存,填入字段[即时库存]. ...

  8. jquery.desktop.js 代码分析

    jquery.desktop.js是一个用来在网页上显示类似桌面效果的东东,下面分析其代码: // // Namespace - Module Pattern. // var JQD = (funct ...

  9. 如何提高Java代码的可重用性?

    提高java代码可重用性有哪些方法措施,以下就讲解了三种关于提高java代码可重用性的措施,一起来了解一下吧~ 改写类的实例方法 通过类继承实现代码重用不是精确的代码重用技术,因此它并不是最理想的代码 ...

  10. eds800变频器故障代码_干货|三菱变频器故障剖析,及严重故障和轻微故障判断技巧!...

    判断三菱变频器严重故障和轻微故障的技巧方法,我觉得这个逻辑值得大家借鉴学习和尝试处理.下面先为大家分享三菱变频器故障进行剖析: 01常见故障分析 1.UVT故障 UVT为欠压故障,相信很多客户在使用中 ...

最新文章

  1. mongoTemplate 条件查询
  2. SICP 习题 (2.7) 解题总结 : 定义区间数据结构
  3. 阿里云服务器重启出现An error occurred 如何处理
  4. java中使用jython_将Jython嵌入到您的Java代码库中
  5. C# 的Delegate(委托)
  6. 斐波那契数列不用数组_兔子数列——斐波那契数列
  7. 「Python基础知识」Python字符串是什么,如何使用
  8. 零基础的人也能学好C++
  9. Atitit atimvc rest原理与自定义实现t33 目录 1.1. Web.xml 1 1.2. MvcFilter 2 1.3. jerserMeth 4 原理 过滤器 过滤即可
  10. python pandas中文手册-Pandas速查手册中文版(转)
  11. python笔记整理
  12. 【ASE学习】-测量石墨烯结构的碳碳键平均键长
  13. 江苏2021高考成绩查询全省排名,江苏省高考排名对应大学-江苏考生位次查询(2021年参考)...
  14. 老陕解读:陕西10大泡馍的品尝诀窍
  15. 为程序员讨回失去的午觉,我被投诉了,差点吃官司
  16. flea-jersey使用之Flea RESTful接口介绍
  17. 论文解读:基于深度相机的3D建模 2020最新综述
  18. VS+Opencv出现:xxx处有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置xxx处。
  19. Python数据分析训练营——Python数据分析之Panads-1
  20. 教学|3DSMAX制作爆炸粒子的技巧,游戏特效这么做

热门文章

  1. 读《计算机网络》——深入浅出——以考研为目标学技术面试知识二刷计网——计算机网络体系结构
  2. 黑苹果声卡id注入对照表_黑苹果 声卡ID AppleALC ID,一篇查询就够了
  3. av_malloc 与 av_free 的函数原型
  4. 最流行的六大数据模型工具
  5. 北航计算机学院复试流程,2018北航计算机考研复试经验
  6. WS2811彩带驱动库函数
  7. 前端高效开发不得不知道的一些JavaScript库!
  8. OPPO R9s刷机教程 可解锁线刷包 救砖升级
  9. 逻辑函数的化简-代数法化简
  10. Linux命令行连接WiFi