代码来源: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
- gray augmentation(可选): BGR->GRAY->BGR
- shift scale augmentation:
- if self.scale: (cx, cy, w, h)形式,中心点坐标不变,尺度缩放
- if self.shift: (x1, y1, x2, y2)形式,上下左右移动
- bbox 同样操作
- color augmentation
- blur augmentation
- flip augmentation
datasets.py(VIDYTBBLMDB)
- 在整个视频中随机抽取一帧作为模板帧,在模板帧前后 frame_range 的范围(不超过视频的长度)内随机抽取另一帧作为搜索帧
- 对模板帧和搜索帧做处理–>template_image, template_box, search_image, search_box(图片、目标框标签)
- 数据增强–>模板图像、搜索图像、搜索图像的bbox
- ⭐️ 设置 anchor,输出包含两种格式((x1, y1, x2, y2)、(cx, cy, w, h))
- ⭐️ 根据设置的 anchor 和真实的 bbox 来生成 cls, delta, delta_weight,即分类标签、回归标签、回归权重
- ⭐️ 最终输出的形式为{
‘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
- 只对于 z: crop 一块以 box 中心为中心、以 box 大小为基准稍大(s_z)的 patch,然后 resize 成 127 的大小,如果需要的话用颜色的平均值进行 pad
- 只对于 z: 送入 backbone
update(self, image)
- 输入一张subsequent frame,然后根据预测值,加以scale和ratio的penalty,然后用cosine window来suppress large displacement,然后根据分类分数的最高值对应的anchor来回归预测目标位置
- 只对于 x: crop 一块以 box 中心为中心、以 s_x 为大小(s_x=s_z*255/127)的 patch,然后 resize 成 255 的大小,如果需要的话用颜色的平均值进行 pad
- 只对于 x: 送入 backbone
- 将 init 中得到的 z 的特征提取结果和上一步 x 的特征提取结果一起送入 rpnhead, 得到 outputs
- ⭐️ 将 outputs 的分类预测和回归预测转化为 score(通过softmax) 和 pred_bbox(修正后的anchor)
- ⭐️ scale penalty、aspect ratio penalty、window penalty
- 找到峰值点
- ⭐️ 调整 bbox 的大小(用学习率调整)和位置,输出 bbox
- 更新目标大小(size)和位置(center_pos),为下一帧做准备
train.py(训练过程)
- 构建 SiamRPN 模型
- 构建数据集(VIDYTBBLMDB类)和dataloader
- 导入预训练模型(siamrpn.backbone)
- 固定预训练模型的参数
- 设置优化器和学习率调整策略
- 从第10个epoch开始将预训练模型的参数解除固定
- 将模板和搜索区域送入网络:siamrpn(data[‘template’], data[‘search’]),得到输出 pred_cls, pred_reg
- 将输出 pred_cls, pred_reg 与 data[‘label_cls’]、data[‘label_loc’]、data[‘label_loc_weight’] 计算损失
- 记录损失和时间等信息
- 梯度反传和优化器更新,一个epoch结束前学习率更新
- 保存模型