【SOT】SiamRPN代码笔记

代码来源:https://github.com/laisimiao/siamrpn.pytorch
结合博客关于SiamRPN代码的一些要点
下面是阅读上述SiamRPN代码时的笔记

1、template frame和detection frame经过相同的Siamese Network得到一个feature,然后经过RPN的classification branch和regression branch,其中template作为kernel在detection上做correlation操作。

2、分类分支的作用就是预测原图上的哪些anchor会与目标的IoU大于一定的阈值,他们对应最后的feature map上的点就是1;回归分支就是预测每个anchor与target box的xywh的偏移

preprocess data(数据预处理)

augmentation.py

  1. gray augmentation(可选): BGR->GRAY->BGR
  2. shift scale augmentation:
    1. if self.scale: (cx, cy, w, h)形式,中心点坐标不变,尺度缩放
    2. if self.shift: (x1, y1, x2, y2)形式,上下左右移动
    3. bbox 同样操作
  3. color augmentation
  4. blur augmentation
  5. flip augmentation

datasets.py(VIDYTBBLMDB)

  1. 在整个视频中随机抽取一帧作为模板帧,在模板帧前后 frame_range 的范围(不超过视频的长度)内随机抽取另一帧作为搜索帧
  2. 对模板帧和搜索帧做处理–>template_image, template_box, search_image, search_box(图片、目标框标签)
  3. 数据增强–>模板图像、搜索图像、搜索图像的bbox
  4. ⭐️ 设置 anchor,输出包含两种格式((x1, y1, x2, y2)、(cx, cy, w, h))
  5. ⭐️ 根据设置的 anchor 和真实的 bbox 来生成 cls, delta, delta_weight,即分类标签、回归标签、回归权重
  6. ⭐️ 最终输出的形式为{
    ‘template’: template,
    ‘search’: search,
    ‘label_cls’: cls,
    ‘label_loc’: delta,
    ‘label_loc_weight’: delta_weight
    }

⭐️ 表示不同于 SiamFC 的地方

SiamRPN(model.py)

    z       x
    |       |
backbone backbone
    \       /
     RpnHead
    /       \
  cls       reg

AlexNet

backbone

RpnHead

cls:
       z_ft        x_ft
        |           |
      Conv2d      Conv2d
 [N,2K*256,4,4][N, 256, 20, 20]
        \           /
            Conv2d
              |
           pred_cls(cross_entropy)
reg:
       z_ft        x_ft
        |           |
      Conv2d      Conv2d
 [N,4K*256,4,4][N, 256, 20, 20]
        \           /
            Conv2d
              |
           pred_reg(smooth L1)

SiamRPNTracker(track.py,测试过程)

  • 设置为 eval 模式

init(self, image, box)

  • 这部分就是利用第一帧的先验信息,包括第一帧图片和ground truth bbox,相当于一个one-shot detection,这个template frame就固定了,相当于一个kernel
  1. 只对于 z: crop 一块以 box 中心为中心、以 box 大小为基准稍大(s_z)的 patch,然后 resize 成 127 的大小,如果需要的话用颜色的平均值进行 pad
  2. 只对于 z: 送入 backbone

update(self, image)

  • 输入一张subsequent frame,然后根据预测值,加以scale和ratio的penalty,然后用cosine window来suppress large displacement,然后根据分类分数的最高值对应的anchor来回归预测目标位置
  1. 只对于 x: crop 一块以 box 中心为中心、以 s_x 为大小(s_x=s_z*255/127)的 patch,然后 resize 成 255 的大小,如果需要的话用颜色的平均值进行 pad
  2. 只对于 x: 送入 backbone
  3. 将 init 中得到的 z 的特征提取结果和上一步 x 的特征提取结果一起送入 rpnhead, 得到 outputs
  4. ⭐️ 将 outputs 的分类预测和回归预测转化为 score(通过softmax) 和 pred_bbox(修正后的anchor)
  5. ⭐️ scale penalty、aspect ratio penalty、window penalty
  6. 找到峰值点
  7. ⭐️ 调整 bbox 的大小(用学习率调整)和位置,输出 bbox
  8. 更新目标大小(size)和位置(center_pos),为下一帧做准备

train.py(训练过程)

  1. 构建 SiamRPN 模型
  2. 构建数据集(VIDYTBBLMDB类)和dataloader
  3. 导入预训练模型(siamrpn.backbone)
  4. 固定预训练模型的参数
  5. 设置优化器和学习率调整策略
  6. 从第10个epoch开始将预训练模型的参数解除固定
  7. 将模板和搜索区域送入网络:siamrpn(data[‘template’], data[‘search’]),得到输出 pred_cls, pred_reg
  8. 将输出 pred_cls, pred_reg 与 data[‘label_cls’]、data[‘label_loc’]、data[‘label_loc_weight’] 计算损失
  9. 记录损失和时间等信息
  10. 梯度反传和优化器更新,一个epoch结束前学习率更新
  11. 保存模型
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值