Deep Feature Flow for Video Recognition
CVPR2017
Github地址:https://github.com/msracver/Deep-Feature-Flow
paper地址:https://arxiv.org/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)