由1,2可知基于标准分类任务的普通学习方法是不合适的,另一种为了得到更好的跟踪特征表示而获得视频序列独立信息的方法应该被采纳,所以提出了MDNet。
self.K = K # 分支数目
# 共享层
self.layers = nn.Sequential(OrderedDict([
('conv1', nn.Sequential(nn.Conv2d(3, 96, kernel_size=7, stride=2),
nn.ReLU(),
LRN(),
nn.MaxPool2d(kernel_size=3, stride=2))),
('conv2', nn.Sequential(nn.Conv2d(96, 256, kernel_size=5, stride=2),
nn.ReLU(),
LRN(),
nn.MaxPool2d(kernel_size=3, stride=2))),
('conv3', nn.Sequential(nn.Conv2d(256, 512, kernel_size=3, stride=1),
nn.ReLU())),
('fc4', nn.Sequential(nn.Dropout(0.5),
nn.Linear(512 * 3 * 3, 512),
nn.ReLU())),
('fc5', nn.Sequential(nn.Dropout(0.5),
nn.Linear(512, 512),
nn.ReLU()))]))
# 分支层
self.branches = nn.ModuleList([nn.Sequential(nn.Dropout(0.5),
nn.Linear(512, 2)) for _ in range(K)])
以conv1为例,输入是107*107*3,kernel_size=7,stride=2,所以输出是 , n(input)=107, f(filter)=7, p(padding)=0, s(stride)=2.
所有域中的目标表示存在一些常见描述属性,例如对照明变化的鲁棒性,运动模糊,尺度变化等。为了提取满足这些公共属性的有用特征,通过结合多域学习框架将域独立信息与域特定信息分开。
使用SGD(随机梯度下降)方法进CNN的训练,每次迭代对所有的域独立的进行处理,具体的训练方法如下:
1.第一次迭代,用来自第一个视频序列的mini-batch进行网络更新(按顺序取8帧即可,因为此时第一个视频序列已经被打乱了顺序; 且此时的第一个视频序列不一定是原来的第一个视频序列,因为K个视频序列的顺序也已被打乱)
2.第二次迭代,用来自第二个视频序列的mini-batch进行网络更新
......
第N次迭代,用来自第(N mod K)个视频序列的mini-batch进行网络更新(此时,整个数据集已经循环了N//K次)
迭代直到网络收敛或迭代次数达到设定值,通过这种学习方式,将域独立信息(共享层学习)和域特定信息(对应的FC6分支层学习)分离开
假设用k个视频进行训练,共进行N次循环,每个mini-batch是由某个视频序列中随机采集8帧图片,在这8帧图片中随机采集32个正样本区域和96个负样本区域(总计128个)
在每次循环中会依次进行k次迭代,从k个视频序列中取出一个mini-batch进行训练,每个视频序列对应自己的FC6层,通过这样的训练共享层可以学习到各个视频序列中的域独立信息,对应的FC6层可以学习到对应视频序列的域特定信息,重复进行N次循环
以第一个视频序列为例,由于采用SGD方法训练,所以首先打乱该视屏序列(原先的视频序列是按照帧顺序排列的),然后每次迭代到第一个视频序列时,依次取8帧,然后在这8帧中,每一帧取4个正样本(IOU>=0.7)和12个负样本(IOU<=0.5)的bounding box,然后从原图中按照bounding box 区域截取图片再统一为107*107作为网络的输入(总共32个正样本,96个负样本组成一个mini-batch)
迭代50轮,每次迭代的过程如下:
一次迭代过后计算平均精度,若比上一个模型效果好便保存下来
在进行测试序列的在线跟踪时,使用一个新的单分支的FC6层来代替原来网络的多分支FC6层,然后在线微调FC4-FC6
长期更新
每隔10帧更新一次,详细内容见下文"在线跟踪的过程"
短期更新
每当跟踪出错时更新一次,详细内容见下文"在线跟踪的过程"
困难负样本挖掘
从生成的1024个负样本中选取96个对训练最有价值的负样本,详细内容见下文"在线跟踪的过程"
bounding box regression
目的是微调候选窗口,使得跟踪效果更好
候选框生成
在每一帧上根据前一帧预测的目标位置生成一个符合高斯分布的256个候选框(符合一定的overlap ratio,translation and scale dimension要求,生成的候选框表示为(min_x, min_y, w, h)),然后从原图中截取候选框区域,再将大小统一为107*107作为网络的输入进行计算。
训练数据
离线多域训练的数据:从每一帧上收集50个正样本(IOU>=0.7)和200个负样本(IOU<=0.5)【此处的IOU是和ground truth比较】
在线学习的数据:从每一帧上收集50个正样本(IOU>=0.7)和200个负样本(IOU<=0.3)【此处的IOU是和上一帧预测的bounding box 比较】,注意第一帧需要生成500个正样本(IOU>=0.7)和5000个负样本(IOU<=0.5)【此处的IOU是和ground truth比较】,用于训练bounding box regression.
网络学习
对于具有K个视频序列的多域学习,对网络进行100K次迭代训练,卷积层的学习率为0.0001,全连接层的学习率为0.001。
对于测试序列的初始化框架,对全连接层进行30次迭代训练,FC4-5的学习率为0.0001,FC6的学习率为0.001。
对于在线更新,为了快速适应对初始化框架的全连接层进行10次迭代训练,FC4-5的学习率为0.0001*3,FC6的学习率为0.001*3。
动量梯度下降系数为0.9,权重衰减的系数为0.0005。
每个mini-batch包含M+(= 32)个正样本和从M-(= 1024)个负样本中选出的M h -(= 96)个困难负样本。
接下来是每一帧的跟踪过程,每一帧跟踪过程如下:
只有详细的阅读代码才能更好的理解论文,以下是我对作者提供的代码加了些许注释(修改了代码中的部分内容使其兼容python3,故需要python3版本才能执行),希望能方便读者的阅读。
代码链接:https://download.csdn.net/download/qq_35323001/10791225