ATOM目标跟踪
只记录跟踪运行过程,数据集及模型参数加载不想说。
第一帧 tracker.initialize(image, init_bbox)
- self.initialize_features():载入模型参数,并定义跟踪过程所需要的特征层。
- self.target_scale:bbox缩放比例(根据搜索区域(5h,5w)与预先设定的图片最大,最小比例);self.pos:bbox中心在图像上的坐标;self.target_sz:bbox的(h,w);self.base_target_sz:缩放后的(h,w)。
- self.img_sample_sz:图片的长宽,限制为网络stride(16)的倍数。
- self.init_learning():初始化与在线学习相关超参。
- self.feature_windows:特征窗函数(1,1,18,18),18=self.img_sample_sz/stride。
- self.filter_reg=0.1:正则项。
- self.projection_activation:在线学习参数W1后无激活函数
- self.response_activation:在线学习参数W2后激活函数F.elu(F.leaky_relu(x, 1 / act_param = 20), act_param),通过观察,经过两次激活函数之后,小于-0.1的数值几乎都在[-0.04,-0.05],可能0到-0.1之间的值经过这两个激活函数后才有一定区分。
- self.generate_init_sample(image):生成样本30个,包含各种数据增强,以及dropout。每个样本的特征维度为(255,18,18)。
- self.init_iou_net:通过第一帧得到两个调制向量self.target_feat (256,1,1) (256,1,1)。
- self.init_project_matrix():在线学习的参数W1(64,256,1,1),初始化参数满足高斯分布。
- self.init_label_function:根据self.pos和transformer.shitf制定labels(30,1,18,18)。
- self.init_memory():初始化参数W1(250, 64, 18, 18)。
- self.init_optimization(train_x, init_y):初始化在线学习相关。
- self.joint_problem:初始化参数W2(1,64,4,4),计算残差W2(W1X)-labels。(30,256,18,18)->(30,64,18,18)->(30,1,18,18)
- self.joint_optimizer = GaussNewtonCG(),self.joint_optimizer.run(10,6):利用初始帧的30个样本优化W1和W2,共6次高斯牛顿迭代,每次又在内部迭代10次共轭梯度。
后续帧tracker.track(image)
- self.extract_processed_sample(image,self.pos,self.target_scale,self.img_sample_sz):提取后续帧图片的特征(1,256,18,18),再与W1,W2得到scores_raw(1,1,18,18)。
- self.localize_target(scores_raw):返回translation_vec(相对于图片中心的偏移), scale_ind(最大分数索引), s(最大分数), flag(‘not_found’ or ‘uncertain’ or None)。
- scores_raw(1,1,18,18)经过快速傅里叶变换->在频率内(18,18)->(288,288)->反变换得到scores(1,1,18,18)。
- self.localize_advanced(scores):获取最大分数的translation_vec1=disp*self.target_scale、scale_ind1和scores。如果分数小(<0.25),表示没有找到目标,返回translation_vec1、scale_ind、scores和flag=“not found”;如果分数足够大(>=0.25),mask中心区域,获取第二大分数的translation_vec2。
1. if score2>0.8score1: 返回位移小的translation_vec、scale_ind、s和"hard_negative";如果两个位移都很大,返回translation_vec1、scale_ind、s和"uncertain"
2. if score2>0.5score1 & score2>0.25:
3. else:如果上述条件都不符合,返回translation_vec1、scale_ind、s和None。 - 如果flag != “not found”:self.update_state()更新中心位置->self.refine_target_box(10,256,18,18)以中心位置和前一帧的(h,w)初始化10个(9+自身)随机偏移和大小的bboxes,提取其特征(10,256,36,36)并**通过self.init_iou_net()中得到的两个离线训练好的调制向量self.target_feat (256,1,1) (256,1,1)**得到分数(10,)->optimize_boxes():对这10个bboxes进行优化,计算输出分数对于4(x,y,h,w)的梯度来更新bboxes的位置,然后再次计算输出IoU分数,分数比原来大的再次更新。判定优化迭代有两个条件(新IoU分数小于上一次该bbox的IoU分数;最多迭代5次)->返回分数前3的bboxes的平均bbox。这一步tracker.track返回就有了。
- 如果flag != “not found” and flag != “uncertain”:self.get_label_function()获取新的labels->self.update_memory()把新的位置和样本放进去之前的30个初始样本,最多放250个,共280个样本。
- 如果flag == “hard_negative”:self.filter_optimizer.run(5),1次高斯牛顿(包含5次共轭梯度);否则,每隔10帧1次高斯牛顿(包含5次共轭梯度)。
DiMP目标跟踪
- 与ATOM的差别就在分类上,ATOM制定一个L2优化问题,通过高斯牛顿-共轭梯度法优化W1和W2两个参数进行分类。首先在第一帧利用30个初步学习W1,W2,后续不断更新。
- DiMP通过一个参数W来优化,初始的W是通过提取15个样本的bboxes的特征并求均值得到;然后再第一帧的时候迭代10次,所使用的优化方法为SteepestDescent。与ATOM的区别就在分类的方法,预测bbox的过程完全一致。
- 生成13个样本提取特征(13,256,18,18),dropout2个,共15个样本(15,256,18,18)。
- 参数W初始化:通过PrRoi Pooling提取特征(15,256,4,4)->求平均(1,256,4,4)=W。
- 通过10次迭代得到最终的W(在论文中称为Predicted Model f,本质就是W)。
- 测试阶段把这个W作为核与后续帧(1,256,18,18)卷积(有padding,padding=2)->(1,18,18)Score prediction分数。