行为识别笔记:improved dense trajectories算法(iDT算法)

行为识别笔记:improved dense trajectories算法(iDT算法)iDT算法是行为识别领域中非常经典的一种算法,在深度学习应用于该领域前也是效果最好的算法。由INRIA的IEAR实验室于2013年发表于ICCV。目前基于深度学习的行为识别算法效果已经超过了iDT算法,但与iDT的结果做ensemble总还是能获得一些提升。所以这几年好多论文的最优效果都是“Ourmethod+iDT”的形式。此前由于项目原因,对iDT算法进行了很多研究和实验,故此处对其核心思路与

大家好,又见面了,我是你们的朋友全栈君。

转发请注明出处:http://blog.csdn.net/wzmsltw/article/details/53023363

iDT算法是行为识别领域中非常经典的一种算法,在深度学习应用于该领域前也是效果最好的算法。由INRIA的IEAR实验室于2013年发表于ICCV。目前基于深度学习的行为识别算法效果已经超过了iDT算法,但与iDT的结果做ensemble总还是能获得一些提升。所以这几年好多论文的最优效果都是“Our method+iDT”的形式。

此前由于项目原因,对iDT算法进行了很多研究和实验,故此处对其核心思路与一些实施的细节进行总结,方便后续回顾,也希望能够在此过程中获得一些新的启发。

介绍的内容主要包含两篇文章的内容,分别是”Dense Trajectories and Motion Boundary Descriptors for Action Recognition”和”Action Recognition with Improved Trajectories”。这两篇都是H. Wang的文章,前者要更早一些,介绍了DT(Dense Trajectories)算法。后者则在前者的基础上进行了改进(improved),主要是引入了对背景光流的消除方法,使得特征更集中于对人的运动的描述。两者的框架大致相同,本文先对DT算法进行介绍,再介绍iDT算法的改进之处。

iDT的代码可以在其个人主页上下到,也可以点击此处下载。

对iDT特征进行FV编码的代码可以在dtfv 下载。

更新了iDT算法的代码解析,见iDT算法用法与代码解析

密集轨迹算法(DT算法)

算法基本框架



行为识别笔记:improved dense trajectories算法(iDT算法)

如图所示即为算法的基本框架,包括密集采样特征点,特征点轨迹跟踪和基于轨迹的特征提取几个部分。后续的特征编码和分类过程则没有在图中画出。

密集采样

DT方法通过网格划分的方式在图片的多个尺度上分别密集采样特征点。在多个空间尺度上采样能保证采样的特征点覆盖了所有空间位置和尺度,通常8个空间尺度已经非常足够了,若图像很大,可以适当增加。后续的特征提取也是在各个尺度上分别进行的。特征点采样的间隔(即网格的大小)W通常取W=5。

下一步的目标即在时间序列上跟踪这些特征点,但在缺乏变化的区域(比如一块白色墙壁中间的点)中跟踪特征点是无法实现的。因此在进行跟踪前要先去除一些特征点。此处的方法是计算每个像素点自相关矩阵的特征值,并设置阈值去除低于阈值的特征点。阈值由下式决定:

T=0.001×maxiImin(λ1i,λ2i)



式中

(λ1i,λ2i)
是图像I中像素点i的特征值。0.001为实验确定的一个比较合适的值。下图即为密集采样的一个示例效果图片。



行为识别笔记:improved dense trajectories算法(iDT算法)

轨迹与轨迹描述子(trajectories)

设上一步中密集采样到的某个特征点的坐标为 Pt=(xt,yt) ,则我们可以用下式来计算该特征点在下一帧图像中的位置。

Pt+1=(xt+1,yt+1)=(xt,yt)+(Mωt)|xt,yt



式中

ωt=(ut,vt)
为密集光流场,是由

It


It+1
计算得到的,u和v分别代表光流的水平和垂直分量。而M则代表中值滤波器,尺寸为3*3。故该式子是通过计算特征点邻域内的光流中指来得到特征点的运动方向的。

某个特征点在连续的L帧图像上的位置即构成了一段轨迹 (Pt,Pt+1,...,Pt+L) ,后续的特征提取即沿着各个轨迹进行。由于特征点的跟踪存在漂移现象,故长时间的跟踪是不可靠的,所以每L帧要重新密集采样一次特征点,重新进行跟踪。在DT/iDT算法中,选取L=15。

此外,轨迹本身也可以构成轨迹形状特征描述子。对于一个长度为L的轨迹,其形状可以用 (ΔPt,...,ΔPt+L1) 来描述,其中位移矢量 ΔPt=(Pt+1Pt)=(xt+1xt,yt+1yt) 。在进行正则化后就可以得到轨迹特征描述子了。正则化方式为:

T=(ΔPt,...,ΔPt+L1)t+L1j=t||ΔPj||



故最终得到的轨迹特征为15*2=30维向量。

运动/结构描述子(HOF,HOG,MBH)

除了轨迹形状特征,我们还需要更有力的特征来描述光流,DT/iDT中使用了HOF,HOG和MBH三种特征。此前我写了一篇博客对这几种特征进行了介绍。

首先对这几种特征提取的通用部分进行介绍。沿着某个特征点的长度为L的轨迹,在每帧图像上取特征点周围的大小为 N×N 的区域,则构成了一个时间-空间体(volume),如算法基本框架图的右半部分所示。对于这个时间-空间体,在进行一次网格划分,空间上每个方向上分为 nσ 份,时间上则均匀选取 nτ 份。故在时间-空间体中共分出 nσ×nσ×nτ 份区域用作特征提取。在DT/iDT中,取 N=32,nσ=2,nτ=3 ,接下来对各个特征的提取细节进行介绍。

  • HOG特征:HOG特征计算的是灰度图像梯度的直方图。直方图的bin数目取为8。故HOG特征的长度为96(2*2*3*8)。
  • HOF特征:HOF计算的是光流(包括方向和幅度信息)的直方图。直方图的bin数目取为8+1,前8个bin于HOG相同,额外的一个bin用于统计光流幅度小于某个阈值的像素。故HOF的特征长度为108(2*2*3*9)。
  • MBH特征:MBH计算的是光流图像梯度的直方图,也可以理解为在光流图像上计算的HOG特征。由于光流图像包括x方向和y方向,故分别计算MBHx和MBHy。MBH总的特征长度为192(2*96)。

在计算完后,还需要进行特征的归一化,DT算法中对HOG,HOF和MBH均使用L2范数归一化。

特征编码—Bag of Features

对于一段视频,存在着大量的轨迹,每段轨迹都对应着一组特征(trajectory,HOG,HOF,MBH),因此需要对这些特征组进行编码,得到一个定长的编码特征来进行最后的视频分类。

DT算法中使用Bag of Features方法进行特征的编码,Bag of Features方法的介绍见这篇博文——Bag of Features(BOF)图像检索算法,这篇博文也是转载的,但无奈原文地址已经打不开了。在训练码书时,DT算法随机选取了100000组特征进行训练。码书的大小则设置为4000。

在训练完码书后,对每个视频的特征组进行编码,就可以得到视频对应的特征。

分类-SVM

在得到视频对应的特征后,DT算法采用SVM( RBFχ2 核)分类器进行分类,采用one-against-rest策略训练多类分类器。

提升的密集轨迹算法(iDT算法)

iDT算法的基本框架和DT算法相同,主要改进在于对光流图像的优化,特征正则化方式的改进以及特征编码方式的改进。这几处改进使得算法的效果有了巨大的提升,在UCF50数据集上的准确率从84.5%提高到了91.2%,在HMDB51数据集上的准确率从46.6%提高到了57.2%。下面分别对几处改进进行进行介绍。

相机运动估计

首先是最重要的一处改进,通过估计相机运动估计来消除背景上的光流以及轨迹。首先看DT算法中在没消除背景干扰时的轨迹分布。



行为识别笔记:improved dense trajectories算法(iDT算法)

可以看出,由于相机在运动,所以背景上也有很多轨迹,人的轨迹也受到相机运动的很大影响。而这些信息与要识别的动作关系是不大的,属于干扰信息。因此就希望能够识别并消除这些轨迹。而实际上轨迹的运动也是通过计算光流信息进行计算的,因此需要通过估计相机运动,来消除背景区域的光流。

由于相邻两帧图像之间变化比较小,iDT算法假设相邻的两帧图像之间的关系可以用一个投影变换矩阵来描述,即后一帧图像是前一帧图像通过投影变换得到的。因此,估计相机运动的问题就变成了利用前后帧图像计算投影变换矩阵的问题。

为了准确得估计投影变换,iDT算法中采用了两种方法来获得匹配点对。分别为SURF特征以及光流特征。在获得匹配的点对后,就可以利用RANSAC算法估计投影变换矩阵了。具体操作为:记t时刻和t+1时刻的灰度图像分别为 It It+1 ,用两张图像计算得到投影变换矩阵H( It+1=H×It )。然后用H的逆对 It+1 进行变换(warp),即 Iwarpt+1=H1×It+1 Iwarpt+1 代表假设不存在相机运动时t+1时刻的图像。用 It Iwarpt+1 就可以计算得到优化过的光流。

此处可以注意到很大的一个问题,那就是图像中人的动作可能比较显著,人身上的匹配点对会使得投影矩阵的估计不准确。因此iDT算法中使用一个huaman detector检测人的位置框,并去除该框中的匹配点对。从而使得人的运动不影响投影矩阵的估计。iDT中使用的是当时效果最好的human detector,其文章为”Weakly supervised learning of interactions between humans and objects”。而现在物体检测领域已经完全被深度学习攻陷了,比较好的方法包括faster-rcnn,ssd等算法。其中ssd的速度很快,效果也不错,推荐使用。



行为识别笔记:improved dense trajectories算法(iDT算法)

综合以上的改进算法,可以得到如上效果图。图像左侧两列图是不使用human detector的效果,右边两列图是使用human detector时的效果。可以看出加入human detector对效果的提升非常巨大。最下面一列则是比较失败的情况,按照文章中的分析,原因主要包括两点:1)运动模糊;2)人物占图像比例高时相机运动估计不准。

从光流中消除相机运动带来的影响主要有两点好处:
1. 运动描述子(主要指HOF和MBH)能更准确的描述动作,用单一描述子的分类准确率比起DT中有很大的提高
2. 由于轨迹也是利用光流进行运算的,因此,可以通过设置阈值,消除优化后的光流中位移矢量的幅值小于阈值的轨迹。

特征归一化方式

在iDT算法中,对于HOF,HOG和MBH特征采取了与DT算法(L2范数归一化)不同的方式——L1正则化后再对特征的每个维度开平方。这样做能够给最后的分类准确率带来大概0.5%的提升。

特征编码—Fisher Vector

特征编码阶段iDT算法不再使用Bag of Features方法,而是使用效果更好的Fisher Vector编码,其具体编码方式见我之前写的博文: 机器学习笔记:Fisher Vector基本原理与用法。Fisher Vector同样也是先用大量特征训练码书,再用码书对特征进行编码。在iDT中使用的Fisher Vector的各个参数为:

  • 用于训练的特征长度:trajectory+HOF+HOG+MBH=30+96+108+192=426维
  • 用于训练的特征个数:从训练集中随机采样了256000个
  • PCA降维比例:2,即维度除以2,降维后特征长度为213。先降维,后编码
  • Fisher Vector中高斯聚类的个数K:K=256

故编码后得到的特征维数为 2KD 个,即109056维。在编码后iDT同样也使用了SVM进行分类。在实际的实验中,推荐使用liblinear,速度比较快。

总结与讨论

iDT算法作为深度学习之前最好的行为识别算法,有着优良的效果和很好的鲁棒性。其中有很多非常值得借鉴的思路,比如相机运动引起的背景光流的消除,比如沿着轨迹提取特征的思路。CVPR2015中的”Action Recognition with Trajectory-Pooled Deep-Convolutional Descriptors”的思路就是沿着轨迹利用CNN提取特征,取得了进一步的效果提升。由于iDT还公开了源码,里面对算法的实现思路非常清晰,所以后续可能还会写一篇iDT的代码分析。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152059.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Pytest(13)命令行参数–tb的使用

    Pytest(13)命令行参数–tb的使用前言pytest使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败。–tb=style参数可以设置报错的时候回溯打印内容,可以设置参

  • python 正则 括号_js正则匹配0个或多个空格

    python 正则 括号_js正则匹配0个或多个空格\d匹配一个数字\w匹配一个字母或数字.匹配任意字符*表示任意个字符(包括0个),+表示至少一个字符?表示0个或1个字符^表示行的开头$表示行的结束\s匹配一个空格(也包括Tab等空白符)\s+表示至少有一个空格|A|B可以匹配A或B,所以(P|p)ython可以匹配’Pyth…

  • 2021纪念品csgo_csgo最便宜的开箱网站

    2021纪念品csgo_csgo最便宜的开箱网站2021已知目前最全的国内CSGO开箱网站大全!!incsgo国内CSGO饰品皮肤开箱网站官方链接:www.incsgo.gg注册登录自动免费获得$1.00美金取回状态:直接取回**优惠码:**csgogo(充值使用csgogo可增加5%充值金额)skinsdog狗网CSGO饰品皮肤开箱网站可直接取回官方链接:skinsdog.cc注册登录自动免费获得$0.8美金取回状态:直接取回**优惠码:**csgogo(注册使用送0.8美金)coolkaixiang.

  • java illegal character_java.lang.illegalaccesserror

    java illegal character_java.lang.illegalaccesserror本文整理匯總了Java中org.apache.commons.lang3.ArrayUtils.isNotEmpty方法的典型用法代碼示例。如果您正苦於以下問題:JavaArrayUtils.isNotEmpty方法的具體用法?JavaArrayUtils.isNotEmpty怎麽用?JavaArrayUtils.isNotEmpty使用的例子?那麽恭喜您,這裏精選的方法代碼示例或許可以為…

  • RenderControl输出html遇到的问题

    RenderControl输出html遇到的问题当我直接在后台用GridView gv=new GridView();gv.RenderControl(htmlwrite);没有问题,但是如果我从工具直接拖一个GridView到设计页面,在后台gv.RenderControl(htmlwrite);就会出现Control GridViewTotal of type GridView must be placed inside a f

  • pycharm配置运行环境_服务器运行失败怎么办

    pycharm配置运行环境_服务器运行失败怎么办今天讲一下,如何使用pycharm关联服务器代码,以及使用本地文件启动,服务器环境。1、设置连接填写服务器信息,ip地址,端口号,登录用户,密码,选择好服务器项目的路径。配置服务器同步运行环境输入密码设置路径,选择python路径,和你同步路径设置好以后,完成。然后启动,本地项目设置。设置好以后,启动本地项目。然后使用服务器地址,访问8000端口。在浏览器,使服务器的ip+8000端口,访问。即可。且,在本地修改代码,会时时同步

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号