admin管理员组

文章数量:1650790

Deep Feature Flow for Video Recognition
CVPR2017
Github地址:https://github/msracver/Deep-Feature-Flow
paper地址:https://arxiv/abs/1611.07715

读书笔记

Deep feature flow 利用deep feature (appearance 信息)和 光流(motion 信息)来对视频中的每一帧做建模,它的核心思想是利用指定的关键帧(key frame)和其他帧(current frame)到关键帧的光流信息,把关键帧送入到deep CNN中得到deep feature,而对于其他帧算出与关键帧的光流,再用光流把关键帧的deep feature propagate (相加,在做双线性差值)到当前帧,这时候就可大大减少计算量,因为对于非关键帧的话就不用再去过CNN了。对于新得到的特征,接下来就可对其进行不同任务处理,比如分割或者检测。

算法要点
1)在关键帧(Key Frame)进行特征图提取

  这一步是比较耗时的,因此是间隔进行的,至于是使用Faster RCNN 还是RFCN,网络是ResNet-101 还是Inception,可以自行选择。

2)帧间传播

  通过下面这幅图来看,作者将 任务分成两个:特征提取 N(feat)和分类&分割 N(task)。
  耗时的特征提取 N(feat)只在关键帧 Work,非关键帧的 Feature 通过传播(Propagation)得到。
  F是通过两个 Raw Frame得到的 Flow信息,作用于前面的 Feature Map,得到当前帧 特征图,并用于计算 N(task)。

3)特征图映射

   特征图映射是本文的最关键部分,因为高层特征和底层特征的差别,流估计的误差会使得特征形变不准确,来看映射效果:

4)端到端训练

  为了让算法达到比较好的效果,端到端(end-to-end)的训练必不可少,好处在于能够比较好的平衡误差,避免因为单独训练每一部分都挺好,结果却无法 Match 的情况,大多数 Deep Net 都会选择 end-to-end 的方法,也比较好理解。

算法流程

代码训练笔记

基于mxnet的Deep-Feature-Flow文件内容相信大家都可以看懂,作者基于imagenet比赛的数据集进行的训练,31类(包含背景)并不包含人,而我所作的需要对人员进行检测,所以重新训练数据集。
训练过程作者写的很详细了,在此不做介绍,主要记录一下我所进行的修改:

准备工作:

作者使用的是ILSVRC2015数据集,所以需要准备格式相同的数据集。

建议:先下载ILSVRC2015数据集,先能跑通该数据集,然后再用自己的数据集集跑,如果出问题,那么就是标注数据集的问题

data/ILSCRC2015/ImageSets VID_train_15frames.txt 解析

train/ILSVRC2015_VID_train_0000/ILSVRC2015_train_00000000 1 10 300
train/ILSVRC2015_VID_train_0000/ILSVRC2015_train_00000000 1 30 300
train/ILSVRC2015_VID_train_0000/ILSVRC2015_train_00000000 1 50 300
train/ILSVRC2015_VID_train_0000/ILSVRC2015_train_00000000 1 70 300
train/ILSVRC2015_VID_train_0000/ILSVRC2015_train_00000000 1 90 300

第一列表示对应的路径信息
第二列表示正负样本, 1为正 -1 为负
第三列表示第几帧图像
第四列表示该vid一共多少帧图像

注意:图片格式为JPEG
训练过程

修改cfgs下的文件:以resnet_v1_101_imagenet_vid_rfcn_end2end_ohem.yaml为例:

MXNET_VERSION: "mxnet"
output_path: "./output/rfcn/imagenet_vid" #选择要输出的路径
symbol: resnet_v1_101_rfcn
gpus: '0,1,2,3' #修改为你所使用的GPU
CLASS_AGNOSTIC: true
dataset: #根据标题,修改为自己的数据集的相关信息
  NUM_CLASSES: 31
  dataset: ImageNetVID
  dataset_path: "./data/ILSVRC2015"
  image_set: DET_train_30classes+VID_train_15frames
  root_path: "./data"
  test_image_set: VID_val_frames
  proposal: rpn
TRAIN: # 修改学习率已经epoch等
  lr: 0.00025
  lr_step: '1.333'
  warmup: false
  begin_epoch: 0
  end_epoch: 2
  ...
主要遇到的训练问题:
1:TypeError: init_params() got an unexpected keyword argument ‘allow_extra’


解决办法:进入mnxet/module/找到base_module.py文件中 allow_extra=allow_extra这一行删除掉。

2:TypeError: _update_params_on_kvstore() takes exactly 4 arguments (3 given)


解决办法:进入对应的module.py文件,相应修改

_update_params_on_kvstore(self._exec_group.param_arrays,
                                      self._exec_group.grad_arrays,
                                      self._kvstore,
                                      self._param_names)

本文标签: 代码文章DeepfeatureFlow