MDNet论文及代码解析

MDNet论文及代码解析

       楼主最近在负责一个tracking相关的项目,需要用基于深度学习的方法来做,因此在调研相关文献,看到这篇MDNet的paper,在这里与大家分享一下对论文以及代码的理解,整理自己的思路,同时也希望能给正在做或者有志于做tracking的朋友们提供一点帮助。MDNet是目标跟踪竞赛VOT2015[^1]的冠军,在本届比赛中,深度学习开始进击tracking领域,因此MDNet的出现有里程碑式的意义。论文全名是《MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking》,作者提供的源码包括matlab和python两个版本,楼主针对python版本谈谈自己的理解(其实就是不会matlab),paper、源码链接分别如下:paperMATLAB源码Python源码

Background

       CNN大举进击计算机视觉领域,在图像分类、语义分割、目标检测等任务中都取得了傲人的战绩。作者认为CNN成功的关键在于其强大的特征表征能力(嗯嗯,我也这么想~),但是!目前(2015年)CNN在tracking领域的应用还相对较少,原因主要有二:1.不同于classification、detection等任务,针对tracking的特定训练数据集(楼主的理解是:大批量的视频,每一帧准确的bbox标注,同时需要保证场景、目标等的丰富性,emmm······)很难获取;2.虽然通过ImageNet的迁移学习能起到一定的作用,但是分类和跟踪毕竟是不同的domain,识别目标label和定位任意类别目标的位置是有明显差异的。

Motivation

       众所周知,图像classification的模型训练过程通常包括数据的预处理、导入、前向传播、损失函数计算、反向传播等过程,通过将处理过的图片导入,将output与图片对应的label值计算loss,通过反向传播更新参数,实现训练过程。那么,为什么这套流程不能直接应用于tracking中呢?除去目标在不同视频序列中的形态、尺寸、光照条件等的差异外,不同序列中关于前景和背景的定义是不同的。不同于分类和检测,跟踪的任务事先是不知道目标的类别的,对于任意的类别,网络需要去区分前景和背景,某个目标在一个视频序列中作为前景存在,但是在另一视频序列中,由于标注时指定的跟踪对象不同,该目标可能是作为背景存在的,这在单目标跟踪的任务中尤为常见。如下图所示,图左图右分别来自同一视频的两个不同训练序列,图左序列跟踪object A,那么A对应的标签即为前景,然而在图右中,标注指定的跟踪对象是object B,那么此时object B的标签为前景,而object A的标签在这里为背景。因此,如果直接用这两段视频做训练,训练出来的网络是很难识别哪个才是需要跟踪的目标的。那么如何解决这个这个前景背景定义的差异性问题呢?这正是本文的出发点和创新所在。
在这里插入图片描述

Idea

       为了解决目标在不同序列中定义差异的问题,本文提出了multi-domain的训练方式,其依据和目的所在,可以引用原文的一句话来说明,“there still exist some common properties that are desirable for target representations in all domains, such as robustness to illumination changes, motion blur, scale variations, etc.”即通过这种训练方式去学习目标的一些通用的特征,如尺度变化、运动模糊和光照变化等。这里先上一张MDNet的结构图,可以看到,前面的三个卷积层和两个全连接层是公用的,而对应不同的视频序列,分别有一个单独的全连接层fc6,这就是本文的multi-domain结构。所谓的multi-domain learning,就是将不同domain的数据(不同视频序列)分别纳入学习过程,当某个序列参与训练的时候,只有其对应的fc6是有效的。这样就也避免了目标前景背景定义不一致的问题,使得网络能够学到关于目标的通用性特征(domain-independent representations)。(楼主语文水平堪忧~如果这里的解释没有听明白,请直接查阅原文或者参考这篇博客)。
在这里插入图片描述

The basis of small network

       可以看到,网络的结构非常简单,抛开池化层、dropout层不谈,网络只有6层。作者在文中解释了为什么设计一个小网络,原因主要有以下4点:
1.对一个domain而言,网络只需要识别样本是目标还是背景,任务相对简单。
2.tracking任务涉及对目标的定位,网络设计过深必然导致过度下采样,使得空间信息大量丢失,不利于定位。
3.tracking中的目标通常较小,那么需要输入的图片尺寸较小(107*107),那么网络自然不能设计过深(下采样的次数有限)。
4.训练(update阶段)和测试需要在线进行,小网络能够满足实时性需求。

Training

       楼主窃以为,了解一个网络,主要关注的几点就是网络的设计思想与依据、训练数据的形式(网络的输入)、训练的策略、损失函数的形式、网络的输出及后处理方式。关于网络的设计思想,在前一部分中已经讲过。这里主要结合源码在谈一下剩下几点。

The Input of the Network

       首先需要明确的一点是,网络的训练数据集是视频序列!MDNet是以视频序列进行训练的,但是具体到网络的输入形式,则是单独的视频帧图像,对视频逐帧进行前向、反向计算。下列代码是读取数据及构建训练dataset的过程,作者选择VOT-OTB和ImageNet-VID两种数据集分别进行网络的预训练。注意这里的RegionDataset这个类,通过uniform分布在gt位置随机取样,构建包含正、负样本的训练集。

    with open(opts['data_path'], 'rb') as fp:
        data = pickle.load(fp)
    K = len(data)
    dataset = [None] * K
    for k, seq in enumerate(data.values()):
        dataset[k] = RegionDataset(seq['images'], seq['gt'], opts)

       这里还需要关注的一个细节是,在网络的训练过程中,所有的卷积层和全连接层参数均设置为可学习的,这与后面测试阶段有很大区别:

# training
lr: 0.0001
grad_clip: 10
lr_mult: {
   "fc": 10}
ft_layers: ["conv", "fc"]   #layers needed to be updated  
n_cycles: 100
Training Strategy

       这里直接上代码,这是源码中关于训练的主循环部分。关于网络的训练,这篇博客中做了细致的梳理。fc6分支的数量K与训练视频的个数一致,在每个epoch中,当某个视频参与训练时,只有与之对应的fc6生效。样本生成器会随机从该视频的前8帧图像中,以gt为基础选择32个正样本和96个负样本,进行前向、反向传播。在下一个epoch再次处理该视频序列时,会从接下来的8帧图像中取样。梳理一下&#

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值