文章目录

  • 前言
  • 1、init
  • 2、update(tracking)

前言

  本文是SiamRPN代码分析的最后一篇test,代码从init和unpate(tracking)进行分析。


1、init

  init的主要任务是获得上分支的feature map与后续帧的feature map互相关,在获得127x127x3大小的目标模板图像后,要对其增加一个维度再输入网络,返回的分类卷积核和回归卷积核的shape分别为[10,256,4,4]、[20,256,4,4],这里名没有直接return返回这两个核,而是将它们存放在self里(SiamRPNTracker类),可以翻看第一篇architecture的分析;其次,init还要获取当前目标的位置,高宽等,后续update要对其进行更新,也就是预测新的目标位置和目标大小。

#初始帧def init(self, frame, bbox):#[l,t,w,h]->[center_x,center_y,w,h]self.bbox = np.array([bbox[0]-1 + (bbox[2]-1) / 2 , bbox[1]-1 + (bbox[3]-1) / 2 , bbox[2], bbox[3]])#获取目标中心点[c_x,c_y]以便后续使用self.pos = np.array([bbox[0]-1 + (bbox[2]-1) / 2 , bbox[1]-1 + (bbox[3]-1) / 2])#获取目标宽高[w,h]以便后续使用self.target_sz = np.array([bbox[2], bbox[3]])#获取目标宽高[w,h]以便后续使用self.origin_target_sz = np.array([bbox[2], bbox[3]])#获取需要图像R/G/B均值   img_mean.shape=(1,1,3)self.img_mean = np.mean(frame, axis=(0, 1))#获取模板图像#返回127x127x3大小的图像exemplar_img = get_exemplar_image(frame, self.bbox,config.exemplar_size, config.context_amount, self.img_mean)#增加一个batch维度再输入网络exemplar_img = self.transforms(exemplar_img)[None, :, :, :]self.model.track_init(exemplar_img.cuda())

2、update(tracking)

  update过程还是follow代码流程来分析

    def update(self, frame):#传入上一帧的bbox,以及保持初始帧的img_mean不变来填充后续所有帧#返回271x271x3大小的图片、缩放因子是271/(上下文信息x271/127)instance_img_np, _, _, scale_x = get_instance_image(frame, self.bbox, config.exemplar_size,config.instance_size, config.context_amount, self.img_mean)"""————————————————得到分类分数和回归参数————————————"""#增加一个batch维度再送入网络instance_img = self.transforms(instance_img_np)[None, :, :, :]#返回score.shape=[1,10,19,19],regression.shape=[1,20,19,19]pred_score, pred_regression = self.model.track_update(instance_img.cuda())#[1,10,19,19]->[1,2,5*19*19]->[1,1805,2] conf即置信度pred_conf = pred_score.reshape(-1, 2, config.anchor_num * config.score_size * config.score_size).permute(0,2,1)#[1,20,19,19]->[1,4,5*19*19]->[1,1805,4] offset即位移,对anchor微调pred_offset = pred_regression.reshape(-1, 4,config.anchor_num * config.score_size * config.score_size).permute(0,2,1)

先获得271x271x3大小的检测图像,扩维后将其输入网络,得到互相关的输入,再调用track_update方法得到分类分数和回归参数,之后就是这两者shape变换,以便后续使用。

     #传入的anchor(1805,4) delta(1805,4),delta是回归参数,对anchor进行调整,返回调整后的anchor,即pre_box(1805,4)box_pred = box_transform_inv(self.anchors, delta)#pred_conf=[1,1805,2]#score_pred.shape=torch.Size([1805]) 取1,表示取正样本score_pred = F.softmax(pred_conf, dim=2)[0, :, 1].cpu().detach().numpy()#计算预测分类得分

将1805组回归参数应用于1805个anchor,使其位置信息更加准确,并对分类分数的前景值进行softmax处理,得到1805个和为1的数,之后找到最大的数,该最大值对应的anchor就是预测框。

     #尺度惩罚 一个>1的数s_c = change(sz(box_pred[:, 2], box_pred[:, 3]) / (sz_wh(self.target_sz * scale_x)))#比例惩罚 一个>1的数r_c = change((self.target_sz[0] / self.target_sz[1]) / (box_pred[:, 2] / box_pred[:, 3]))# 尺度惩罚和比例惩罚 penalty_k=0.22,penalty最大为1,即不惩罚penalty = np.exp(-(r_c * s_c - 1.) * config.penalty_k)pscore = penalty * score_pred#对每一个anchors的正样本分类预测分数×惩罚因子pscore = pscore * (1 - config.window_influence) + self.window * config.window_influence #再乘以余弦窗max_pscore_id= np.argmax(pscore) #返回最大得分的索引id

惩罚的前提是假设目标在相邻帧的大小(尺度以及高宽比例)变化,所以增加了尺度和比例两个惩罚项,又假设目标在相邻帧的位置变化也不会太大,所以使用余弦窗来抑制大位移,正如论文所言,使用penaltypenaltypenalty来抑制尺度和比例的大变化,余弦窗口抑制大位移。在代码penaltypenaltypenalty公式中,倘若anchor的大小和比例与上一帧接近,s_c和r_c这两个值就都为1,penaltypenaltypenalty=e^0=1,即不惩罚。通过penaltypenaltypenalty和余弦窗之后,得到最大的的前景分值索引,记为max_pscore_id。

  得到max_pscore_id后意味着找到了前景分数最大的anchor作为预测框,上面,已经对其进行了微调,所以现在得到的anchor就是最终的预测框了。接下来就是拿取新的预测框的中心位置和大小去更新目标状态,就不分析了。
  还有一点忘了说,nms操作在测试过程并没有使用,而论文却提到要使用nms来获取最终的包围框,但我个人理解貌似并没太大意义,跟踪过程只要找到最大的前景分值即可,并不需要nms,nms是用来剔出重叠anchor的,而获取最大前景分值不涉及anchor的重叠关系,在检测任务当中nms是很重要的一步。

谢谢观看!

SiamRPN代码分析:test相关推荐

  1. 20145236《网络攻防》Exp4 恶意代码分析

    20145236<网络攻防>Exp4 恶意代码分析 一.基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些 ...

  2. C#中类的继承 override virtual new的作用以及代码分析

    继承中override virtual new的作用 virtual 父类中需要注明允许重写的方法: override 子类中必须显示声明该方法是重写的父类中的方法: new 子类中忽略父类的已存在的 ...

  3. 2017.4.18 静态代码分析工具sonarqube+sonar-runner的安装配置及使用

    配置成功后的代码分析页面: 可以看到对复杂度.语法使用.重复度等等都做了分析,具体到了每一个方法和每一句代码. 四种使用方式: sonarqube + sonar-runner sonarqube + ...

  4. lighttpd1.4.18代码分析

    lighttpd1.4.18代码分析(八)--状态机(2)CON_STATE_READ状态 posted @ 2008-09-24 10:50 那谁 阅读(2225) | 评论 (1)  编辑 lig ...

  5. Device Tree(三):代码分析

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请 ...

  6. 使用Hadoop和ELK进行业务代码分析!分分钟捉到Bug!

    大数据是计算领域的新高地,它有望提供一种方法来应对二十一世纪不断增长的数据生成.越来越多的大数据爱好者正在涌现,越来越多的公司正在采用各种大数据平台,并希望提出以客户为中心的解决方案,帮助他们在竞争激 ...

  7. 20145328 《网络对抗技术》恶意代码分析

    20145328 <网络对抗技术>恶意代码分析 ------看到这句话说明还没写完-------- 实践内容: 使用schtasks指令监控系统运行 使用sysmon工具监控系统运行 使用 ...

  8. starGAN原理代码分析

    下载: git clone https://github.com/yunjey/StarGAN.git 1 cd StarGAN/ 1 下载celebA训练数据: bash download.sh 1 ...

  9. tensorflow笔记:多层CNN代码分析

    tensorflow笔记系列:  (一) tensorflow笔记:流程,概念和简单代码注释  (二) tensorflow笔记:多层CNN代码分析  (三) tensorflow笔记:多层LSTM代 ...

  10. ARM裸机篇---启动代码分析

    ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...

最新文章

  1. tar exclue文件夹
  2. [云炬创业学笔记]第二章决定成为创业者测试12
  3. runtime--实现篇02(Category增加属性)
  4. javaweb应用开发与实践pdf_基于阿里云打造「云原生」Web应用——「懒猪行」Web应用开发实践...
  5. delphi 到出execl2010 文件损坏_如何修复Linux中损坏的软件包?
  6. Java优先级队列PriorityQueue
  7. 20145234黄斐《信息安全系统设计基础》第十周
  8. Java中9大内置基本数据类型Class实例和数组的Class实例(转载)
  9. 离线语音识别技术品鉴——功能不同各有千秋
  10. 【BABY夜谈大数据】基于内容的推荐
  11. python求解在给定递减数组中寻找两个数和等于定值,乘积最小
  12. COOKIE和SESSION之间的区别以及用法
  13. Windows/Ubuntu搭建RTMP服务器+OBS推流+VLC拉流
  14. Java工程师进阶,Java全栈知识体系
  15. 相对论学习入门资料集
  16. VisualAssistX无法加载,加载问题异常解决
  17. 从0到1400star,从阮一峰周刊到尤雨溪推荐,小透明开源项目的2021年总结
  18. SpringBoot整合Redis集群
  19. python列表的方法详解
  20. 手机系统应用STK 问题总结

热门文章

  1. 微信文件没下载过期了
  2. 谷歌浏览器插件 - 为 Microsoft Bing 搜索引擎首页添加一个【保存背景图片】的按钮(版本 2)
  3. 面试最后问你期望薪酬_我不能问你的薪水历史吗? 谢谢!
  4. 前端判断文件后缀名_JS - 获取文件后缀,判断文件类型(比如是否为图片格式)...
  5. 关于工信部191号文《App违法违规收集使用个人信息行为认定方法》的评估
  6. 【8023】产品与营销的合作关系 产品10大败因
  7. Android Intent跳转第三方地图应用,传入地址
  8. java mpp转图片,Java使用mpxj导入.mpp格式的Project文件(甘特图)
  9. 锁定计算机后等于睡眠吗,详细教你电脑休眠和睡眠的区别
  10. 为什么要使用Memcached