行为识别Action Detection概述及资源合集(持续更新...)

随着深度学习技术的发展,以及计算能力的进步(GPU等),现在基于视频的研究领域越来越受到重视。视频与图片最大的不同在于视频还包含了时序上的信息,此外需要的计算量通常也大很多。

这篇主要介绍Action Recognition(行为识别)这个方向。这个方向的主要目标是判断一段视频中人的行为的类别,所以也可以叫做Human Action Recognition。虽然这个问题是针对视频中人的动作,但基于这个问题发展出来的算法,大都不特定针对人,也可以用于其他类型视频的分类。

背景介绍

什么是动作识别?

动作识别的主要目标是判断一段视频中人的行为的类别,所以也可以叫做 Human Action Recognition。

动作识别的难点在哪里?

(1)类内和类间差异, 同样一个动作,不同人的表现可能有极大的差异。
(2)环境差异, 遮挡、多视角、光照、低分辨率、动态背景.
(3)时间变化, 人在执行动作时的速度变化很大,很难确定动作的起始点,从而在对视频提取特征表示动作时影响最大。
(4)缺乏标注良好的大的数据集

有那些解决方法?

最好的传统的方法? iDT

当前的深度学习的方法?

  1. RGB + 光流
  2. 3D卷积
  3. lstm + 单帧
  4. skeleton(数据集缺乏)

 

视频中的人体行为识别主要包括两个方向:Action Recognition 以及 Temporal Action Localization:

  • Action Recognition的目的是给定一个视频片段进行分类,类别通常是人的各类动作。特点是简化了问题,一般使用的数据库都先将动作分割好了,一个视频片断中包含一段明确的动作,时间较短(几秒钟)且有唯一确定的label。所以也可以看作是输入为视频,输出为动作标签的多分类问题。常用数据库包括UCF101,HMDB51等。相当于对视频进行分类。
  • Temporal Action Localization 则不仅要知道一个动作在视频中是否发生,还需要知道动作发生在视频的哪段时间(包括开始和结束时间)。特点是需要处理较长的,未分割的视频。且视频通常有较多干扰,目标动作一般只占视频的一小部分。常用数据库包括HUMOS2014/2015, ActivityNet等。相当于对视频进行指定行为的检测。
  • action recognition与temporal action detection之间的关系,同 image classfication与 object detection之间的关系非常像。基于image classification问题,发展出了许多强大的网络模型(比如ResNet,VGGNet等),这些模型在object detection的方法中起到了很大的作用。同样,action recognition的相关模型(如two stream,C3D, iDT等)也被广泛的用在temporal action detection的方法中。

 

数据集

The HMDB-51 dataset(2011)
Brown university 大学发布的 HMDB51, 视频多数来源于电影,还有一部分来自公共数据库以及YouTube等网络视频库.数据库包含有6849段样本,分为51类,每类至少包含有101段样本。

UCF-101(2012)
来源为YouTube视频,共计101类动作,13320段视频。共有5个大类的动作:
1)人-物交互;2)肢体运动;3)人-人交互;4)弹奏乐器;5)运动.

[Sport-1M(2014)] (https://cs.stanford.edu/people/karpathy/deepvideo/)

Sports1M 包含487类各项运动, 约110万个视频. 此外,Sports1M 的视频长度平均超过 5 分钟,而标签预测的动作可能仅在整个视频的很小一部分时间中发生。 Sports1M 的标注通过分析和 youtube视频相关的文本元数据自动地生成,因此是不准确的。

Kinetics-600 (2017)

Kinetics-600是一个大规模,高质量的YouTube视频网址数据集,其中包括各种人的行动。

该数据集由大约50万个视频剪辑组成,涵盖600个人类行为类,每个行为类至少有600个视频剪辑。每个剪辑持续约10秒钟,并标记一个类。所有剪辑都经过了多轮人工注释,每个剪辑都来自单独的YouTube视频。这些行为涵盖了广泛的类别,包括人与物体的互动,如演奏乐器,以及人与人之间的互动,如握手和拥抱。

算法

光流

光流是视觉领域的一个独立分支

光流通常被表述为估计世界真实三维运动的二维投影的问题。

In spite of the fast computation time (0.06s for a pair of frames),

Screen Shot 2018-05-29 at 9.06.46 A

(a)(b) 视频中的连续的两帧, (c) 蓝绿色框中的光流信息, (d) 位移向量的水平信息, (e) 位移向量的垂直信息;

 

iDT

iDT(13年)(improved dense trajectories(轨迹))

iDT 方法(是深度学习进入该领域前效果最好,稳定性最好,可靠性最高的方法,不过算法速度很慢(在于计算光流速度很慢)。

基本思路为利用光流场来获得视频序列中的一些轨迹,再沿着轨迹提取HOF,HOG,MBH,trajectory4种特征,其中HOF基于灰度图计算,另外几个均基于dense optical flow(密集光流)计算。最后利用FV(Fisher Vector)方法对特征进行编码,再基于编码结果训练SVM分类器。

早期研究

Large-scale Video Classification with Convolutional Neural Networks(2014)

2DCNN, 能不能自动的捕捉运动信息?

  1. single frame
  2. stacked frames

双流法

迁移学习

  1. 最后一层(或者最后L层)
  2. fine-tune 所有层(小学习率)

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

双流架构:

  1. 空域网络(spatial networks)
  2. 时域网络(temporal networks)

理论支撑: 双流体系结构与双流假设相关,即人类视觉皮层包含两条路径, 如下

  1. 腹侧流(ventral stream, 执行物体识别)
  2. 背侧流(dorsal stream, 识别运动信息)

将空时网络解耦的好处:
时域网络可以使用预训练的 ImageNet 上预训练的模型.

 

Screen Shot 2018-05-29 at 9.04.12 A-w702

 

TSN: Temporal Segment Networks: Towards Good Practices for Deep Action Recognition(2016)

光流的作用

On the Integration of Optical Flow and Action Recognition(2017) (2018CVPR)

大多数表现优秀的动作识别算法使用光流作为“黑匣子”输入。 在这里,我们更深入地考察光流与动作识别的结合,并研究为什么光流有帮助, 光流算法对动作识别有什么好处,以及如何使其更好。

Screen Shot 2018-05-29 at 9.40.08 A-w273

实验结果表明: 当前体系结构中光流的大部分价值在于它对场景表示的表观不变(invariant to appearance), 也表明运动轨迹不是光流成功的根源,并且建立有用的运动表示仍然是光流自身无法解决的一个悬而未决的问题。

由于光流是从图像序列计算出来的,所以有人可能会争辩说,训练有素的网络可以学习如何计算光流,如果光流是有用的,则不需要明确计算光流。

尽管使用显式运动估计作为涉及视频任务的输入可能看起来很直观,但人们可能会争辩说使用运动并不是必需的。 一些可能的论点是,当前数据集中的类别可以从单帧中识别出来,并且可以从单帧中识别视觉世界中更广泛的许多对象和动作.

C3D

Learning Spatiotemporal Features with 3D Convolutional Networks(2015)

3D 卷积

C3D能把 ImageNet 的成功(迁移学习)复制到视频领域吗?

Screen Shot 2018-05-29 at 9.53.15 A-w827

Screen Shot 2018-05-29 at 4.52.52 P-w443

Screen Shot 2018-05-29 at 9.57.34 A-w435

速度

Screen Shot 2018-05-29 at 3.11.53 P-w436

iDT官方提供的计算法方法没有 GPU 版本
Brox一种计算光流的方法; 包括 I/O 时间, 平均一组图片的光流计算时间为0.85-0.9s

---------------------------------------------我-----------是------------分------------割--------------线--------------------------------------------------------

==============================================================================================

 

下图为目前主流模型的比较。其中T3D标称效果好于I3D,但由于结果是作者复现得来,故在这里不做比较。顺序自上向下按UCF101的准确率排列。

 

preview

 

表中最后两个见下面4,7

目前Action Recognition的研究方向(发论文的方向)分为三大类。

  1. Structure
  2. Inputs
  3. Connection

Structure

preview

这里的结构主要指网络结构。目前,主流的结构都是基于 Two-Stream Convolutional Networks和 C3D 发展而来,所以这一块内容也主要讨论这两种结构的各种演化中作为benchmark的一些结构。

1.

首先讨论TSN模型,这是港中文汤晓鸥组的论文,也是目前的benchmark之一,许多模型也是在TSN的基础上进行了后续的探索。

Temporal Segment Networks: Towards Good Practices for Deep Action Recognition【ECCV2016】

该论文继承了双流网络的结构,但为了解决long-term的问题,作者提出使用多个双流网络,分别捕捉不同时序位置的short-term信息,然后进行融合,得到最后结果。

 

2.

Deep Local Video Feature for Action Recognition 【CVPR2017】

TSN改进版本之一。

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

3.

Temporal Relational Reasoning in Videos

TSN改进版本二。

这篇是MIT周博磊大神的论文,作者是也是最近提出的数据集 Moments in time 的作者之一。

该论文关注时序关系推理。对于哪些仅靠关键帧(单帧RGB图像)无法辨别的动作,如摔倒,其实可以通过时序推理进行分类。如下图。

preview

 

除了两帧之间时序推理,还可以拓展到更多帧之间的时序推理

preview

 

通过对不同长度视频帧的时序推理,最后进行融合得到结果。

该模型建立TSN基础上,在输入的特征图上进行时序推理。增加三层全连接层学习不同长度视频帧的权重,及上图中的函数g和h。

 

除了上述模型外,还有更多关于时空信息融合的结构。这部分与connection部分有重叠,所以仅在这一部分提及。这些模型结构相似,区别主要在于融合module的差异

 

4.Two-Stream I3D

I3D[DeepMind]

动作在单个帧中可能不明确,然而, 现有动作识别数据集的局限性意味着性能最佳的视频架构不会明显偏离单图分析,因为他们依赖在ImageNet上训练的强大图像分类器。

数据集: Kinetics

preview

 

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

I3D 性能更好的原因:

一是 I3D的架构更好,
二是 Kinetic 数据集更具有普适性

 

5.

T3D

preview

 

preview

 

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

6.

P3D[MSRA]

preview

 

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

 

7.

 

Temporal Pyramid Pooling

preview

 

 

preview

 

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

In this paper, we propose Deep networks with Temporal Pyramid Pooling (DTPP), an end-to-end video-level representation learning approach.

Finally, DTPP achieves the state-of-the-art performance on UCF101 and HMDB51, either by ImageNet pre-training or Kinetics pre-training.

 

8.TLE

preview

TLE层的核心.

preview

 

TLE层在双流网络中的使用。

preview

TLE层在C3D结构网络中的使用。

Connection

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

 

这里主要讨论双流的交互。不同论文之间的交互方式各有不同。

9.

Spatiotemporal Multiplier Networks for Video Action Recognition【CVPR2017】

preview

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

preview

10.

Spatiotemporal Pyramid Network for Video Action Recognition 【CVPR2017】

preview

 

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

 

preview

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

 

11.

Attentional pooling for action recognition 【NIPS2017】

12.

ActionVLAD for video action classification 【CVPR2017】

这两篇论文从pooling的层面提高了双流的交互能力,这两篇笔者还在看,有兴趣的读者请自行参阅论文。后期会附上论文的解读。

13.

Deep Convolutional Neural Networks with Merge-and-Run Mappings

这篇论文也是基于ResNet的结构探索新的双流连接方式。

 

14.

论文:Non-local Neural Networks for Video Classification 
论文链接:https://arxiv.org/abs/1711.07971 
代码链接:https://github.com/facebookresearch/video-nonlocal-net

通过特征学习到特征与特征之间的关系,这样类似于对全局特征做了attention,对于多帧的输入,不管是2D还是3D卷积,都提供了更多帮助学习action的信息。作者开源了代码,应该是目前的state-of-the-art

 

总结:

  1. 在motion特征被理解之前,双流网络可能仍然是主流。
  2. 时空信息交互仍然有探索的余地,个人看来也是最有可能发论文的重点领域。
  3. 输入方面,替代光流的特征值得期待。

15.R(2+1)D

S3D?
P3D?

我们的研究动机源于观察到这样一个现象, 在动作识别中, 基于视频的单帧的2D CNN在仍然是不错的表现。

基于视频单帧的 2D CNN(RESNET-152[1])的性能非常接近的Sport-1M基准上当前最好的算法。这个结果是既令人惊讶和沮丧,因为2D CNN 无法建模时间和运动信息。基于这样的结果,我们可以假设,时间结构对的识别作用并不是至关重要,因为已经包含一个序列中的静态画面已经能够包含强有力的行动信息了。

研究目标: 我们表明,3D ResNets显著优于为相同的深度2D ResNets, 从而说明时域信息对于动作识别来说很重要.

[1]Learning spatio-temporal representation with pseudo-3d residual networks

 

Screen Shot 2018-05-29 at 2.04.43 P-w470

Screen Shot 2018-05-25 at 5.47.14 P
Screen Shot 2018-05-29 at 10.24.32 A-w437

-w506

 

16.ECO

论文标题:ECO: Efficient Convolutional Network for Online Video Understanding, ECCV 2018

github主页:https://github.com/mzolfaghari/ECO-efficient-video-understanding(提供了一个实时预测的接口)

主要贡献:

1. 采用离散采样的方法减少冗余帧,实现了online video understanding,轻量化网络的处理速度可以达到237帧/秒(ECO Lite-4F,Tesla P100,UCF-101 Accuracy为87.4%)。

2. 使用2D+3D卷积完成帧间信息融合。

备注:

1. 以下是ECO Lite的网络结构:

首先,将一段视频分成等长的N段,再从每一段中随机选取一帧输入网络(S1~SN);输入图像首先经过共享的2D卷积子网络得到96*28*28的feature map,然后输入到一个3D卷积子网络中,得到对应动作类别数目的一维向量。

2. 关于帧间信息融合的部分,作者还尝试了使用2D与3D卷积相结合的方案(ECO Full),如下图所示:

3. 以下是ECO网络在UCF-101和HMDB-51数据集上的测试结果:

以下是网络在运行速度方面的测试结果:

作者还测试了不同版本的ECO模型,结果如下:

参考博客:[论文笔记] 用于在线视频理解的高效卷积网络

 

 

 

 

下面列表为行为识别及相关领域(如目标识别,手势估计)的资源

Action Recognition

Spatio-Temporal Action Detection

Temporal Action Detection

Spatio-Temporal ConvNets

 

Action Classification

 

在行为识别领域,比较主流的算法有two-streams,3D convolutions 和RNN,尤其以two-streams算法
性能良好。

Action Recognition Datasets

 

附录:

论文列表(顺序不分先后):

Structure:

  1. Temporal Segment Networks: Towards Good Practices for Deep Action Recognition【ECCV2016】
  2. Temporal Relational Reasoning in Videos
  3. Deep Temporal Linear Encoding Networks 【CVPR2017】
  4. End-to-end Video-level Representation Learning for Action Recognition
  5. Rethinking Spatiotemporal Feature Learning For Video Understanding
  6. Spatiotemporal Residual Networks for Video Action Recognition【NIPS2016】
  7. Temporal 3D ConvNets: New Architecture and Transfer Learning for Video Classification
  8. Video Classification via Relational Feature Encoding Networks
  9. I3D
  10. Hidden Two-Stream Convolutional Networks for Action Recognition
  11. Learning Gating ConvNet for Two-Stream based Methods in Action Recognition
  12. Deep Local Video Feature for Action Recognition 【CVPR2017】
  13. Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks【ICCV2017】
  14. Convolutional Two-Stream Network Fusion for Video Action Recognition 【CVPR2016】

Inputs:

  1. AdaScan: Adaptive Scan Pooling in Deep Convolutional Neural Networks for Human Action Recognition in Videos 【CVPR2017】
  2. Optical Flow Guided Feature: A Fast and Robust Motion Representation for Video Action Recognition
  3. A Key Volume Mining Deep Framework for Action Recognition 【CVPR2016】

Connection:

  1. Spatiotemporal Multiplier Networks for Video Action Recognition【CVPR2017】
  2. Beyond Gaussian Pyramid: Multi-skip Feature Stacking for Action Recognition【CVPR2015】
  3. Deep Convolutional Neural Networks with Merge-and-Run Mappings
  4. Human Action Recognition using Factorized Spatio-Temporal Convolutional Networks【ICCV2015】
  5. Attentional pooling for action recognition 【NIPS2017】
  6. Spatiotemporal Pyramid Network for Video Action Recognition 【CVPR2017】
  7. ActionVLAD for video action classification 【CVPR2017】

 

当前这个领域需要考虑的问题?

专注于动作, 还是场景理解
一个视频中多个动作同时进行

严重依赖物体和场景首先无论是双流法还是3D卷积核,网络到底学到了什么?

会不会只是物体或场景的特征呢?而动作识别,重点在于action。MIT最近公布了新的数据集 Moments in time,Moments in Time,在这个数据集里,action成为关键。例如,opening这个动作,可以是小孩双眼open,也可以是门open,还可以是鸟的翅膀open。这样的数据集对当前主流的算法提出了挑战,把video这块的注意力聚焦在action,而不是物体和场景。

一些算法实现

算法实现
TSN(双流法)http://yjxiong.me/others/tsn/
I3Dhttps://github.com/deepmind/kinetics-i3d
R(2+1)Dhttps://github.com/facebookresearch/R2Plus1D

 

 

 

参考链接:

1.github jinwchoi/awesome-action-recognition

2.https://zhuanlan.zhihu.com/p/28791320

3.https://zhuanlan.zhihu.com/p/33040925

4.https://zhuanlan.zhihu.com/p/26460437

5.https://www.cnblogs.com/nowgood/p/actionrecognition.html

 

在此鸣谢!!如有商业侵权,请联系我删除,谢谢!

  • 58
    点赞
  • 319
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是使用Python和OpenCV实现的手势识别代码示例: ```python import cv2 import numpy as np # 打开摄像头 cap = cv2.VideoCapture(0) # 定义字母和数字列表 alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' numbers = '0123456789' # 加载训练数据 lower_range = np.array([0, 30, 60], dtype=np.uint8) upper_range = np.array([20, 150, 255], dtype=np.uint8) svm = cv2.ml.SVM_load('svm_data.xml') while True: # 读取每一帧 ret, frame = cap.read() # 对帧进行预处理 blur = cv2.GaussianBlur(frame, (5, 5), 0) hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, lower_range, upper_range) # 查找轮廓 contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) if contours and len(contours) > 0: # 找到最大轮廓 max_contour = max(contours, key=cv2.contourArea) # 提取手势ROI x, y, w, h = cv2.boundingRect(max_contour) roi = mask[y:y+h, x:x+w] # 调整ROI大小 if w > h: roi = cv2.copyMakeBorder(roi, int((w-h)/2), int((w-h)/2), 0, 0, cv2.BORDER_CONSTANT, (0, 0, 0)) else: roi = cv2.copyMakeBorder(roi, 0, 0, int((h-w)/2), int((h-w)/2), cv2.BORDER_CONSTANT, (0, 0, 0)) roi = cv2.resize(roi, (28, 28)) # 将ROI转换为HOG描述符 win_size = (28, 28) block_size = (14, 14) block_stride = (7, 7) cell_size = (7, 7) nbins = 9 hog = cv2.HOGDescriptor(win_size, block_size, block_stride, cell_size, nbins) roi_hog = hog.compute(roi) # 使用SVM进行预测 result = svm.predict(roi_hog.reshape(1, -1))[1][0][0] if result < 26: print(alphabet[result]) elif result < 36: print(numbers[result-26]) # 显示帧 cv2.imshow('Hand Gesture Recognition', frame) # 如果按下ESC键,则退出循环 if cv2.waitKey(1) == 27: break # 释放摄像头并销毁所有窗口 cap.release() cv2.destroyAllWindows() ``` 这里使用了支持向量机(SVM)进行手势分类和识别。首先,我们使用HSV颜色空间和阈值技术来提取手部区域。然后,我们使用轮廓查找技术找到最大轮廓,并将其转换为大小为28x28的图像。接下来,我们提取HOG描述符并使用SVM进行预测。最后,我们将识别结果打印到控制台中,并将原始帧显示在屏幕上。 请注意,此示例代码可能不是最优解决方案,但它可以帮助您理解手势识别的基本原理和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值