bilylee / SiamFC-TensorFlow

A TensorFlow implementation of the SiamFC tracker
MIT License
366 stars 112 forks source link

无法使用自己训练的网络 #14

Closed Angel-Jia closed 6 years ago

Angel-Jia commented 6 years ago

你好,我现在正在复现siamfc网络,但在你的框架下始终无法复现结果。 我先自己训练了一个用pytorch写的siamfc,替换了原作者放出的tensorflow版本的siamfc中的网络,可以复现结果。代码可见:https://github.com/huanglianghua/siamfc-pytorch

主要网络部分如下:

    def __init__(self):
        super(SiameseNet, self).__init__()

        self.conv1 = nn.Sequential(
            nn.Conv2d(3, 96, 11, 2),
            nn.BatchNorm2d(96),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(3, 2)
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(96, 256, 5, 1, groups=2),
            nn.BatchNorm2d(256),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(3, 2)
        )
        self.conv3 = nn.Sequential(
            nn.Conv2d(256, 384, 3, 1),
            nn.BatchNorm2d(384),
            nn.ReLU(inplace=True)
        )
        self.conv4 = nn.Sequential(
            nn.Conv2d(384, 384, 3, 1, groups=2),
            nn.BatchNorm2d(384),
            nn.ReLU(inplace=True)
        )
        self.conv5 = nn.Sequential(
            nn.Conv2d(384, 32, 3, 1, groups=2)
        )
        self.branch = nn.Sequential(
            self.conv1,
            self.conv2,
            self.conv3,
            self.conv4,
            self.conv5
        )
        self.bn_adjust = nn.BatchNorm2d(1)

    def forward(self, z, x):
        z = self.branch(z)
        x = self.branch(x)

        out = self.xcorr(z, x)
        out = self.bn_adjust(out)

        return out

然后我修改了你的框架,替换了inference.tracker中的网络。具体方法如下:

  1. 修改了inference_wrapper.inference_step(self, sess, input_feed)函数,使其返回self.search_imagesself.exemplar_images(我查看过返回的图像,没有问题)

  2. inference_wrapper.tracker中利用代码:

    outputs, metadata = self.siamese_model.inference_step(sess, input_feed)

    从outputs中拿到search_imagesexemplar_images,利用我自己的网络得到response,再用tf.image.resize_images放大8倍得到最后的输出response,替换原来的response

训练用的是datasets部分生成的数据,label的标签是0, 1分类,使用binary_cross_entropy_with_logits得到最后的loss

然而运行run_tracking.py后得到的效果很差,几乎追踪不到目标,我在想是不是因为response的范围不同造成的?希望能指点一下,谢谢!

bilylee commented 6 years ago

hi,

  1. response 响应图是否合理?
  2. upsample 是否使用了 bicubic upsamping,以及 align corner?
  3. 放大倍数应该是 16 ?
Angel-Jia commented 6 years ago

感谢你的回复!

  1. response我取出来看过没问题
  2. 使用的参数和代码里的一样:
    tf.image.resize_images(inputs, [272, 272],
                                         method=tf.image.ResizeMethod.BICUBIC,
                                         align_corners=True)
  3. 这里因为我有两个版本的网络,所以搞混了。但最后都是放大到[272, 272]

https://github.com/huanglianghua/siamfc-pytorch 这个链接是一个pytorch版本的siamfc,数据预处理和目标追踪的办法用的是原作者的代码,仅仅修改了网络,可以直接加载 baseline-conv5_e55.mat 来对目标进行追踪。我用它测试过VOT数据集,没有问题。 我把该网络按照上面的方法嵌入到你的代码中,运行出来的效果同样非常差。

Angel-Jia commented 6 years ago

刚刚我又看了几遍视频,感觉像是坐标没有同步跟新,检测出的方框位置几乎没有变过。

bilylee commented 6 years ago

那可以把每一帧的 search images 保存下来,看 search image 是否更新了?

Angel-Jia commented 6 years ago

我发现问题在哪了。在目标偏离search image的中心位置后,你的网络中的response的最大值会跟着一起偏离中心。而在我的网络中,repsonse的最大值始终处于中心的位置。 之后我让exemplar_images始终设置为第一张图片的exemplar_images,一切就都正常了。所以是在更新exemplar_images的步骤上有什么问题?但为什么你的网络就能正常运行呢?

bilylee commented 6 years ago

SiamFC 就是让 exemplar image 始终是第一张图片,不会更改的。如果每次让新的一帧的中心作为 exemplar image,那么exemplar image 和 search image 的中心差异会非常微小,search image中心的响应自然很大。

Angel-Jia commented 6 years ago

太感谢了!那是我没完全搞懂你的代码,我还以为你代码中的exemplar image是一直更新的。

bilylee commented 6 years ago

不客气 : )

zhangyujia0223 commented 6 years ago

你好,我根据cfnet的baseline(输入变了,网络步长减小)修改,直接只将configuration中的输入exemplar image大小改变成2552553,但好像不太对,能给点建议吗?还有我觉得是不是这个exemplar image每次都更新的话,遮挡问题就会跟踪的好很多。