【SOT】SiamFC代码笔记

代码来源:https://github.com/huanglianghua/siamfc-pytorch
结合siamfc-pytorch代码讲解的三篇博客
下面是阅读上述SiamFC代码时的笔记

preprocess data(数据预处理)

dataset.py

概括:通过index索引返回item = (z, x, box_z, box_x),然后经过transforms返回一对pair(z, x)

步骤:

  1. 根据 index 获得视频序列路径、标签、meta(可选)
  2. 滤除噪声图像,获得有效索引
  3. 如果有效索引大于2个的话,就从中随机挑选两个索引(间隔不超过T=100)
  4. 两个索引对应的图像分别作为 x, z (转化为RGB格式)
  5. 两个索引对应的图像所对应的标签分别作为box_z, box_x
  6. 对 (z, x, box_z, box_x) 进行 transforms 操作, 输出为(z, x)

transform.py

  • 输入:(z, x, box_z, box_x)
  • 输出:(z, x)

步骤:

  1. 对于 x 和 z 都进行如下操作:
    1. 将 box 的格式转化为 [y, x, h, w]
    2. crop 一块以 box 中心为中心、以 box 大小为基准稍大的 patch,然后 resize 成255的大小,如果需要的话用颜色的平均值进行 pad
  2. 对于 z :
    1. 随机resize(0.95 ~ 1.05)
    2. 从中间crop一块255-8大小的块,大小不够的话用颜色均值填充
    3. 随机crop一块255-2*8大小的块
    4. 从中间crop一块127大小的块,大小不够的话用颜色均值填充
    5. 转换为tensor
  3. 对于 x :
    1. 随机resize(0.95 ~ 1.05)
    2. 从中间crop一块255-8大小的块,大小不够的话用颜色均值填充
    3. 随机crop一块255-2*8大小的块
    4. 转换为tensor

处理后的效果:

siamfc.py(训练+测试)

train_over(训练过程)

  1. 设置为训练模式
  2. dataloader,本来__getitem__返回一对pair(z, x),经过dataloader的加载,还是z堆叠一起,x堆叠一起,并不是(z, x)绑定堆叠一起
  3. epoch 和 dataloader 的循环,train_step(batch, backward=True), 二值交叉熵损失
  4. 保存 checkpoint

train_step

输入: (z, x)
z: torch.Size([8, 3, 127, 127])
x: torch.Size([8, 3, 239, 239])

    x       z
    |       |
backbone backbone
    \       /
       head
        |
     responses
  ([8, 1, 15, 15])    _create_labels
        |             /
        |            /
            loss

_create_labels

  • exemplar image z 和search image x 都是以目标为中心的,所以labels的中心为1,中心以外为0。
  • 得到的一个batch下某一个通道下的label:

track(测试过程)

  • 输入视频的图像路径序列和第一帧的目标位置

init(self, img, box)

  • 传入第一帧的标签和图片,初始化一些参数,计算一些之后搜索区域的中心等等
  • @torch.no_grad()
  • 预处理类似于训练过程
  • 步骤:
    1. 设置 eval 模式
    2. 将 box 的格式变换为 [y, x, h, w],[y, x]为中心点
    3. 创建大小为272*272的汉宁窗并归一化
    4. 设置3个尺度因子:1.0375**(-1,0,1)
    5. 根据 box 大小设置稍大的z_sz, 而x_sz = z_sz * 255 / 127。这里可以看到,search images在resize之前的边长x_sz大约为target_sz的4倍,如论文中所说we only search for the object within a region of approximately four times its previous size
    6. 只对于 z: crop 一块以 box 中心为中心、以 box 大小为基准稍大(z_sz)的 patch,然后 resize 成 127 的大小,如果需要的话用颜色的平均值进行 pad
    7. 只对于 z: 送入 backbone,输出 self.kernel

update(self, img)

  • 传入后续帧,然后根据SiamFC网络返回目标的box坐标,之后就是根据这些坐标来show,起到一个demo的效果
  • @torch.no_grad()
  • 步骤:
    1. 设置 eval 模式
    2. 只对于 x: crop 一块以 init 中 box 中心为中心、x_sz * f(f 为缩放因子) 为大小的 patch,然后 resize 成 255 的大小,如果需要的话用颜色的平均值进行 pad, 不同的缩放因子对应的 x 拼接起来
    3. 只对于 x: 送入 backbone
    4. 只对于 x: 将 init 中得到的 z 的特征提取结果 self.kernel 和上一步 x 的特征提取结果一起送入 head, 得到 responses
    5. 将 responses 上采样为[3, 272, 272]的大小
    6. 对 responses 的第一个和第三个通道(除中间以外的两种尺度)进行惩罚(* 0.9745), 因为中间的尺度肯定是接近于1,其他两边的尺度不是缩一点就是放大一点,所以给以惩罚
    7. 选出 responses 3个通道里面最大的那个(索引为scale_id), 归一化, 并与汉宁窗加权求和(前者0.824后者0.176),通过 np.unravel_index 找到峰值点
    8. 在response图中找到峰值点后,计算其在原图img中的位置
    9. 调整 target_sz、z_sz、x_sz 的大小(根据尺度因子来调整;如果目标变大,这三个的尺寸也以相同的比例增大)
    10. 将8中得到的位置调整为[left, top, w, h]的格式

猜你喜欢

转载自blog.csdn.net/zylooooooooong/article/details/123192744