代码阅读:MDNet

demo_tracking

1、调用mdnet_init执行初始化net以及各种参数的操作。

2、bbox回归训练

总括:采用了 bounding box regression technique,这个广泛的应用于 Object detection,来改善定位的准确度。

根据给定视频的第一帧,训练一个简单地线性回归模型来预测目标物体的位置,用的是 Conv 3 的特征。在随后的视频帧中,如果预测的目标是可靠的,可以利用bounding box regression调整得到最终的目标位置。文章仅仅用第一帧进行 bounding box regressor 的预测,因为这非常耗时,并且增量学习并不一定有用考虑到其 risk。

① 调用gen_samples,以'uniform_aspect'方式生成20000个回归样本


画出其中的10个:



② 调用overlap_ratio计算样本与gt的重叠率

③ 选出重叠率大于0.6的样本,随机从中选择1000个作为正样本


④ 提取这1000个样本的patch,调用im_crop去均值并resize到107×107。

打出几个看一下:


设置batchsize为256,也就是一次性向网络中输入256个样本(作为一个batch),调用vl_simplennn利用net得到特征图。


即,每个样本的特征图为3×3×512,这样最终得到的feat_conv:


⑤ 将第4步的结果进行维度变换,并将每个样本的特征图拉伸为一。


输入到tran_bbox_regressor训练bbox回归模型。



bbox_regressor的原因及数学算法参见我的另一篇博客

3、在gt周围以'gaussian'方式生成1000个正样本



画出其中的10个:



计算样本与gt的重叠率。选出重叠率大于posThr_init(0.6)的样本,随机从中选择最多500个作为正样本。



4、在全图中用'uniform'和'whole'两种方式各生成5000个样本,共生成10000个负样本。



画出10个:



计算样本与gt的重叠率。选出重叠率小于negThr_init(0.5)的样本,随机从中选择最多5000个作为负样本。

画出100个:


5、分别提取每个样本(最多500正样本,5000负样本)的conv_feature。

每个样本的特征图为3×3×512


6、选出hard负样本(也就是作者提到的hard minibatch mining的过程),并和正样本一起微调net的fc层。

① 从500个正样本中提取32*30个正样本。

opts.batch_pos*opts.maxiter

随机从这些样本中选出32*30个样本。

比如本来有487个,先复制这487个,然后再从乱序的487中选出剩下的473个,组成32*30个样本。

② 同理,从5000个负样本中提取256*4*30个样本。

opts.batchSize_hnm*opts.batchAcc_hnm*opts.maxiter

③ 下面进行hard negative mining的过程:

针对每次迭代:(共迭代30次)

以batch_size为batch的大小,一次性送入batch_size个样本的特征供net计算得分,分别计算得到opts.batchSize_hnm*opts.batchAcc_hnm个样本的positive score得分。

这样,从1024(opts.batchSize_hnm*opts.batchAcc_hnm)个负样本中选出得分最高的96个。

再从正样本中依次选出32个,将这96个负样本和32个正样本的特征图组成一个batch,送入net中,更新每个全连接层的参数

7、为在线更新做好数据样本准备

调用gen_samples,以'uniform'方式生成200*2个样本,计算样本与gt的重叠率。选出重叠率小于negThr_init(0.5)的样本,随机从中选择最多200个作为负样本。

正样本还是之前选出的最多500

提取这些样本的特征图,并且保存在当前帧(第一帧)的数据库中。

8、下面进入正式的tracking过程。

① 从第二帧开始,以'gaussian'方式生成256个候选样本样本,得到这256个候选样本的卷积后特征,送入fc层,得到fc6二进制输出。

② positive score最高的5个样本,如果其平均得分>0,则这五个样本位置的平均xywh作为预测位置。否则,扩大搜索范围。

③ 利用bounding box回归调整本帧的最终结果


④ 当本帧的结果的score>0时,则保存本帧的正负样本数据库。

正样本:以'gaussian'方式生成50*2个样本,计算样本与gt的重叠率。选出重叠率大于posThr_update(0.7)的样本,随机从中选择最多50个作为正样本。

负样本:以'uniform'方式生成200*2个样本,计算样本与gt的重叠率。选出重叠率小于negThr_update(0.3)的样本,随机从中选择最多200个作为负样本。

提取这些样本的特征图,并且保存在当前帧的数据库中。


⑤ 更新net的fc层。

当目前帧是10的倍数或者当前帧的score<0的时候,

如果当前帧的score<0,用于short-term的更新,从数据库中提取出最近20帧的正样本和负样本。

如果当前帧的score>0,用与long-term的更新,从数据库中提取出最近100帧的正样本和负样本。


选出hard负样本,并和正样本一起微调net的fc层。


demo_pretraining

在VOT2013,2014,2015上训练,用OTB微调这些

1、构建正负样本

总括:得到VOT2013每个数据集中,每一帧中的50个正样本和200个负样本。并且保存在roidb_中。

同理,得到VOT2014以及VOT2015数据集的正负训练样本。放在一起。(也就是一共有58个训练数据),把这些训练数据roidb保存到models\data_vot-otb\roidb.mat中

这些正负样本是如何得到的呢?

以VOT2013的cup数据的第一帧为例,先在这一帧中生成posPerFrame*5=250个样本,如下:


计算这些样本和这一帧的gt的重叠率,保留重叠率在0.7-1的样本(还剩169个),如下:


从这些样本中随机选出49个(也就是posPerFrame-1,因为还有一个位置是要给gt的),作为正样本。


在这一帧中生成negPerFrame*2=400个样本,如下:


计算这些样本和这一帧的gt的重叠率,保留重叠率小于0.5的样本。再从这些样本中随机选取negPerFrame=200个作为负样本,如下:


把这些正负样本画在一张图上如下:


2、初始化mdnet,设置fc6的1×1×K×2结构,设置最后一层为softmax_k (K指的是训练视频数据的个数,也就是上面提到的58)

也就是构建成了下面这种网络结构:

1、conv1-3直接采用VGG-M的结构和初始化权重,注意新的网络结构里filters对应原weight{1},biases对应weight{2};pad由原来的格式[0,0,0,0],变换为0。

2、添加fc4层和相应的relu和dropout层,fc5层和相应的relu和dropout层,fc6构造为K个分支

注意:fc层的stride为数字1,conv层的stride为数组[1,1],为了保证fc层的更新,还设置了w和B的倍乘速率和decay)


3、训练MDNet

① 网络参数初始化设定

② 从每个视频数据序列中随机抽取800个(因为要按照每个序列8帧一个batch,一个序列迭代100次来计算),保存在frame_list里。

③ MDNet



外循环是cycle100,内循环是子序列总数K。

& 构建minibatch

针对每个视频数据,得到前8个乱序的帧作为一个minibatch(这也是为什么上面要取800个batch的原因,因为这里每次取8个,要取100次)。

因为上面已经提到了,每一帧中有50个正样本,200个负样本。8帧就有400个正样本,1600个负样本。从0-400随机抽取32个序号idx,得到长度为32的pos_boxes, 再用pos_idx来标记其所在帧处于8帧里的第几个。 同样的方法得到一个minibatch里的96个负样本,然后正负样本拼接起来(共128个样本),并为它们设置label(数字2代表正,1为负)。


& backprop

将label送入loss层,调用mdnet_simplenn,实现网络的前向反向计算。

注意:mdnet_simplenn中softmaxloss_k是作者自己定义的层,是为fc6的多域设计的。

& gradient step

& 打印训练中的信息 

按照这种方法,进行训练:

即,SGD迭代,每一次迭代中只涉及一个特定类别。在第i次迭代中,mini-batch中只包含来自第(i mod K)个序列的样本,特定目标分支网络中也只激活第(i mod K)个分支。

通过这个学习过程,类别无关的信息就被学习到并保存在共享层中,这些信息是非常有用的泛化特征表示。


但在训练完毕之后,会进行这样一步操作:

这就是本文的测试和训练的网络结构的不同之处。不同的地方在于:测试的时候将最后的多个 fc,换为一个 fc,用来计算最终的目标得分。也就是用一个新的分支层代替训练阶段的K个分支层连接共享层。共享层和分支层在跟踪过程中在线的继续微调,来适应新的domain。Online的更新是为了建模 long-term 和 short-term 的表观变化 ( appearance model ),分别是为了得到更好的 robustness 和 adaptiveness 。在进行学习的过程中,采用了 hard negative mining techique。


关于为啥要把原图变成107大小的,一篇博客的解释很棒。https://www.cnblogs.com/qq552048250/p/7994721.html

解释:

首先MDNet的网络结构如下:

input: 107*107@3

conv1: filter:7*7

      stride:2*2

      output:51*51@96 where,51=(107-7+1)/2

pool1: filter:3*3

      stride:2*2

      output:25*25@96  where,25=(51-3+1)/2

conv2: filter:5*5

      stride:2*2

      output:11*11@256 where,11=(25-5+1)/2

pool2: filter:3*3

      stride:2*2

      output:5*5@256  where,5=(11-3+1)/2

conv3: filter:3*3

      stride:1*1

      output:3*3@512 where,3=(5-3+1)/1

 

所以conv3的3就是这么来的,作者的意思是107是它从3逆推计算出的,并且给了计算公式:

107=75+2*16







评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值