代码来源: 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
    \       /
     responses
  ([8, 1, 15, 15])    _create_labels
        |             /
        |            /

_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]的格式
训练过程训练过程,网络的最终输出是 17×17 的response map.网络的输入需要保证两条支路上目标物体在输入图片的中心位置,且目标物体在整幅图像中有一定的占比。对于模板图片模板图片大小: 127×127×3。以目标中心为裁剪中心,确定一个稍大的正方形(记边长为 C )裁剪区域(可能会超出原图片,以图片颜色均值填充),然后再将裁剪区域resize到127×127大小。根据paper,C ... 1.什么是卷积? 对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。 非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。 2.什么是C... 目标跟踪是计算机视觉领域的一个重要分支。目前的目标跟踪的通常任务是,在视频的第一帧给定一个目标的矩形框,然后后续这个矩形框紧跟着要跟踪的物体。不过,目标跟踪与计算机视觉中的图像识别,分割,检测是分不开的,通常跟踪是这些分割检测的最后一步。 7.1.1 为什么使用目标追踪(Object Tr def track(self, img_files, box, visualize=False): frame_num = len(img_files) # 帧数 boxes = np.zeros((frame_num, 4)) 之前看了关于siamFC的论文、博客和代码,已经跑通了代码,但是,只是大概初步学习,没有认真的研究细节。为了后面更好的学习Siam系列的算法还是要重新认真的学习SiamFC。 先附上论文和代码。 论文:Fully-Convolutional Siamese Networks for Object Tracking 代码:基于pytorch框架的 对y的GT标记为y∈{+1,−1}y\in\{+1,-1\}y∈{+1,−1},有logistic loss ℓ(y,v)=log⁡(1+exp⁡(−yv)) \ell(y, v)=\log (1+\exp (-y v)) ℓ(y,v)=log(1+exp(−yv)) 其中,v由模板分支和候选分支的到的分数值。 Score map的损... SiamFC论文解读及代码实现 摘要:传统上,任意目标跟踪的问题是通过专门在线学习目标外观的模型来解决的,使用视频本身作为唯一的训练数据。尽管这些方法取得了成功,但他们的纯在线方法固有地限制了他们可以学习的模型的丰富性。最近,有人试图利用深层卷积网络的表达能力。然而,当要跟踪的目标事先未知时,需要在线执行随机梯度下降以适应网络的权重,这严重影响了系统的速度。在本文中,我们在ILSVRC15数据集上为视频中的目标检测配备了一个基本的跟踪算法和一个新的端到端训练的孪生神经网络。我们的跟踪器以超过实时的帧速率运 任意对象跟踪的问题是通过仅仅在线地学习对象外观的模型来解决,使用视频本身作为唯一的训练数据。尽管这些方法取得了成功,但他们的在线方法本质上限制了他们可以学习的模型的丰富性。需要跟踪的目标是通过起始帧的选择框给出的。框中可能是任意物体,甚至只是物体的某个部分。由于给定跟踪目标的不确定性,我们无法做到提前准备好数据,并且训练出一个. siamfc-pytorch代码讲解(一):backbone&head siamfc-pytorch代码讲解(二):train&siamfc 代码来自:https://github.com/huanglianghua/siamfc-pytorch 今天主要看一下demo的部分,也就是涉及到测试tracking的部分。 直接上代码: 一、demo.py fro... 命令行输入:run_tracker('vot15_bag',1)即可 运行其他视频图片,修改load_video_info里的 img、groundtruth等文件名,保持与自己的文件名一致即可;...