当前位置: 首页 > 工具软件 > DIMP > 使用案例 >

ATOM、DiMP目标跟踪详细代码记录:测试

易成天
2023-12-01

ATOM目标跟踪

只记录跟踪运行过程,数据集及模型参数加载不想说。

第一帧 tracker.initialize(image, init_bbox)

  1. self.initialize_features():载入模型参数,并定义跟踪过程所需要的特征层。
  2. self.target_scale:bbox缩放比例(根据搜索区域(5h,5w)与预先设定的图片最大,最小比例);self.pos:bbox中心在图像上的坐标;self.target_sz:bbox的(h,w);self.base_target_sz:缩放后的(h,w)。
  3. self.img_sample_sz:图片的长宽,限制为网络stride(16)的倍数。
  4. self.init_learning():初始化与在线学习相关超参。
    1. self.feature_windows:特征窗函数(1,1,18,18),18=self.img_sample_sz/stride。
    2. self.filter_reg=0.1:正则项。
    3. self.projection_activation:在线学习参数W1后无激活函数
    4. 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之间的值经过这两个激活函数后才有一定区分
  5. self.generate_init_sample(image):生成样本30个,包含各种数据增强,以及dropout。每个样本的特征维度为(255,18,18)。
  6. self.init_iou_net:通过第一帧得到两个调制向量self.target_feat (256,1,1) (256,1,1)。
  7. self.init_project_matrix():在线学习的参数W1(64,256,1,1),初始化参数满足高斯分布。
  8. self.init_label_function:根据self.pos和transformer.shitf制定labels(30,1,18,18)。
  9. self.init_memory():初始化参数W1(250, 64, 18, 18)。
  10. self.init_optimization(train_x, init_y):初始化在线学习相关。
    1. self.joint_problem:初始化参数W2(1,64,4,4),计算残差W2(W1X)-labels。(30,256,18,18)->(30,64,18,18)->(30,1,18,18)
    2. self.joint_optimizer = GaussNewtonCG(),self.joint_optimizer.run(10,6):利用初始帧的30个样本优化W1和W2,共6次高斯牛顿迭代,每次又在内部迭代10次共轭梯度

后续帧tracker.track(image)

  1. 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)。
  2. self.localize_target(scores_raw):返回translation_vec(相对于图片中心的偏移), scale_ind(最大分数索引), s(最大分数), flag(‘not_found’ or ‘uncertain’ or None)。
  3. scores_raw(1,1,18,18)经过快速傅里叶变换->在频率内(18,18)->(288,288)->反变换得到scores(1,1,18,18)。
  4. 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
  5. 如果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返回就有了。
  6. 如果flag != “not found” and flag != “uncertain”:self.get_label_function()获取新的labels->self.update_memory()把新的位置和样本放进去之前的30个初始样本,最多放250个,共280个样本。
  7. 如果flag == “hard_negative”:self.filter_optimizer.run(5),1次高斯牛顿(包含5次共轭梯度);否则,每隔10帧1次高斯牛顿(包含5次共轭梯度)

DiMP目标跟踪

  1. 与ATOM的差别就在分类上,ATOM制定一个L2优化问题,通过高斯牛顿-共轭梯度法优化W1和W2两个参数进行分类。首先在第一帧利用30个初步学习W1,W2,后续不断更新。
  2. DiMP通过一个参数W来优化,初始的W是通过提取15个样本的bboxes的特征并求均值得到;然后再第一帧的时候迭代10次,所使用的优化方法为SteepestDescent。与ATOM的区别就在分类的方法,预测bbox的过程完全一致
    1. 生成13个样本提取特征(13,256,18,18),dropout2个,共15个样本(15,256,18,18)。
    2. 参数W初始化:通过PrRoi Pooling提取特征(15,256,4,4)->求平均(1,256,4,4)=W。
    3. 通过10次迭代得到最终的W(在论文中称为Predicted Model f,本质就是W)。
    4. 测试阶段把这个W作为核与后续帧(1,256,18,18)卷积(有padding,padding=2)->(1,18,18)Score prediction分数。
 类似资料: