MDNET工程阅读笔记

网络结构

  • 输入:107×107大小的RGB目标图片              
  • 网络层:包括三个卷积模块(conv1,conv2,conv3)和三个全连接模块(fc4,fc5,fc6)。其中,fc6在训练时具有K个分支,每个K分支包含一个具有softmax交叉熵损失的二分类层,  它负责区分每个域(训练视频)中的目标和背景。
  • 在跟踪时,fc6会被替换成单个分支,以用于新的测试序列。
  • 输出:一个分数,用来区分目标和背景,得分越高,是目标的概率越大。

 

MDNET工程阅读笔记

 

训练部分

一、mdnet_prepare_model

1. 读取VGG的conv1、2、3,得到layers。layer中有11个结构体,分别是conv1,relu1,norm1,pool1;conv2,relu2,norm2,pool2;conv3,relu3,conv4;

2. 遍历layers,为不同种类的层添加属性和值,去掉conv4。

3. 自定义了fc4模块(包含fc4,relu4,dropout4)、fc5模块(包含fc5,relu5,dropout5),fc6模块(包含fc6,softmax)。

 

二、mdnet_pretrain

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

1.设置要训练的序列集

 

2.初始化:

网络结构模型mdnet_init.mat;

输出的训练结果模型mdnet_vot-otb_new.mat;

ROI(采样)数据库roidb.mat;

 

3.初始化重要参数:

      opts.train.batch_frames= 8;%每个batch(视频序列?)随机选8帧;

      opts.train.batch_pos = 32;%每个batch选32个正样本

opts.train.batch_neg = 96;%每个batch选96个负样本

      opts.sampling.input_size= 107;%输入网络的目标大小为107*107

 

4.roidb = mdnet_setup_data(opts.seqsList, opts.sampling);

遍历每个数据集里的每个视频序列,将其正负样本保存在roidb中。roidb中有K个结构体,每个结构体存着一个视频序列的所有帧路径、每帧的50个bbox正样本和每帧的200个bbox负样本。

MDNET工程阅读笔记

 

5. net = mdnet_init_train(opts, K)

     K是训练时用的视频序列的个数。该函数将之前构建的网络结构进行了调整,原先网络结构里fc6是单支,调用该函数后,fc6的softmaxloss层变为K支。

MDNET工程阅读笔记

6. net = mdnet_train(net, roidb, fn, opts.train)

     训练网络。

(1)初始化网络参数,遍历每一层,设置参数。

(2)遍历所有序列,第k个序列里随机取800个数,范围是该序列的第一帧到最后一帧。取800的原因是:每个序列8帧为一个batch,每个序列要迭代100次。这800个数存在frame_list{k}中,作为训练时取batch的来源,代表800个帧的标号。

(3)开始循环。外循环为100个cycle。

在每个cycle中,遍历每个序列。从frame_list{seq_id}中取出8个数作为帧数下标,调用getBatch函数,从roidb里取出这8帧的32个正样本和96个负样本,共128个样本。

调用get_Batch函数,得到裁剪成107*107格式后的128个样本图片和其正负标签。

将样本图片和标签输入网络,进行正向反向传播,得到res。

利用res进行梯度下降,更新网络中所有种类为conv的参数。

MDNET工程阅读笔记

 

(4)循环结束。得到objective、error、speed三个参数,存入info参数内。将网络存入net参数中。

 

7.net = mdnet_train(net, roidb, fn, opts.train) ;

将网络中的conv类层学习率调整一下,并将最后的softmaxloss_k改成softmaxloss,即将多分支改成单分支,以备跟踪用。

 

8. 存储网络到mdnet_vot-otb_new.mat中。

MDNET工程阅读笔记

 

 

跟踪部分

一、conf = genConfig('数据集名称','视频序列名称');

将该视频序列的数据集名(如OTB)、视频序列名、图片所在文件夹路径、每帧图片的路径、每帧ground truth存在conf中。

MDNET工程阅读笔记

 

二、result = mdnet_run(conf.imgList, conf.gt(1,:), net);

函数定义:function [ result ] = mdnet_run(images, region, net, display)

result是一个N*4的数组,N是该序列视频帧数,保存的是经过网络预测后的每帧的目标位置(即bounding box)

  1. [net_conv, net_fc, opts] = mdnet_init(img, net);

(1)设置了重要参数:包括

(2)读取网络,将conv1-3模块存入net_conv.layers,fc4、5、6模块存入net_fc.layers。

(3)遍历所有全连接层,为全连接层设置学习率。

MDNET工程阅读笔记

MDNET工程阅读笔记

MDNET工程阅读笔记

    2.训练boundingbox 回归器

      根据给定视频的第一帧,训练一个简单的线性回归模型来预测目标物体的位置,用的是 Conv 3 输出的特征。在随后的视频帧中,如果预测的目标是可靠的,可以利用bounding box 回归器调整得到最终的目标位置。

(1)pos_examples = gen_samples('uniform_aspect', targetLoc, opts.bbreg_nSamples*10, opts, 0.3, 10);

生成样本。uniform_aspect是选取样本的方式,targetLoc是第一帧的groundtruth,opts.bbreg_nSamples*10是生成的样本数量(此处为10000个)。

得到pos_examples,其中存储了10000个bbox。

MDNET工程阅读笔记

(2)选出其中重叠率大于0.6的样本,作为正样本。

(3)随机从正样本中选出opts.bbreg_nSamples个样本(此处为1000)。

(4)提取特征。feat_conv = mdnet_features_convX(net_conv, img, pos_examples, opts);

参数为卷积部分的网络(conv1+2+3),第一帧图片,1000个正样本。

将所有样本裁剪成107*107,输入conv网络,得到特征,存入feat_conv。

(5)训练回归器。输入特征、正样本框(pos_examples)、gt(全是第一帧的gt)。bbox_reg = train_bbox_regressor(X, bbox, bbox_gt);

MDNET工程阅读笔记MDNET工程阅读笔记MDNET工程阅读笔记

 

  3. 提取第一帧图像的正负样本,为调整fc参数做准备。

(1)用gaussian方式生成1000个样本,选出重叠率高于0.7的作为正样本,然后在其中随机选出最多500个正样本

(2)uniform方式生成10000个样本,选出重叠率小于0.5的作为负样本,然后在其中随机选出最多5000个负样本

(3)调用mdnet_features_convX,将所有的正负样本提取特征。每个样本的特征大小为3×3×512。

 

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

 

 5. 为在线更新做好数据样本准备

(1)用uniform方式生成400个样本,选出重叠率小于0.3的作为负样本,然后在其中随机选出最多200个负样本作为更新用负样本

(2)提取更新用负样本特征,保存在当前帧(第一帧)的数据库ttotal_neg_data{1}中。把之前那最多500个正样本特征保存在otal_pos_data{1}中。

MDNET工程阅读笔记

6. 跟踪主循环

遍历从第二帧开始的所有帧(变量名为To),..........

(1)在当前帧(To的前一帧)目标附近用gaussian方法生成256个样本。

(2)将上面的样本提取特征。

(3)将特征送入fc4-6层,得到fc6二进制输出,即背景和目标的得分。

(4)得分最高的五个bbox取平均值,如果大于0,则为最佳结果,将这个均值bbox作为To帧的目标位置。

(5)利用之前训练好的boundingbox回归器调整本帧的最后结果。得到目标bbox,存入result。

(6)准备下帧的训练样本,最多50个正样本,最多200个负样本,提取特征后保存在To帧的数据库total_pos_data{To} 和total_neg_data{To}中。

(7)添加跟踪成功的帧到success_frames中。如果跟踪成功的帧数>100,就将其100帧前保存的样本清空;跟踪成功的帧数>20,就将其前20帧前保存的样本清空。

(8)更新net的fc层参数。

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

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

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

  • mdnet_finetune_hnm,挖掘hard负样本,并和正样本一起微调net的fc层。

MDNET工程阅读笔记