关于SiamFC++代码的几个要点
关于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分支:在四个通道
ltrb
的gt_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)−y0b∗=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++代码的几个要点相关推荐
- SiamFC代码配置复现 matlab版本
原创 SiamFC代码配置复现 2019-04-29 22:18:06 ZZXin_ 阅读数 1603更多 分类专栏: 深度学习 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议 ...
- SiamFC代码大乱炖 (pytorch)
写前bb 最早是看了matlab的代码,搭了环境,demo也跑了,就再也没碰过了.之后想自己把测试和训练部分全部跑通,找了个用pytorch写的代码,看的过程中发现自己还是很多细节部分不是很清楚.虽然 ...
- 金融低代码开发平台建设要点与方法论
近日,EAWorld汇聚专家智慧重磅推出<重塑>直播栏目,首期即聚焦金融领域数字化转型及建设低代码开发平台的演进历程,介绍了金融低代码开发平台建设要点与方法论. 访谈问题概览: 1. 金 ...
- 代码整洁之道要点(一)
本系列出自于本人看过<代码整洁之道>后总结的一部分要点. 非常感谢这本书给我和广大程序员带来的快乐! 注: 需要该书电子版的朋友请私信我. 推荐歌曲:Try - Marlisa 阅读本书的 ...
- 如何将深度学习研究论文实现为代码的几个要点
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:Bipin Krishnan P 编译:ronghuaiyang 导读 如果深度学习是一种超能力 ...
- java 重用性_提高Java代码重用性的三个方法
三种修改现有代码提高其可重用性的方法,它们分别是:改写类的实例方法,把参数类型改成接口,选择最简单的参数接口类型. 措施一:改写类的实例方法 通过类继承实现代码重用不是精确的代码重用技术,因此它并不是 ...
- 三、K3 Cloud 开发插件《K3 Cloud插件开发新手指导 + K3 Cloud插件开发代码调试》
案例需求:在销售订单上新增一个按钮,在订单明细中新增一个字段,命名[即时库存]. 点击按钮,弹出"Hello World!",并获取订单明细物料的即时库存,填入字段[即时库存]. ...
- jquery.desktop.js 代码分析
jquery.desktop.js是一个用来在网页上显示类似桌面效果的东东,下面分析其代码: // // Namespace - Module Pattern. // var JQD = (funct ...
- 如何提高Java代码的可重用性?
提高java代码可重用性有哪些方法措施,以下就讲解了三种关于提高java代码可重用性的措施,一起来了解一下吧~ 改写类的实例方法 通过类继承实现代码重用不是精确的代码重用技术,因此它并不是最理想的代码 ...
- eds800变频器故障代码_干货|三菱变频器故障剖析,及严重故障和轻微故障判断技巧!...
判断三菱变频器严重故障和轻微故障的技巧方法,我觉得这个逻辑值得大家借鉴学习和尝试处理.下面先为大家分享三菱变频器故障进行剖析: 01常见故障分析 1.UVT故障 UVT为欠压故障,相信很多客户在使用中 ...
最新文章
- mongoTemplate 条件查询
- SICP 习题 (2.7) 解题总结 : 定义区间数据结构
- 阿里云服务器重启出现An error occurred 如何处理
- java中使用jython_将Jython嵌入到您的Java代码库中
- C# 的Delegate(委托)
- 斐波那契数列不用数组_兔子数列——斐波那契数列
- 「Python基础知识」Python字符串是什么,如何使用
- 零基础的人也能学好C++
- Atitit atimvc rest原理与自定义实现t33 目录 1.1. Web.xml	1 1.2. MvcFilter	2 1.3. jerserMeth	4 原理 过滤器 过滤即可
- python pandas中文手册-Pandas速查手册中文版(转)
- python笔记整理
- 【ASE学习】-测量石墨烯结构的碳碳键平均键长
- 江苏2021高考成绩查询全省排名,江苏省高考排名对应大学-江苏考生位次查询(2021年参考)...
- 老陕解读:陕西10大泡馍的品尝诀窍
- 为程序员讨回失去的午觉,我被投诉了,差点吃官司
- flea-jersey使用之Flea RESTful接口介绍
- 论文解读:基于深度相机的3D建模 2020最新综述
- VS+Opencv出现:xxx处有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置xxx处。
- Python数据分析训练营——Python数据分析之Panads-1
- 教学|3DSMAX制作爆炸粒子的技巧,游戏特效这么做