深度学习-视频检测记录(1)_msra视频检测-程序员宅基地

技术标签: 计算机视觉  神经网络  

从MSRA的deep feature flow开始

你好! 从各路大神的思考中收集了一些思路,准备以MSRA的Deep Feature Flow for Video Recognition来作为视频深度学习的入门。

1 论文解读

论文中说image content varies slowly over consecutive video frames, especially the high level semantics,可以用来减少computation cost。
根据Visualizing and Understanding Convolutional Neural Networks的理论,The intermediate convolutional feature maps have the same spatial extent of the input image. They also preserve the spatial correspondences between the low level image content and middle-to-high level semantic concepts. 这就提供了在相邻帧之间廉价传播特征的机会。(对于这个理论的解读,链接: link。此文章通过反卷积可视化中间层特征。可视化工具:toolbox:yosinski/deep-visualization-toolbox)
本文引入了deep feature flow:a fast and accurate approach for video recognition。利用相邻帧之间的一致性,只在关键帧上做图像识别,然后将这些深度特征传播到其他帧上。用flow estimate 和 feature propagation来代替直接convolution。

1.1 模型加速

论文的目的主要是减少video recognition的计算开销。但是前人对于单帧图像识别模型加速的研究已经有很多了,例如低秩约束(link),和权值量化。
如果后续有时间,可以通过link来研究低秩约束的加速理论。下面主要讨论权值量化部分,也是较为常讨论的模型压缩方法之一。

BinaryConnect: Training Deep Neural Networks with binary weights during propagations
1.尽管模型精度降低了非常多,但是在训练效果却不比全精度的网络差,有的时候二值网络的训练效果甚至会超越全精度网络,因为二值化过程给神经网络带来了noise,像dropout一样,反而是一种regularization,可以部分避免网络的overfitting。
2.二值化网络可以把单精度乘法变成位操作,这大大地减少了训练过程中的运算复杂度。这种位运算可以写成gpu kernel, 或者用fpga实现,会给神经网络训练速度带来提升。
3.存储神经网络模型主要是存储weights. 二值化的weight只要一个bit就可以存下来了,相比之前的32bit,模型减小了32倍,那么把训练好的模型放在移动设备,比如手机上面做测试就比较容易了。

XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks
XNOR网络,其中卷积层、全连接层的权重以及网络的输入都进行二值化。 二值化的权重和二值化的输入可以有效地实现卷积运算。如果卷积运算的所有操作数都是二值(1和-1)的,那么可以通过XNOR(异或非门)和位计数操作来估计卷积。XNOR-Nets可以精确地近似CNN,同时在CPU中提高58倍计算速度。

1.2 光流

optical flow(光流):即相邻帧之间像素运动的瞬时速率。它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。光流法有两个假设,1)同一物体在不同帧之间运动时,像素亮度不会发生改变。2)相邻帧之间同一目标位移较小,时间变化不会引起目标的剧烈变化。

Lucas-Kanade(LK)光流法
LK算法的约束条件即:小速度,亮度不变以及区域一致性都是较强的假设,并不很容易得到满足。如当物体运动速度较快时,假设不成立,那么后续的假设就会有较大的偏差,使得最终求出的光流值有较大的误差。图像金字塔可以解决这个问题。
考虑物体的运动速度较大时,算法会出现较大的误差。那么就希望能减少图像中物体的运动速度。一个直观的方法就是,缩小图像的尺寸。假设当图像为400×400时,物体速度为[16 16],那么图像缩小为200×200时,速度变为[8,8]。缩小为100*100时,速度减少到[4,4]。所以在源图像缩放了很多以后,原算法又变得适用了。所以光流可以通过生成 原图像的金字塔图像,逐层求解,不断精确来求得。简单来说上层金字塔(低分辨率)中的一个像素可以代表下层的四个。
图片求导计算公式可参考link

1.3 Temporal Dimension in Video Recognition

将视频中的时间信息代入图像检测中,以增加检测的准确性。例如可以将检测结果应用于相邻帧,减少错误的检测和漏测。因为由于运动造成的遮挡或者大姿态,非常容易造成在该帧中检测不出来。
下图为T-CNN的框架结构。
在这里插入图片描述

1.3.1 Still-image object detection.

我们的静态图像对象检测器采用DeepID-Net [8]和CRAFT [32]框架,并通过ILSVRC2015的ImageNet检测(DET)和视频(VID)训练数据集训练.。DeepID-Net [8]是R-CNN的扩展[3],CRAFT是Faster R-CNN的扩展[5]。这两个框架都包含对象区域提案和区域提案评分的步骤。主要的区别是,在CRAFT(也是Faster R-CNN)中,提案生成和分类被组合成一个单一的端到端网络。静态图像对象检测器被应用于各个独立帧。在提出的T-CNN框架中,剩余组件分别对两个静态图像对象检测器框架的结果进行处理。

1.3.2 Multi-context suppression.

此过程首先按降序对视频内的所有静态图像检测分数进行排序。具有高排名的检测分数的类别被视为高置信度类别,其余则被视为低置信度类别。 低置信度类别的检测分数被抑制,以减少false positive。

1.3.3 Motion-guided Propagation.

在静态图像对象检测中,在相邻帧中检测到的对象,在某些帧时可能会丢失某些对象。 运动引导传播使用诸如光流的运动信息来将检测结果局部地传播到相邻帧以减少false negative。

1.3.4 Temporal tubelet re-scoring.

从静态图像检测器的高置信度检测开始,我们首先运行跟踪算法来获得边界框序列,我们称之为tubelet。 然后根据其检测分数的统计,将tubelet分为pisitive和negative样本。 positive分数映射到较高的范围,而negative值则映射到较低的范围,从而提高分数裕量。

1.3.5 Model combination:

对于来自DeepID-Net和CRAFT的两组提案中的每一个,它们的来自于tubelet rescoring和运动引导传播的检测结果,每个最小 - 最大映射到[0,1],并通过与 IOU重叠0.5NMS的过程以获得最终结果。

1.4 deep feature flow

在这里插入图片描述

1.4.1 算法伪代码与公式

在的deep feature flow的思想中,一个image recognition网络被分成两个部分, N f e a t \N_{feat} Nfeat是特征提取网络, N t a s k N_{task} Ntask是识别任务网络。对于相邻帧而言,经过深层次的特征提取网络得到的是相似的特征图,在这个认知上就可以通过只对关键帧计算 N f e a t \N_{feat} Nfeat,非关键帧的特征图由关键帧计算的特征图传播而来,减少计算耗费。
a location p p p in current frame i i i to the location p + δ p p + δp p+δp in key frame k k k δ p δp δp由光流计算 M i − > k M_{i->k} Mi>k得到。当前帧的特征图计算公式如下:
在这里插入图片描述
其中 G G G是双线性插值核:
在这里插入图片描述
在本文中用一个CNN网络去实现flow的计算,有助于整个任务成为一个端到端的训练。下面是deep feature flow的伪代码,其中 W ( ) W() W()是将上述特征图计算公式运用到所有location和所有channel。
在这里插入图片描述
用图表示算法结构:
在这里插入图片描述
论文中用SGD下降法,i帧抽取范围在k帧的后9帧,且k帧的选取采用固定间隔,当然根据video的实际内容采用变化的关键帧选取策略是更有效的。Flow network先经过Flying Chairs dataset预训练,然后通过适当增加最后一层卷积层中的通道数量,在网络的末端将scale函数S作为同级输出添加进来。scale函数初始化为1(输出层中的权值和偏差分别初始化为0和1)。
其中特征图传播计算公式 W W W的梯度用 f i f_i fi的特征倒数代替,其由三部分组成, f k f_k fk S i − > k S_{i->k} Si>k的倒数可以通过链式法则简单求得, M i − > k M_{i->k} Mi>k对于每一个位置 p p p和通道 c c c,有公式:
在这里插入图片描述

1.4.2 baseline模型选取和网络结构

Flow network选取FlowNet architecture (the “Simple” version),该模型为当时SOTA模型。本文为了对比,对该网络进行了简单化,增加两组网络FlowNet Half,FlowNet Inception。有兴趣的可以看原文。

特征提取网络使用了 ResNet-50 and ResNet-101 models pre-trained for ImageNet classification as defaults。The last 1000-way clas-sification layer is discarded. The feature stride is reduced from 32 to 16 to produce denser feature maps, following the practice of DeepLab for semantic segmentation, and
R-FCN for object detection. The first block of the conv5 layers are modified to have a stride of 1 instead of 2. The holing algorithm [4] is applied on all the 3×3 convolutional kernels in conv5 to keep the field of view (dilation=2). A randomly initialized 3×3 convolution is appended to conv5 to reduce the feature channel dimension to 1024, where the holing algorithm is also applied (dilation=6). The resulting 1024-dimensional feature maps are the intermediate feature maps for the subsequent task.

特征网络后接一层随机初始化的1x1conv层,输出通道数为(C+1),其中C是类别数量,1是背景类别。再接一层softmax对输出层的每个像素计算所属类别概率。实现语义分割任务,且该任务只有一层需要学习的参数。The semantic segmentation accuracy is measured by the pixel-level mean intersection-over-union (mIoU) score.

该模型还采用了R-FCN。在feature map后接两个全卷积网络分支,一个分支接在512维后实现region proposal,另一个接在剩下的一半feature map后实现detection。在region proposal分支,使用RPN网络,选9个anchor,用两个1x1conv分别输出18个objectness scores和36个bbox regression values。在detection分支,也用两个1x1conv分别输出每一组回归器/分类器的C+1scores和4bbox。 评价指标using the standard mean average precision (mAP) metric。

实验证明DFF算法可以在损失极少精度的代价下大幅提升计算效率。在训练中指定帧 i i i和它的ground truth, k k k帧为 i i i- l l l+1,…, i i i。但是在optical flow计算和key frame schedule上还是有很大探索空间。

1.4.3 FlowNet

FlowNet使用CNN来预测两帧之间的光流图,整个是一个编码解码结构。
在这里插入图片描述
在这里插入图片描述
上面是FlowNetSimple,直接将两张图片cat到一起为6通道作为input。
下面的是FlowNetCorr,先分别提前两幅图的特征图,然后再两张图的特征在空间维做卷积运算,相当于计算两幅图的相关性,之后再进行编码解码操作。

在解码过程中,每次deconv的输入包含三部分:上一层的输出,上一层输入预测的低尺度光流图,以及对应尺度的编码层特征图。如下图所示:
在这里插入图片描述
作者还通过将一些3D椅子模型随机覆盖在一些背景图片上合成图像,制作了约有22K的图像对的数据集FlyingChair,并且FlowNet在上面表现出来最好的效果,且在速度上大大领先传统算法,实现实时光流计算。但是在真实数据集上的表现还是不如传统办法,于是升级到2.0版本,在损失极小计算性能的前提下追平传统算法的准确度。

FlowNet2.0增加了具有3D运动的数据库FlyingThings3D和更复杂的训练策略。详情请查看link.
在这里插入图片描述
[在训练模型,提高模型准确率上,可以通过合成数据集、训练策略、模型融合、模块增加的方式实现。
例如flownet2在堆叠的flownet上训练当前模块时,可以固定之前的模块参数,这样能获得最优的结果。在堆叠模块(stacking)输入上,除了image1和image2,还可以加上前一个模块的输出,误差图像等等。这也是模型融合的一个方法。因为堆叠导致的计算量增大,可以通过减小每层的通道数来抵消。
在flownet2中还有一个小技巧,将7x7和5x5的卷积换成多层3x3卷积来增加对小位移的分辨率。在inception中也有此操作,不过是为了大幅减少计算量。
flownet2现在简单数据集上训练,再在有更复杂信息的数据集上训练能得到更好的效果。]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43714901/article/details/103871248

智能推荐

JavaScript学习笔记_curry函数未定义-程序员宅基地

文章浏览阅读343次。五种原始的变量类型1.Undefined--未定义类型 例:var v;2.String -- ' '或" "3.Boolean4.Number5.Null--空类型 例: var v=null;Number中:NaN -- not a number非数本身是一个数字,但是它和任何数字都不相等,代表非数,它和自己都不相等判断是不是NaN不能用=_curry函数未定义

兑换码编码方案实践_优惠券编码规则-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏17次。兑换码编码设计当前各个业务系统,只要涉及到产品销售,就离不开大大小小的运营活动需求,其中最普遍的就是兑换码需求,无论是线下活动或者是线上活动,都能起到良好的宣传效果。兑换码:由一系列字符组成,每一个兑换码对应系统中的一组信息,可以是优惠信息(优惠券),也可以是相关奖品信息。在实际的运营活动中,要求兑换码是唯一的,每一个兑换码对应一个优惠信息,而且需求量往往比较大(实际上的需求只有预期_优惠券编码规则

c语言周林答案,C语言程序设计实训教程教学课件作者周林ch04结构化程序设计课件.ppt...-程序员宅基地

文章浏览阅读45次。C语言程序设计实训教程教学课件作者周林ch04结构化程序设计课件.ppt* * 4.1 选择结构程序设计 4.2 循环结构程序设计 4.3 辅助控制语句 第四章 结构化程序设计 4.1 选择结构程序设计 在现实生活中,需要进行判断和选择的情况是很多的: 如果你在家,我去拜访你 如果考试不及格,要补考 如果遇到红灯,要停车等待 第四章 结构化程序设计 在现实生活中,需要进行判断和选择的情况..._在现实生活中遇到过条件判断的问

幻数使用说明_ioctl-number.txt幻数说明-程序员宅基地

文章浏览阅读999次。幻数使用说明 在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情。 因为设备都是特定的,这里也没法说。关键在于怎样组织命令码,因为在ioctl中命令码是唯一联系用户程序命令和驱动程序支持的途径 。 命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,利_ioctl-number.txt幻数说明

ORB-SLAM3 + VScode:检测到 #include 错误。请更新 includePath。已为此翻译单元禁用波浪曲线_orb-slam3 include <system.h> 报错-程序员宅基地

文章浏览阅读399次。键盘按下“Shift+Ctrl+p” 输入: C++Configurations,选择JSON界面做如下改动:1.首先把 “/usr/include”,放在最前2.查看C++路径,终端输入gcc -v -E -x c++ - /usr/include/c++/5 /usr/include/x86_64-linux-gnu/c++/5 /usr/include/c++/5/backward /usr/lib/gcc/x86_64-linux-gnu/5/include /usr/local/_orb-slam3 include 报错

「Sqlserver」数据分析师有理由爱Sqlserver之十-Sqlserver自动化篇-程序员宅基地

文章浏览阅读129次。本系列的最后一篇,因未有精力写更多的入门教程,上篇已经抛出书单,有兴趣的朋友可阅读好书来成长,此系列主讲有理由爱Sqlserver的论证性文章,希望读者们看完后,可自行做出判断,Sqlserver是否真的合适自己,目的已达成。渴望自动化及使用场景笔者所最能接触到的群体为Excel、PowerBI用户群体,在Excel中,我们知道可以使用VBA、VSTO来给Excel带来自动化操作..._sqlsever 数据分析

随便推点

智慧校园智慧教育大数据平台(教育大脑)项目建设方案PPT_高校智慧大脑-程序员宅基地

文章浏览阅读294次,点赞6次,收藏4次。教育智脑)建立学校的全连接中台,对学校运营过程中的数据进行处理和标准化管理,挖掘数据的价值。能:一、原先孤立的系统聚合到一个统一的平台,实现单点登录,统一身份认证,方便管理;三、数据共享,盘活了教育大数据资源,通过对外提供数。的方式构建教育的通用服务能力平台,支撑教育核心服务能力的沉淀和共享。物联网将学校的各要素(人、机、料、法、环、测)全面互联,数据实时。智慧校园解决方案,赋能教学、管理和服务升级,智慧教育体系,该数据平台具有以下几大功。教育大数据平台底座:教育智脑。教育大数据平台,以中国联通。_高校智慧大脑

编程5大算法总结--概念加实例_算法概念实例-程序员宅基地

文章浏览阅读9.5k次,点赞2次,收藏27次。分治法,动态规划法,贪心算法这三者之间有类似之处,比如都需要将问题划分为一个个子问题,然后通过解决这些子问题来解决最终问题。但其实这三者之间的区别还是蛮大的。贪心是则可看成是链式结构回溯和分支界限为穷举式的搜索,其思想的差异是深度优先和广度优先一:分治算法一、基本概念在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两_算法概念实例

随笔—醒悟篇之考研调剂_考研调剂抑郁-程序员宅基地

文章浏览阅读5.6k次。考研篇emmmmm,这是我随笔篇章的第二更,原本计划是在中秋放假期间写好的,但是放假的时候被安排写一下单例模式,做了俩机试题目,还刷了下PAT的东西,emmmmm,最主要的还是因为我浪的很开心,没空出时间来写写东西。  距离我考研结束已经快两年了,距离今年的考研还有90天左右。  趁着这个机会回忆一下青春,这一篇会写的比较有趣,好玩,纯粹是为了记录一下当年考研中发生的有趣的事。  首先介绍..._考研调剂抑郁

SpringMVC_class org.springframework.web.filter.characterenco-程序员宅基地

文章浏览阅读438次。SpringMVC文章目录SpringMVC1、SpringMVC简介1.1 什么是MVC1.2 什么是SpringMVC1.3 SpringMVC的特点2、HelloWorld2.1 开发环境2.2 创建maven工程a>添加web模块b>打包方式:warc>引入依赖2.3 配置web.xml2.4 创建请求控制器2.5 创建SpringMVC的配置文件2.6 测试Helloworld2.7 总结3、@RequestMapping注解3.1 @RequestMapping注解的功能3._class org.springframework.web.filter.characterencodingfilter is not a jakart

gdb: Don‘t know how to run. Try “help target“._don't know how to run. try "help target".-程序员宅基地

文章浏览阅读4.9k次。gdb 远程调试的一个问题:Don't know how to run. Try "help target".它在抱怨不知道怎么跑,目标是什么. 你需要为它指定target remote 或target extended-remote例如:target extended-remote 192.168.1.136:1234指明target 是某IP的某端口完整示例如下:targ..._don't know how to run. try "help target".

c语言程序设计教程 郭浩志,C语言程序设计教程答案杨路明郭浩志-程序员宅基地

文章浏览阅读85次。习题 11、算法描述主要是用两种基本方法:第一是自然语言描述,第二是使用专用工具进行算法描述2、c 语言程序的结构如下:1、c 语言程序由函数组成,每个程序必须具有一个 main 函数作为程序的主控函数。2、“/*“与“*/“之间的内容构成 c 语言程序的注释部分。3、用预处理命令#include 可以包含有关文件的信息。4、大小写字母在 c 语言中是有区别的。5、除 main 函数和标准库函数以..._c语言语法0x1e