代码链接: py-mdnet
**环境配置**
: python3.6.6
torch 1.1.0
opencv 3.0+
下载此代码:git clone 链接
这部分用到的代码为:pretrain下的所有和modules下的部分
这版新增了在imagenet下的训练,论文中没有提到
根据readme中的步骤来:
Download VGG-M (matconvnet model) and save as “models/imagenet-vgg-m.mat”
Pretraining on VOT-OTB:
Download VOT datasets into “datasets/VOT/vot201x”
说明:打开datasets/list/vot-otb.txt,里面有一个视频列表,在vot2013 2014 2015下挑选了一些视频序列,使得不与OTB 上的视频重复或者相似。顺便说一下从vot2013后数据集的groundtruth和otb不一样,vot有八个值,分别表示四个点的坐标,选取多边形区域进行标注,是不规则的,参考
prepro_vot.py(用于得到训练的image_path,gt)
with open(path,‘r’) as fp:
seq_list=fp.read().splitlines()
对于8个点的gt,代码做如下处理:
train_mdnet.py
python pretrain/train_mdnet.py -d vot
运行次代码后的结果:
由最开始的mean precision 0.253到最后的0.970
PIL.Image.open()函数读取图片的格式是RGB,image_size=(480,270),将每个视频里的图片的顺序打乱得到随机索引,每个视频随机选8帧。
加载"models/imagenet-vgg-m.mat",和tracking不一样,这里的branches层(fc6)加载58个分支,截取一部分图:
要学习的层为 [“conv”, “fc”]。即都要学习
初始化loss和更新参数,其他层lr为0.0001,fc层为0.001
训练50次,model.train(), 把视频顺序打乱,然后和tracking一样,随机选一个视频,从视频中随机选8帧,每帧提取4个正样本,12个负样本,总共32个正样本96个负样本,组成一个batch,提取样本后,在原图上截取相应的部分,然后resize107x107,将正样本、负样本输入到model中得到对应的分数,(32,96,107,107)->(32,96,25,25)->(32,256,5,5)->(32,512,3,3)->
(32,4608)->(32,512)->(32,512),分别得到pos_score,neg_score。
算lossloss = criterion(pos_score, neg_score)
model.zero_grad()
梯度裁剪
optimizer.step()
算 precision
训练完后保存共享层 的参数
总结为:加载预训练模型的共享层 然后训练多分支(多域,即最后一层),没有视频对应一个域,学习每个域的共享特征。得到正样本分数【32,2】负样本分数【96,2】计算损失