视频行为识别检测综述 IDT TSN CNN-LSTM C3D CDC R-C3D

Video Analysis之Action Recognition(行为识别)

行为识别就是对时域预先分割好的序列断定其所属行为动做的类型,即“读懂行为”。

本文github地址php

博文末尾支持二维码赞扬哦 _html

[行为检测|论文解读]行为检测调研综述 较新python

基于Deep Learning 的视频识别技术git

科研成果----中国科学院深圳先进技术研究院 面向人体姿态行为理解的深度学习方法 github

CVPR 2014 Tutorial on Emerging Topics in Human Activity Recognitionweb

行为检测 Action Detection 相似图像目标检测

但在现实应用中更容易遇到的状况是序列还没有在时域分割(Untrimmed),
所以须要同时对行为动做进行时域定位(分割)和类型断定,这类任务通常称为行为检测。
传统 DTW 动态时间规整 分割视频
如今 利用RNN网络对未分割序列进行行为检测(行为动做的起止点的定位 和 行为动做类型的断定)

Action Detection

目的:不只要知道一个动做在视频中是否发生,还须要知道动做发生在视频的哪段时间

特色:须要处理较长的,未分割的视频。且视频一般有较多干扰,目标动做通常只占视频的一小部分。

分类:根据待检测视频是一整段读入的仍是逐次读入的,分为online和offline两种

Offline action detection:
特色:一次读入一整段视频,而后在这一整段视频中定位动做发生的时间

Online action detection:
特色:不断读入新的帧,在读入帧的过程当中须要尽量早的发现动做的发生(在动做还没有结束时就检测到)。
     同时online action detection 还须要知足实时性要求,这点很是重要。
     这致使online action detection不能采用计算复杂度过大的方法(在现有的计算能力下)
     
现有方法:
     逐帧检测法:
              即在视频序列的每帧上独立判断动做的类型,能够用CNN等方法,仅用上了spatial的信息
     滑窗法:  即设置一个固定的滑窗大小,在视频序列上进行滑窗,而后对滑窗获得的视频小片段利用action recognition的方法进行分类。
     
现状:因为此问题难度比action recognition高不少,因此如今尚未效果较好的方法

论文总结参考算法

博客参考2数据库

微软亚洲研究院 行为识别:让机器学会“察言观色”第一步api

1. 任务特色及分析

目的

给一个视频片断进行分类,类别一般是各种人的动做

特色

简化了问题,通常使用的数据库都先将动做分割好了,一个视频片段中包含一段明确的动做,
时间较短(几秒钟)且有惟一肯定的label。
因此也能够看做是输入为视频,输出为动做标签的多分类问题。
此外,动做识别数据库中的动做通常都比较明确,周围的干扰也相对较少(不那么real-world)。
有点像图像分析中的Image Classification任务。

难点/关键点

强有力的特征:
    即如何在视频中提取出能更好的描述视频判断的特征。
    特征越强,模型的效果一般较好。
特征的编码(encode)/融合(fusion):
    这一部分包括两个方面,
    第一个方面是非时序的,在使用多种特征的时候如何编码/融合这些特征以得到更好的效果;
    另一个方面是时序上的,因为视频很重要的一个特性就是其时序信息,
         一些动做看单帧的图像是没法判断的,只能经过时序上的变化判断,
         因此须要将时序上的特征进行编码或者融合,得到对于视频总体的描述。
算法速度:
    虽然在发论文刷数据库的时候算法的速度并非第一位的。
    但高效的算法更有可能应用到实际场景中去.

2. 经常使用数据库

【数据集整理】人体行为识别和图像识别网络

行为识别的数据库比较多,这里主要介绍两个最经常使用的数据库,也是近年这个方向的论文必作的数据库。
1. UCF101:来源为YouTube视频,共计101类动做,13320段视频。
   共有5个大类的动做:
            1)人-物交互;
            2)肢体运动;
            3)人-人交互;
            4)弹奏乐器;
            5)运动。

数据库主页

2. HMDB51:来源为YouTube视频,共计51类动做,约7000段视频。
  HMDB: a large human motion database

数据库主页

3. 在Actioin Recognition中,实际上还有一类骨架数据库,
好比MSR Action 3D,HDM05,SBU Kinect Interaction Dataset等。
这些数据库已经提取了每帧视频中人的骨架信息,基于骨架信息判断运动类型。 

4. ACTIVITYNET Large Scale Activity Recognition Challenge

3. 研究进展

现在人体行为识别是计算机视觉研究的一个热点,
人体行为识别的目标是从一个未知的视频或者是图像序列中自动分析其中正在进行的行为。
简单的行为识别即动做分类,给定一段视频,只需将其正确分类到已知的几个动做类别,
复杂点的识别是视频中不只仅只包含一个动做类别,而是有多个,
系统需自动的识别出动做的类别以及动做的起始时刻。
行为识别的最终目标是分析视频中
哪些人       who
在什么时刻    when
什么地方,    where
干什么事情,  what
即所谓的“W4系统”

人体行为识别应用背景很普遍,主要集中在智能视频监控,
病人监护系统,人机交互,虚拟现实,智能家居,智能安防,
运动员辅助训练,另外基于内容的视频检索和智能图像压缩等
有着广阔的应用前景和潜在的经济价值和社会价值,
其中也用到了很多行为识别的方法。

3.1 传统方法

特征综述

密集轨迹算法(DT算法) iDT(improved dense trajectories)特征

Action Recognition by Dense Trajectories
 Action recognition with improved trajectories

iDT算法

iDT算法用法与代码解析

Stacked Fisher Vector 编码 基本原理

[DT论文](Action Recognition by Dense Trajectories)

基本思路:
        DT算法的基本思路为利用光流场来得到视频序列中的一些轨迹,
        再沿着轨迹提取HOF,HOG,MBH,trajectory4种特征,其中HOF基于灰度图计算,
        另外几个均基于dense optical flow计算。
        最后利用FV(Fisher Vector)方法对特征进行编码,再基于编码结果训练SVM分类器。
        而iDT改进的地方在于它利用先后两帧视频之间的光流以及SURF关键点进行匹配,
        从而消除/减弱相机运动带来的影响,改进后的光流图像被成为warp optical flow
总结:        
A. 利用光流场来得到视频序列中的一些轨迹;
    a.	经过网格划分的方式在图片的多个尺度上分别密集采样特征点,滤除一些变换少的点;
    b.	计算特征点邻域内的光流中值来获得特征点的运动速度,进而跟踪关键点;
B. 沿轨迹提取HOF,HOG,MBH,trajectory,4种特征
    其中HOG基于灰度图计算,
    另外几个均基于稠密光流场计算。
    a.	HOG, 方向梯度直方图,分块后根据像素的梯度方向统计像素的梯度幅值。
    b.	HOF, 光流直方图,光流经过当前帧梯度矩阵和相邻帧时间上的灰度变换矩阵计算获得,
        以后再对光流方向进行加权统计。
    c.	MBH,运动边界直方图,实质为光流梯度直方图。
    d.	Trajectories, 轨迹特征,特征点在各个帧上位置点的差值,构成轨迹变化特征。
C.特征编码—Bag of Features;
    a. 对训练集数据提取上述特征,使用K_means聚类算法,对特征进行聚类,获得特征字典;
    b.  使用字典单词对测试数据进行量化编码,获得固定长度大小的向量,可以使用VQ或则SOMP算法。
D. 使用SVM进行分类
    对编码量化以后的特征向量使用SVM支持向量机进行分类。

iDT(improved dense trajectories) 改进

iDT论文

LEAR实验室 这个实验室我的感受很不错,放出来的代码基本都能work,并且有不错的的效果。

个人代码 idt+fv+svm

1. 剔除相机运动引发的背景光流
        a. 使用SURF特征算法匹配先后两帧的 匹配点对,这里会使用人体检测,剔除人体区域的匹配点,运动量大,影响较大;
        b. 利用光流算法计算匹配点对,剔除人体区域的匹配点对;
        c. 合并SURF匹配点对 和 光流匹配点对,利用RANSAC 随机采样序列一致性算法估计先后两帧的 单应投影变换矩阵H;
        d. 利用矩阵H的逆矩阵,计算获得当前帧除去相机运动的状态I’= H.inv * I ;
        e. 计算去除相机运动后的帧I' 的 光流。
        f. 光流算法 Ft
           假设1:光照亮度恒定:
                  I(x, y, t) =  I(x+dx, y+dy, t+dt) 
                 泰勒展开:
                  I(x+dx, y+dy, t+dt) =  
                                        I(x, y, t) + dI/dx * dx + dI/dy * dy + dI/dt * dt
                                      =  I(x, y, t) + Ix * dx  + Iy * dy + It * dt
                 获得:
                      Ix * dx  + Iy * dy + It * dt = 0
                 由于 像素水平方向的运动速度 u=dx/dt,  像素垂直方向的运动速度 v=dy/dt
                 等式两边同时除以 dt ,获得:
                      Ix * dx/dt  + Iy * dy/dt + It = 0
                      Ix * u  + Iy * v + It = 0
                 写成矩阵形式:
                      [Ix, Iy] * [u; v] = -It,  式中Ix, Iy为图像空间像素差值(梯度), It 为时间维度,像素差值
           假设2:局部区域 运动相同
                 对于点[x,y]附近的点[x1,y1]  [x2,y2]  , ... , [xn,yn]  都具备相同的速度 [u; v]
                 有:
                  [Ix1, Iy1;                      [It1
                   Ix2, Iy2;                       It2
                   ...               *  [u; v] = - ...
                   Ixn, Iyn;]                      Itn]
                 写成矩阵形式:
                  A * U = b
                 由两边同时左乘 A逆 获得:
                  U = A逆 * b
                 因为A矩阵的逆矩阵可能不存在,能够曲线救国改求其伪逆矩阵
                  U = (A转置*A)逆 * A转置 * b
           获得像素的水平和垂直方向速度之后,能够获得:
               速度幅值: 
                        V = sqrt(u^2 + v^2)
               速度方向:Cet = arctan(v/u)      

    2. 特征归一化方式
        在iDT算法中,对于HOF,HOG和MBH特征采起了与DT算法(L2范数归一化)不一样的方式。
           L2范数归一化  : Xi' = Xi/sqrt(X1^2 + ... + Xn^2)
        L1正则化后再对特征的每一个维度开平方。
           L1范数归一化  : Xi' = Xi/(abs(X1) + ... + abs(Xn))
           Xi'' = sqrt(Xi')
        这样作可以给最后的分类准确率带来大概0.5%的提高
        
    3. 特征编码—Fisher Vector
        特征编码阶段iDT算法再也不使用Bag of Features/ BOVM方法,
        (提取图像的SIFT特征,经过(KMeans聚类),VQ矢量量化,构建视觉词典(码本))
        
        而是使用效果更好的Fisher Vector编码.
        FV采用混合高斯模型(GMM)构建码本,
        可是FV不仅是存储视觉词典的在一幅图像中出现的频率,
        而且FV还统计视觉词典与局部特征(如SIFT)的差别
        
        Fisher Vector一样也是先用大量特征训练码书,再用码书对特征进行编码。

        在iDT中使用的Fisher Vector的各个参数为:
           1.  用于训练的特征长度:trajectory+HOF+HOG+MBH = 30+96+108+192 = 426维
           2.  用于训练的特征个数:从训练集中随机采样了256000个
           3.  PCA降维比例:2,即维度除以2,降维后特征长度为 D = 426 / 2 = 213。
               先降维,后编码
           4. Fisher Vector中 高斯聚类的个数K:K=256
        故编码后获得的特征维数为2*K*D个,即109056维。
        在编码后iDT一样也使用了SVM进行分类。
        在实际的实验中,推荐使用liblinear,速度比较快。
    4. 其余改进思想 
       原先是沿着轨迹提取手工设计的特征,能够沿着轨迹利用CNN提取特征。

Fisher Vector 特征编码 主要思想是使用高斯分布来拟合单词 而不是简简单单的聚类产生中心点

在通常的分类问题中,一般的套路都是提取特征,将特征输入分类器训练,获得最终的模型。
可是在具体操做时,一开始提出的特征和输入分类器训练的特征是不同的。
好比假设有N张100×100的图像,分别提取它们的HoG特征x∈Rp×q,p为特征的维数,q为这幅图像中HoG特征的个数。 
若是把直接把这样的一万个x直接投入分类器训练,效果不必定好,
由于不必定每一个像素点的信息都是有价值的,里面可能有不少是冗余的信息。
并且特征维度过高会致使最终的训练时间过长。 
因此一般会对raw features作一些预处理。最经常使用的就是词袋模型(bag of words)。

高斯混合模型建模与聚类建模的对比

K-means是最经常使用的聚类方法之一,咱们的例子中,有N幅图像,每幅图像有x∈Rp×q的特征,
那么全部数据的特征矩阵为X∈Rp×Nq。也就是说如今一共存在Nq个数据点,它们分布在一个p维的空间中,
经过聚类后能够找到M个聚类中心。而后对于每一幅图像而言,
分别计算它的q个p维特征属于哪个聚类中心(距离最近),最终统计M个聚类中心分别拥有多少特征,
获得一个M维的向量。这个向量就是最终的特征。 
k-means的缺点在于,它是一个hard聚类的方法,好比有一个点任何一个聚类中心都不属于,
可是词袋模型仍然可能会把它强行划分到一个聚类中心去。
对于一个点,它属不属于某个聚类中心的可能性是个属于(0,1)的整数值。 

相反,高斯混合模型(Gaussian Mixture Model) 就是一种soft聚类的方法,
它创建在一个重要的假设上,即任意形状的几率分布均可以用多个高斯分布函数去近似。
相似傅里叶变换,任何信号曲线均可以用正余弦函数来近似。

顾名思义,高斯混合模型是由不少个高斯分布组成的模型,每个高斯分布都是一个component。
每个component Nk∼(μk,σk),k=1,2,…K对应的是一个聚类中心,这个聚类中心的坐标能够看做(μk,σk)

通常解高斯混合模型都用的是EM算法(指望最大化算法)。 
EM算法分为两步: 
在E-step中,估计数据由每一个component生成的几率。 
    假设μ,Σ,ϕ已知,对于每一个数据 xi 来讲,它由第k个component 生成的几率为 
在M-step中,估计每一个component的参数μk,Σk,πkk=1,…K。 
    利用上一步获得的pik,它是对于每一个数据 xi 来讲,它由第k个component生成的几率,
    也能够当作第k个component在生成这个数据上所作的贡献,或者说,
    咱们能够看做 xi这个值其中有pikxi 这部分是由 第k个component所生成的。
    如今考虑全部的数据,能够看作第k个component生成了 p1kx1,…,pNkxN 这些点。
    因为每一个component 都是一个标准的 Gaussian 分布,能够很容易的根据指望、方差的定义求出它们: 
重复迭代前面两步,直到似然函数的值收敛为止。

VLFeat数学推导

FV采用GMM构建视觉词典,为了可视化,这里采用二维的数据,
    然这里的数据能够是SIFT或其它局部特征,
    具体实现代码以下:

    %采用GMM模型对数据data进行拟合,构建视觉词典  
    numFeatures = 5000 ;            %样本数  
    dimension = 2 ;                 %特征维数  
    data = rand(dimension,numFeatures) ; %这里随机生成一些数据,这里data能够是SIFT或其它局部特征  

    numClusters = 30 ;  %视觉词典大小  
    [means, covariances, priors] = vl_gmm(data, numClusters); %GMM拟合data数据分布,构建视觉词典  

    这里获得的means、covariances、priors分别为GMM的均值向量,协方差矩阵和先验几率,也就是GMM的参数。

    这里用GMM构建视觉词典也存在一个问题,这是GMM模型固有的问题,
    就是当GMM中的高斯函数个数,也就是聚类数,也就是numClusters,
    若与真实的聚类数不一致的话,
    GMM表现的不是很好(针对指望最大化EM方法估计参数),具体请参见GMM。

    接下来,咱们建立另外一组随机向量,这些向量用Fisher Vector和刚得到的GMM来编码,
    具体代码以下:

    numDataToBeEncoded = 1000;  
    dataToBeEncoded = rand(dimension,numDataToBeEncoded);    %2*1000维数据
    % 进行FV编码
    encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);

idt算法总结

一、密集采样:
    多尺度(8个)
    间隔采样(5)
    无纹理区域点的剔除
二、光流法跟踪:
    I(x, y, t) = I(x+dx, y+dy, t+dt) 
    泰勒展开:
    [Ix, Iy] * [u; v] = -It 
    局部区域 运动相同:
     A * U = b 
     U = (A转置*A)逆 * A转置 * b  伪逆求解
    光流中指滤波:
     Pt+1=(xt+1,yt+1)=(xt,yt)+(M∗Ut)|xt,yt
三、特征计算:
    区域选取:
    一、选取相邻L帧(15);
    二、对每条轨迹在每一个帧上取N*N 
       的像素区域(32*32)
    三、对上述区域划分红nc*nc个
       格子(2*2)
    四、在时间空间上划分红nt段(3段)
    五、这样就有 nc*nc*nt个空间划   
       分区域。

传统视频行为分析算法总结

a. 特征提取方法

1. 方向梯度直方图 HOG   
        图像平面像素水平垂直偏差;
        再求和成梯度幅值和梯度方向;
        划分梯度方向,按梯度大小加权统计。
        
2. 光流直方图     HOF  
    须要梯度图和时间梯度图来计算像素水平和垂直速度,
    再求合成速度幅值和方向,
    按上面的方式统计。
    
     这里还可使用 目标检测 去除背景光溜,只保留人体区域的光流。
     
3. 光流梯度直方图 MBH   
    在光流图上计算水平和垂直光流梯度,
    计算合成光流梯度幅值和方向,
    再统计。

4. 轨迹特征      Trajectories, 
    匹配点按照光流速度获得坐标,
    获取相邻帧匹配点的坐标差值;
    按一条轨迹串联起来;
    正则化以后就是一个轨迹特征。
    
5. 人体骨骼特征
    经过RGB图像进行关节点估计(Pose Estimation)得到;
    或是经过深度摄像机直接得到(例如Kinect)。

b. 特征归一化方法

L2范数归一化  :
    Xi' = Xi/sqrt(X1^2 + ... + Xn^2)
L1范数归一化后再对特征的每一个维度开平方。
    L1范数归一化  : Xi' = Xi/(abs(X1) + ... + abs(Xn))
    开平方        :Xi'' = sqrt(Xi')

c. 特征编码方法

1) 视觉词袋BOVM模型

  1. 使用K_mean聚类算法对训练数据集特征集合进行聚类,
     获得特征单词字典;
     
  2. 使用矢量量化VQ算法 或者 同步正交匹配追踪SOMP算法 
     对分割后的测试样本数据的特征 用特征单词字典进行编码;
     
  3.计算一个视频的 字典单词 的视频表示向量,获得视频的特征向量。
  
2) Fisher Vector 特征编码,高斯混合模型拟合中心点
  1. 使用高斯混合模型GMM算法提取训练集特征中的聚类信息,获得 K个高斯分布表示的特征单词字典;
  
  2. 使用这组组K个高斯分布的线性组合来逼近这些 测试集合的特征,也就是FV编码.
     Fisher vector本质上是用似然函数的梯度vector来表达一幅图像, 说白了就是数据拟合中对参数调优的过程。
     因为每个特征是d维的,须要K个高斯分布的线性组合,有公式5,一个Fisher vector的维数为(2*d+1)*K-1维。
  3.计算一个视频的 字典单词 的视频表示向量,获得视频的特征向量。

  Fisher Vector步骤总结:
    1.选择GMM中K的大小
    1.用训练图片集中全部的特征(或其子集)来求解GMM(能够用EM方法),获得各个参数;
    2.取待编码的一张图像,求得其特征集合;
    3.用GMM的先验参数以及这张图像的特征集合按照以上步骤求得其fv;
    4.在对训练集中全部图片进行2,3两步的处理后能够得到fishervector的训练集,而后能够用SVM或者其余分类器进行训练。

3) 两种编码方式对比
    通过fisher vector的编码,大大提升了图像特征的维度,可以更好的用来描述图像。
    FisherVector相对于BOV的优点在于,BOV获得的是一个及其稀疏的向量,
    因为BOV只关注了关键词的数量信息,这是一个0阶的统计信息;
    FisherVector并不稀疏,同时,除了0阶信息,
    Fisher Vector还包含了1阶(指望)信息、2阶(方差信息),
    所以FisherVector能够更加充分地表示一幅图片。

d. 视频分割 相似语言识别中的 间隔点检测

1) 动态时间规整DTW

博客参考

1) 按b的方法提取训练集和测试集的特征
   2) 计算训练集和测试集特征类似度距离
   3) 使用动态规划算法为测试机样本在训练集中找出最匹配的一个
   4) 对训练集剩余部分采用3) 的方法依次找出最匹配的一个
   
    1)输入:
     1. 全部单个训练视频样本的量化编码后的特征向量.
     2. 包含多个行为动做的测试视频的量化编码后的特征向量.
    2)算法描述:
      1. 测试样本特征向量 和 多个训练样本特征向量分别计算特征匹配距离。
      2. 单个测试视频的每一帧的特征向量和测试视频的每一帧的特征向量计算类似度(欧氏距离).
      3. 以训练视频的最后一帧的特征向量和测试视频的每一帧的特征向量的距离点位起点,
         使用 动态规划 的方法,找出一条最优匹配路径,最后计算路径上特征匹配距离之和,
         找出一个最小的,对应的分割点即为测试视频与当前训练样本的最优匹配。
      4. 迭代找出测试视频样本和其余训练样本的最有匹配,获得最优匹配距离。
      5. 在全部的好的匹配距离中找出一个最小的距离,即为对应测试视频匹配的行为动做。
      6. 将测试视频中已经分割出去的视频序列剔除,剩余的视频重复1~5的步骤,获取对应的标签和时间分割信息。

2) CDP
3) HMM
    1) 将训练集的每一种行为当成系统的隐含状态
    2) 根据测试视频这个可见状态链推测最有可能的隐含状态链
    3)须要求的每种隐含状态之间的状态转移几率,
    以及每种隐含状态输出一个可见状态的几率。
    4) 使用维特比算法进行求解出一个最大几率的隐含状态链(即行为状态序列)

博客参考

维特比算法 最大可能的隐含状态连 代码

hmm python代码

1) 将训练集的每一种行为当成系统的隐含状态
    2) 根据测试视频这个可见状态链推测最有可能的隐含状态链
    3)须要求的每种隐含状态之间的状态转移几率,
    以及每种隐含状态输出一个可见状态的几率。
    4) 使用维特比算法进行求解出一个最大几率的隐含状态链(即行为状态序列)
    
4) 深度学习的方法分割动做 

DTW/HMM/CRBM/高斯过程

e. 分类器分类

1.  SVM 支持向量机进行分类。
    2.  KNN 最近邻分类器进行分类。

3.2 深度学习方法

时空双流网络结构 Two Stream Network及衍生方法

空时注意力模型(Attention)之于行为识别

提出

“Two-Stream Convolutional Networks for Action Recognition in Videos”(2014NIPS)

论文博客翻译

Two Stream方法最初在这篇文章中被提出:
在空间部分,以单个帧上的外观形式,携带了视频描绘的场景和目标信息。
           其自身静态外表是一个颇有用的线索,由于一些动做很明显地与特定的目标有联系。
在时间部分,以多帧上的运动形式,表达了观察者(摄像机)和目标者的运动。

基本原理为:
    1. 对视频序列中每两帧计算密集光流,获得密集光流的序列(即temporal信息)。
    2. 而后对于视频图像(spatial)和密集光流(temporal)分别训练CNN模型,
       两个分支的网络分别对动做的类别进行判断,
    3. 最后直接对两个网络的class score进行fusion(包括直接平均和svm两种方法),获得最终的分类结果。
注意,对与两个分支使用了相同的2D CNN网络结构,其网络结构见下图。
实验效果:UCF101-88.0%,HMDB51-59.4% 

结构:

光流 和 轨迹

改进1 CNN网络进行了spatial以及temporal的融合

Convolutional Two-Stream Network Fusion for Video Action Recognition“(2016CVPR)

代码 matlab github

这篇论文的主要工做为:
    1. 在two stream network的基础上,
       利用CNN网络进行了spatial以及temporal的融合,从而进一步提升了效果。
    2. 此外,该文章还将基础的spatial和temporal网络都换成了VGG-16 network。
实验效果:UCF101-92.5%,HMDB51-65.4%

改进2 LSTM网络 融合双流 spatial以及temporal

双流 + LSTM

这篇文章主要是用LSTM来作two-stream network的temporal融合。效果通常

相关研究主页

TSN 结构

Temporal Segment Networks: Towards Good Practices for Deep Action Recognition

caffe code

TSN(Temporal Segment Networks)代码实验

这篇文章是港中文Limin Wang大神的工做,他在这方面作了不少很棒的工做,
能够followt他的主页:http://wanglimin.github.io/ 。

这篇文章提出的TSN网络也算是spaital+temporal fusion,结构图见下图。

这篇文章对如何进一步提升two stream方法进行了详尽的讨论,主要包括几个方面(完整内容请看原文): 
    1. 据的类型:除去two stream本来的RGB image和 optical flow field这两种输入外,
       章中还尝试了RGB difference及 warped optical flow field两种输入。
        终结果是 RGB+optical flow+warped optical flow的组合效果最好。
    2. 构:尝试了GoogLeNet,VGGNet-16及BN-Inception三种网络结构,其中BN-Inception的效果最好。
    3. 包括 跨模态预训练,正则化,数据加强等。
    4. 果:UCF101-94.2%,HMDB51-69.4% 
    
two-stream 卷积网络对于长范围时间结构的建模无能为力,
主要由于它仅仅操做一帧(空间网络)或者操做短片断中的单堆帧(时间网络),
所以对时间上下文的访问是有限的。
视频级框架TSN能够从整段视频中建模动做。

和two-stream同样,TSN也是由空间流卷积网络和时间流卷积网络构成。
但不一样于two-stream采用单帧或者单堆帧,TSN使用从整个视频中稀疏地采样一系列短片断,
每一个片断都将给出其自己对于行为类别的初步预测,从这些片断的“共识”来获得视频级的预测结果。
在学习过程当中,经过迭代更新模型参数来优化视频级预测的损失值(loss value)。

TSN网络示意图以下:

由上图所示,一个输入视频被分为 K 段(segment),一个片断(snippet)从它对应的段中随机采样获得。
不一样片断的类别得分采用段共识函数(The segmental consensus function)
进行融合来产生段共识(segmental consensus),这是一个视频级的预测。
而后对全部模式的预测融合产生最终的预测结果。

具体来讲,给定一段视频 V,把它按相等间隔分为 K 段 {S1,S2,⋯,SK}。
接着,TSN按以下方式对一系列片断进行建模:
TSN(T1,T2,⋯,TK)=H(G(F(T1;W),F(T2;W),⋯,F(TK;W)))

其中:
(T1,T2,⋯,TK) 表明片断序列,每一个片断 Tk 从它对应的段 Sk 中随机采样获得。
F(Tk;W) 函数表明采用 W 做为参数的卷积网络做用于短片断 Tk,函数返回 Tk 相对于全部类别的得分。
段共识函数 G(The segmental consensus function)结合多个短片断的类别得分输出以得到他们之间关于类别假设的共识。
基于这个共识,预测函数 H 预测整段视频属于每一个行为类别的几率(本文 H 选择了Softmax函数)。
结合标准分类交叉熵损失(cross-entropy loss);
网络结构
一些工做代表更深的结构能够提高物体识别的表现。
然而,two-stream网络采用了相对较浅的网络结构(ClarifaiNet)。
本文选择BN-Inception (Inception with Batch Normalization)构建模块,
因为它在准确率和效率之间有比较好的平衡。
做者将原始的BN-Inception架构适应于two-stream架构,和原始two-stream卷积网络相同,
空间流卷积网络操做单一RGB图像,时间流卷积网络将一堆连续的光流场做为输入。

网络输入
TSN经过探索更多的输入模式来提升辨别力。
除了像two-stream那样,
空间流卷积网络操做单一RGB图像,
时间流卷积网络将一堆连续的光流场做为输入,
做者提出了两种额外的输入模式:
RGB差别(RGB difference)和
扭曲的光流场(warped optical flow fields,idt中去除相机运动后的光流)。

TSN改进版本之一 加权融合

改进的地方主要在于fusion部分,不一样的片断的应该有不一样的权重,而这部分由网络学习而得,最后由SVM分类获得结果。

Deep Local Video Feature for Action Recognition 【CVPR2017】

TSN改进版本二 时间推理

这篇是MIT周博磊大神的论文,做者是也是最近提出的数据集 Moments in time 的做者之一。
该论文关注时序关系推理。
对于哪些仅靠关键帧(单帧RGB图像)没法辨别的动做,如摔倒,其实能够经过时序推理进行分类。
除了两帧之间时序推理,还能够拓展到更多帧之间的时序推理。
经过对不一样长度视频帧的时序推理,最后进行融合获得结果。
该模型创建TSN基础上,在输入的特征图上进行时序推理。
增长三层全链接层学习不一样长度视频帧的权重,及上图中的函数g和h。

除了上述模型外,还有更多关于时空信息融合的结构。
这部分与connection部分有重叠,因此仅在这一部分说起。
这些模型结构类似,区别主要在于融合module的差别,细节请参阅论文。

Temporal Relational Reasoning in Videos

LSTM 结构融合双流特征

Beyond Short Snippets: Deep Networks for Video Classification Joe

这篇文章主要是用LSTM来作two-stream network的temporal融合。效果通常
实验效果:UCF101-88.6%

Understanding LSTM Networks

LSTM理解

RNN的展开结构  ht = f(w1*xt + w2*ht-1 + b) 复合函数+递推数列
后一项的值由前一项的值ht-1 和 当前时刻的输入值xt  决定,有机会经过当前的输入值改变本身的命运。
ht-1提现了记忆功能,ht-1是由ht-2和xt-1所决定,因此ht的值其实是由 x1, x2, x3,..., xt决定的,
它记住了以前完整的序列信息。

LSTM的展开结构

LSTM 功能

LSTM ResNet cnn TSN

行为识别 人体骨架检测+LSTM

人体骨架怎么得到呢?
主要有两个途径:
经过RGB图像进行关节点估计(Pose Estimation openpose工具箱)得到,
或是经过深度摄像机直接得到(例如Kinect)。
每一时刻(帧)骨架对应人体的K个关节点所在的坐标位置信息,一个时间序列由若干帧组成。

3 骨架获取 Stacked Hourglass Networks for Human Pose Estimation

论文分析 使用全卷积网络解决人体姿态分析问题

4 骨架获取 Realtime Multi-person 2D Pose Estimation using Part Affinity Fields

基于部分亲和字段PAF(Part Affinity Field)的2D图像姿态估计 博客参考

Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition 骨骼时空网络兴趣点

思路: 
在视频上先对每一帧作姿态估计(Kinetics 数据集上文章用的是OpenPose),而后能够构建出一个空间上的骨架时序图。
而后应用ST-GCN网络提取高层特征
最后用softmax分类器进行分类

博客1

博客2

1. 空时注意力模型(Attention)之于行为识别

An End-to-End Spatio-Temporal Attention Model for Human Action Recognition from Skeleton Data

LSTM网络框架和关节点共现性(Co-occurrence)的挖掘之于行为识别。
时域注意力模型:
    设计了时域注意力模型,经过一个LSTM子网络来自动学习和获知序列中不一样帧的重要性,
    使重要的帧在分类中起更大的做用,以优化识别的精度。
    
空域注意力:
    设计了一个LSTM子网络,依据序列的内容自动给不一样关节点分配不一样的重要性,即给予不一样的注意力。
    因为注意力是基于内容的,即当前帧信息和历史信息共同决定的,
    所以,在同一个序列中,关节点重要性的分配能够随着时间的变化而改变。

2. LSTM网络框架和关节点共现性(Co-occurrence)的挖掘之于行为识别

Co-Occurrence Feature Learning for Skeleton Based Action Recognition Using Regularized Deep LSTM Networks

3. RNN 基于联合分类和回归的循环神经网络之于行为动做检测

Online Human Action Detection Using Joint Classification-Regression Recurrent Neural Networks

3D卷积 C3D Network

提出 C3D

Learning spatiotemporal features with 3d convolutional networks

C3D论文笔记

C3D_caffe 代码

C3D是facebook的一个工做,采用3D卷积和3D Pooling构建了网络。
经过3D卷积,C3D能够直接处理视频(或者说是视频帧的volume)
实验效果:UCF101-85.2% 能够看出其在UCF101上的效果距离two stream方法还有不小差距。
         我认为这主要是网络结构形成的,C3D中的网络结构为本身设计的简单结构,以下图所示。

速度:
        C3D的最大优点在于其速度,在文章中其速度为314fps。而实际上这是基于两年前的显卡了。
用Nvidia 1080显卡能够达到600fps以上。
因此C3D的效率是要远远高于其余方法的,我的认为这使得C3D有着很好的应用前景。

改进 I3D[Facebook]

即基于inception-V1模型,将2D卷积扩展到3D卷积。

Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset

T3D 时空 3d卷积

Temporal 3D ConvNets:New Architecture and Transfer Learning for Video Classificati

该论文值得注意的,
    一方面是采用了3D densenet,区别于以前的inception和Resnet结构;
    另外一方面,TTL层,即便用不一样尺度的卷积(inception思想)来捕捉讯息。

P3D [MSRA]

Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks

博客

改进ResNet内部链接中的卷积形式。而后,超深网络,通常人显然只能空有想法,望而却步。

CDC 3D卷积方式的 改进 TPC 时序保留卷积 这里也是 行为检测

Exploring Temporal Preservation Networks for Precise Temporal Action Localization TPC 时序保留卷积

思路:
这篇文章是在CDC网络的基础进行改进的,CDC最后是采用了时间上上采样,
空间下采样的方法作到了 per-frame action predictions,并且取得了可信的行为定位的结果。
可是在CDC filter以前时间上的下采样存在必定时序信息的丢失。
做者提出的TPC网络,采用时序保留卷积操做,
这样可以在不进行时序池化操做的状况下得到一样大小的感觉野而不缩短时序长度。

其余方法

TPP Temporal Pyramid Pooling

End-to-end Video-level Representation Learning for Action Recognition

Pooling。时空上都进行这种pooling操做,旨在捕捉不一样长度的讯息。

TLE 时序线性编码层

1. 本文主要提出了“Temporal Linear Encoding Layer” 时序线性编码层,主要对视频中不一样位置的特征进行融合编码。
   至于特征提取则可使用各类方法,文中实验了two stream以及C3D两种网络来提取特征。

2. 实验效果:UCF101-95.6%,HMDB51-71.1% (特征用two stream提取)。
   应该是目前为止看到效果最好的方法了(CVPR2017里可能会有更好的效果)

Deep Temporal Linear Encoding Networks

key volume的自动识别

A Key Volume Mining Deep Framework for Action Recognition

本文主要作的是key volume的自动识别。
一般都是将一整段动做视频进行学习,而事实上这段视频中有一些帧与动做的关系并不大。
所以进行关键帧的学习,再在关键帧上进行CNN模型的创建有助于提升模型效果。
本文达到了93%的正确率吗,为目前最高。
实验效果:UCF101-93.1%,HMDB51-63.3%

使用LSTM,RNN循环神经网络来完成时间上的建模

CNN提取特征->LSTM建模 A Torch Library for Action Recognition and Detection Using CNNs and LSTMs

Long-term Recurrent Convolutional Networks for Visual Recognition and Description

代码主页

caffe examples/LRCN_activity_recognition"

对LSTM研究很好的一个老师主页

LSTM 用于行为识别 图像描述 视频描述 博客详解

Multimodal Keyless Attention Fusion for Video Classification 多模态 LSTM

[行为识别]RPAN:An end-to-end recurrent pose-attention network for action recognition CNN+姿态注意力+lstm](http://www.noobyard.com/article/p-ckgalmvx-oz.html)

CNN+姿态注意力+lstm 论文

数据数据的提纯

输入一方面指输入的数据类型和格式,也包括数据加强的相关操做。

双流网络中,空间网络通道的输入格式一般为单RGB图像或者是多帧RGB堆叠。
而空间网络通常是直接对ImageNet上经典的网络进行finetune。
虽然近年来对motion信息的关注逐渐上升,指责行为识别过分依赖背景和外貌特征,
而缺乏对运动自己的建模,可是,事实上,运动既不是名词,
也不该该是动词,而应该是动词+名词的形式,例如:play+basketball,也能够是play+football。
因此,我的认为,虽然应该加大的时间信息的关注,但不能否认空间特征的重要做用。

空间流上 改进 提取关键帧

空间网络主要捕捉视频帧中重要的物体特征。
目前大部分公开数据集其实能够仅仅依赖单图像帧就能够完成对视频的分类,
并且每每不须要分割,那么,在这种状况下,
空间网络的输入就存在着很大的冗余,而且可能引入额外的噪声。

是否能够提取出视频中的关键帧来提高分类的水平呢?下面这篇论文就提出了一种提取关键帧的方法。

A Key Volume Mining Deep Framework for Action Recognition 【CVPR2016】

提取关键帧 改进

虽然上面的方法能够集成到一个网络中训练,
可是思路是按照图像分类算法RCNN中须要分步先提出候选框,挑选出关键帧。
既然挑选前须要输入整个视频,可不能够省略挑选这个步骤,
直接在卷积/池化操做时,重点关注那些关键帧,而忽视那些冗余帧呢?
去年就有人提出这样的解决方法。

AdaScan: Adaptive Scan Pooling in Deep Convolutional Neural Networks for Human Action Recognition in Videos

注:AdaScan的效果通常,关键帧的质量比上面的Key Volume Mining效果要差一点。不过模型总体比较简单。

时间流 上输入的改进 光流信息

输入方面,空间网络目前主要集中在关键帧的研究上。
而对于temporal通道而言,则是更多人的关注焦点。
首先,光流的提取须要消耗大量的计算力和时间(有论文中提到几乎占据整个训练时间的90%);
其次,光流包含的未必是最优的的运动特征。

On the Integration of Optical Flow and Action Recognition

cnn网络自学习 光流提取

那么,光流这种运动特征可不能够由网络本身学呢?

Hidden Two-Stream Convolutional Networks for Action Recognition

该论文主要参考了flownet,即便用神经网络学习生成光流图,而后做为temporal网络的输入。
该方法提高了光流的质量,并且模型大小也比flownet小不少。
有论文证实,光流质量的提升,尤为是对于边缘微小运动光流的提高,对分类有关键做用。
另外一方面,该论文中也比较了其他的输入格式,如RGB diff。但效果没有光流好。

目前,除了能够考虑尝试新的数据加强方法外,如何训练出替代光流的运动特征应该是接下来的发展趋势之一。

信息的融合

这里链接主要是指双流网络中时空信息的交互。
一种是单个网络内部各层之间的交互,如ResNet/Inception;
一种是双流网络之间的交互,包括不一样fusion方式的探索,
   目前值得考虑的是参照ResNet的结构,链接双流网络。

基于 ResNet 的双流融合

空间和时序网络的主体都是ResNet,
增长了从Motion Stream到Spatial Stream的交互。论文还探索多种方式。

Spatiotemporal Multiplier Networks for Video Action Recognition

金字塔 双流融合

Spatiotemporal Pyramid Network for Video Action Recognition

行为识别的关键就在于如何很好的融合空间和时序上的特征。
做者发现,传统双流网络虽然在最后有fusion的过程,但训练中确实单独训练的,
最终结果的失误预测每每仅来源于某一网络,而且空间/时序网络各有所长。
论文分析了错误分类的缘由:
空间网络在视频背景类似度高的时候容易失误,
时序网络在long-term行为中由于snippets length的长度限制容易失误。
那么可否经过交互,实现两个网络的互补呢?

该论文重点在于STCB模块,详情请参阅论文。
交互方面,在保留空间、时序流的同时,对时空信息进行了一次融合,最后三路融合,得出最后结果

SSN(structured segment network,结构化的段网络)

经过结构化的时间金字塔对每一个行为实例的时间结构进行建模。
金字塔顶层有decomposed discriminative model(分解判别模型),
包含两个分类器:用于分类行为(针对recognition)和肯定完整性(针对localization)。
集成到统一的网络中,能够以端到端的方式高效地进行训练。
为了提取高质量行为时间proposal,采用temporal actionness grouping (TAG)算法。

[代码开源
论文
SSN博客解析

这两篇论文从pooling的层面提升了双流的交互能力

Attentional Pooling for Action Recognition

ActionVLAD: Learning spatio-temporal aggregation for action classification

基于ResNet的结构探索新的双流链接方式

Deep Convolutional Neural Networks with Merge-and-Run Mappings

4. 视频行为检测

CDC 用于未修剪视频中精确时间动做定位的卷积-反-卷积网络

基于3D卷积C3D作帧分类,而后预测存在行为的视频段并分类

五篇Untrimmed(精细分割)相关论文论文汇总简介

CDC网络[13]是在C3D网络基础上,借鉴了FCN的思想。
在C3D网络的后面增长了时间维度的上采样操做,作到了帧预测(frame level labeling)。

一、第一次将卷积、反卷积操做应用到行为检测领域,CDC同时在空间下采样,在时间域上上采样。
二、利用CDC网络结构能够作到端到端的学习。
三、经过反卷积操做能够作到帧预测(Per-frame action labeling)。

CDC6 反卷积   
3DCNN可以很好的学习时空的高级语义抽象,可是丢失了时间上的细粒度,
众所周知的C3D架构输出视频的时序长度减少了8倍
在像素级语义分割中,反卷积被证实是一种有效的图像和视频上采样的方法,
用于产生与输入相同分辨率的输出。
对于时序定位问题,输出的时序长度应该和输入视频一致,
可是输出大小应该被减少到1x1。

网络步骤以下所示:
输入的视频段是112x112xL,连续L帧112x112的图像
通过C3D网络后,时间域上L下采样到 L/8, 空间上图像的大小由 112x112下采样到了4x4
CDC6: 时间域上上采样到 L/4, 空间上继续下采样到 1x1
CDC7: 时间域上上采样到 L/2
CDC8:时间域上上采样到 L,并且全链接层用的是 4096xK+1, K是类别数
softmax层

CDC 论文

R-C3D(Region 3-Dimensional Convolution)网络

R-C3D-Resgion Convolutional 3D Network for Temporal Activity Detection

代码

博客解析

是基于Faster R-CNN和C3D网络思想。
对于任意的输入视频L,先进行Proposal,而后用3D-pooling,最后进行分类和回归操做。
文章主要贡献点有如下3个。
    一、能够针对任意长度视频、任意长度行为进行端到端的检测
    二、速度很快(是目前网络的5倍),经过共享Progposal generation 和Classification网络的C3D参数
    三、做者测试了3个不一样的数据集,效果都很好,显示了通用性。

R-C3D网络能够分为4个部分

一、特征提取网络:对于输入任意长度的视频使用C3D进行特征提取;
二、Temporal Proposal Subnet: 用来提取可能存在行为的时序片断(Proposal Segments);
三、Activity Classification Subnet: 行为分类子网络;
四、Loss Function。

一、特征提取网络

骨干网络做者选择了C3D网络,通过C3D网络的5层卷积后,
能够获得512 x L/8 x H/16 x W/16大小的特征图。
这里不一样于C3D网络的是,R-C3D容许任意长度的视频L做为输入。

二、时序候选区段提取网络

相似于Faster R-CNN中的RPN,用来提取一系列可能存在目标的候选框。
这里是提取一系列可能存在行为的候选时序。

Step1:候选时序生成

        输入视频通过上述C3D网络后获得了512 x L/8 x H/16 x W/16大小的特征图。
        而后做者假设anchor均匀分布在L/8的时间域上,
        也就是有L/8个anchors,
        每一个anchors生成K个不一样scale的候选时序。

    Step2: 3D Pooling

        获得的 512xL/8xH/16xW/16的特征图后,
        为了得到每一个时序点(anchor)上每段候选时序的中心位置偏移和时序的长度,
        做者将空间上H/16 x W/16的特征图通过一个3x3x3的卷积核
        和一个3D pooling层下采样到 1x1。最后输出 512xL/8x1x1.

    Step3: Training 
        相似于Faster R-CNN,这里也须要断定获得的候选时序是正样本仍是负样本。\
        文章中的断定以下。 
        正样本:IoU > 0.7,候选时序帧和ground truth的重叠数 
        负样本: IOU < 0.3 
        为了平衡正负样本,正/负样本比例为1:1.

三、行为分类子网络

行为分类子网络有以下几个功能:
    一、从TPS(Temporal Proposal subnet)中选择出Proposal segment
    二、对于上述的proposal,用3D RoI 提取固定大小特征
    三、以上述特征为基础,将选择的Proposal作类别判断和时序边框回归。

Step1: NMS
        针对上述Temporal Proposal Subnet提取出的segment,
        采用NMS(Non-maximum Suppression)非极大值抑制生成优质的proposal。
        NMS 阈值为0.7.

    Step2:3D RoI

        RoI (Region of interest,兴趣区域).
        这里,我的感受做者的图有点问题,提取兴趣区域的特征图的输入应该是C3D的输出,
        也就是512xL/8xH/16xW/16,可能做者遗忘了一个输入的箭头。 
        假设C3D输出的是 512xL/8x7x7大小的特征图,假设其中有一个proposal的长度(时序长度)为lp,
        那么这个proposal的大小为512xlpx7x7,这里借鉴SPPnet中的池化层,
        利用一个动态大小的池化核,ls x hs x ws。
        最终获得 512x1x4x4大小的特征图

    Step3: 全链接层

        通过池化后,再输出到全链接层。
        最后接一个边框回归(start-end time )和类别分类(Activity Scores)。

    Step4: Traning

        在训练的时候一样须要定义行为的类别,
        如何给一个proposal定label?
        一样采用IoU。

        IoU > 0.5,那么定义这个proposal与ground truth相同
        IoU 与全部的ground truth都小于0.5,那么定义为background
        这里,训练的时候正/负样本比例为1:3。

文章将分类和回归联合,并且联合两个子网络。分类采用softmax,回归采用smooth L1。

新结构 非局部神经网络(Non-local Neural Networks) 非局部操做能够做为设计深度神经网络的一个通用的部件。

论文

代码

参考博客解析

非局部网络优点:
    在深层神经网络中,捕获长期依赖关系是相当重要的。
    对于连续的数据(例如演讲中语言),循环操做是时间域上长期依赖问题的主要解决方案。
    对于图像数据,长距离依赖关系是对大量的卷积操做造成的大的感觉野进行建模的。

卷积操做或循环操做都是处理空间或者时间上的局部邻域的。
这样,只有当这些操做被反复应用的时候,长距离依赖关系才能被捕获,信号才能经过数据不断地传播。
重复的局部操做有一些限制:
    首先,计算效率很低;
    其次,增长优化难度;
    最后,这些挑战致使多跳依赖建模,
    例如,当消息须要在远距离之间来回传递时,是很是困难的。

将非局部操做做为一个高效的、简单的、通用的组件,并用深度神经网络捕捉长距离依赖关系。
咱们提出的非局部操做受启发于计算机视觉中经典非局部操做的通常含义。
直观地说,非局部操做在一个位置的计算响应是输入特性图中全部位置的特征的加权总和(如图1)。
一组位置能够在空间、时间或时空上,暗示咱们的操做能够适用于图像、序列和视频问题。


非局部操做在视频分类应用中的有效性。
在视频中,远距离的相互做用发生在空间或时间中的长距离像素之间。
一个非局部块是咱们的基本单位,能够直接经过前馈方式捕捉这种时空依赖关系。
在一些非局部块中,咱们的网络结构被称为非局部神经网络,
比2D或3D卷积网络(包括其变体)有更准确的视频分类效果。
另外,非局部神经网络有比3D卷积网络有更低的计算开销。
咱们在Kinetics和Charades数据集上进行了详细的研究(分别进行了光流、多尺度测试)。
咱们的方法在全部数据集上都能得到比最新方法更好的结果。

Non-local算法代码解析

Non-local算法代码解析

在这里插入图片描述