精华内容
下载资源
问答
  • 一张一张的连续动作图片
    千次阅读
    2019-03-23 10:33:21

    在做图像标定的时候有一件事情很烦,就是我需要连续拍多张图片,我们当然可以通过软件直接截取,但是原谅作为小白的我当时并没有找到这个软件(坑爹啊,后来别人给我了)。

    于是就只能找找能不能通过程序去保存的。我的做法是,希望按一次 'c', 就能够保存一张图片,并且希望图片是按照1.jpg、2、jpg、3、jpf ......这样的保存的,这样在我标定的时候就不用慢慢的改啦

    真的是找了好久,后来才知道,原来还有sprintf这个函数(尴尬,不过真的觉得好方便)

    #include <opencv2/core/core.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <iostream>
    using namespace cv;
    using namespace std;
    int main(int argc, char *argv[])
    {
        int d=8;
        char ad[300]={0};
        char name;
        //从电脑摄像头读入
        VideoCapture capture(0);
        Mat edges;
        waitKey(2000);
        //循环显示每一帧
        Mat frame;
        while(1)
        {
            capture>>frame;//读取当前帧
            imshow("读取视频",frame);
    
    
            int k=waitKey(30);//延时30ms
            if(k=='e'||cvGetWindowHandle("读取视频")==nullptr)
                break;
            else if(k=='c')
            {
               sprintf(ad, "C:\\Users\\fan\\Desktop\\%d.jpg", ++d);
               imwrite(ad, frame );
               cout<<"get "<<d<<"  picture "<<endl;
            }
        }
        return 0;
    }
    
    

    找好视野,多次按下'c' 键,就可以连续保存多张图片啦。

     

    更多相关内容
  • 解决具有连续动作空间的问题是当前强化学习领域的一个研究热点和难点.在处理这类问题时,传统的强化学习算法通常利用先验信息对连续动作空间进行离散化处理,然后再求解最优策略.然而,在很多实际应用中,由于缺乏...
  • html5 游戏编程中 我有一个gif图片 里面有3个人物是一样的 但动作不一样 第一个动作是蹲下身 然后 第二个动作 起来一半 第三个动作 站立状态 我想要他们在画板中单独显示出来达到一个连续动作 我该怎么写代码 ...
  • 点击上方“CV技术指南”,持续关注,持续学习前言本文将介绍视频理解中的三大基础领域:动作识别(Action Recognition)、时序动作定位(Temporal Action Loc...

    点击上方“CV技术指南”,持续关注,持续学习

    前言 本文将介绍视频理解中的三大基础领域:动作识别(Action Recognition)、时序动作定位(Temporal Action Localization)和视频 Embedding。

    转载自机器之心

    1.视频理解背景


    根据中国互联网络信息中心(CNNIC)第 47 次《中国互联网络发展状况统计报告》,截至 2020 年 12 月,中国网民规模达到 9.89 亿人,其中网络视频(含短视频)用户规模达到 9.27 亿人,占网民整体的 93.7%,短视频用户规模为 8.73 亿人,占网民整体的 88.3%。

    回顾互联网近年来的发展历程,伴随着互联网技术(特别是移动互联网技术)的发展,内容的主流表现形式经历了从纯文本时代逐渐发展到图文时代,再到现在的视频和直播时代的过渡,相比于纯文本和图文内容形式,视频内容更加丰富,对用户更有吸引力。

    25d6a0609db83958ee43089aa167ef95.png

    图 1:互联网内容表现形式的 3 个阶段。本图源于《深度学习视频理解》

    随着近年来人们拍摄视频的需求更多、传输视频的速度更快、存储视频的空间更大,多种场景下积累了大量的视频数据,需要一种有效地对视频进行管理、分析和处理的工具。视频理解旨在通过智能分析技术,自动化地对视频中的内容进行识别和解析。视频理解算法顺应了这个时代的需求。因此,近年来受到了广泛关注,取得了快速发展。

    视频理解涉及生活的多个方面,目前视频理解已经发展成一个十分广阔的学术研究和产业应用方向。受篇幅所限,本文将介绍视频理解中的三大基础领域: 动作识别 (Action Recognition)、时序动作定位(Temporal Action Localization) 和视频 Embedding。

    0afc8b3525337989a27e031d6dfb3db7.png

    图 2:视频理解涉及的部分任务。本图源于《深度学习视频理解》

    2. 动作识别(Action Recognition)


    2.1 动作识别简介

    动作识别的目标是识别出视频中出现的动作,通常是视频中人的动作。视频可以看作是由一组图像帧按时间顺序排列而成的数据结构,比图像多了一个时间维度。动作识别不仅要分析视频中每帧图像的内容,还需要从视频帧之间的时序信息中挖掘线索。动作识别是视频理解的核心领域,虽然动作识别主要是识别视频中人的动作,但是该领域发展出来的算法大多数不特定针对人,也可以用于其他视频分类场景。

    动作识别看上去似乎是图像分类领域向视频领域的一个自然延伸,深度学习尽管在图像分类领域取得了举世瞩目的成功,目前深度学习算法在图像分类上的准确率已经超过普通人的水平,但是,深度学习在动作识别领域的进展并不像在图像分类领域那么显著,很长一段时间基于深度学习算法的动作识别准确率达不到或只能接近传统动作识别算法的准确率。概括地讲,动作识别面临以下几点困难:

    • 训练视频模型所需的计算量比图像大了一个量级,这使得视频模型的训练时长和训练所需的硬件资源相比图像大了很多,导致难以快速用实验进行验证和迭代;

    • 在 2017 年,Kinetics 数据集 (Carreira & Zisserman, 2017) 诞生之前, 缺少大规模通用的视频基准 (Benchmark) 数据集。在很长一段时间里,研究者都是在如 UCF-101 数据集 (Soomro et al., 2012) 上比较算法准 确率,而 UCF-101 只有 1.3 万条数据,共 101 个类别,平均每个类别只有约 100 个视频,相比于图像分类领域的 ImageNet 数据集有 128 万 条数据,共 1000 个类别,平均每个类别约有 1,000 个视频,UCF-101 数据集显得十分小。数据集规模制约了动作识别领域的发展;

    • 学习视频中帧之间的时序关系,尤其是长距离的时序关系,本身就比较难。不同类型的动作变化快慢和持续时长有所不同,不同的人做同一个动作的方式也存在不同,同时相机拍摄角度和相机自身的运动也会对识别带来挑战。此外,不是视频中所有的帧对于动作识别都有相同的作用,有许多帧存在信息冗余;

    • 网络结构设计缺少公认的方案。图像分类领域的网络结构设计有一些公认的指导理念,例如,端到端训练、小卷积核、从输入到输出空间分辨率不断降低且通道数不断增大等。然而,在动作识别领域,同时存在多个网络设计理念,例如,帧之间的时序关系应该如何捕捉、使用 2D 卷积还是 3D 卷积、不同帧的特征应该如何融合等都还没有定论。

    2.2 基于 2D 卷积的动作识别

    视频是由一系列图像帧(Frame)组成的,图像分类模型经过这些年的发展已经相对成熟。如何进行视频分类呢?一种直观的想法是将图像分类的模型直接运用到视频分类中。如下图所示,一个简单的想法是先把视频各帧提取出来,每帧图像各自前馈(Feedforward)一个图像分类模型,不同帧的图像分类模型之间相互共享参数。得到每帧图像的特征之后,对各帧图像特征进行汇合(Pooling),例如采用平均汇合,得到固定维度的视频特征,最后经过一个全连接层和 Softmax 激活函数进行分类以得到视频的类别预测。

    83c05981434b7c337819717e79018978.png

    图 3:利用图像分类模型和平均汇合进行动作识别网络结构图。本图源于《深度学习视频理解》

    平均汇合方法十分简单,其视频分类的准确率与其他同时期专门为动作识别设计的深度学习模型相比差距并不大 (Karpathy et al., 2014) ,但是与传统动作识别算法的准确率相比还有很大差距,不过后来专门为动作识别设计的深度学习模型的准确率高了很多。

    最直观的想法是先把视频拆成一帧帧的图像,每帧图像各自用一个图像分类模型得到帧级别的特征,然后用某种汇合方法从帧级别特征得到视频级别特征,最后进行分类预测,其中的汇合方法包括: 平均汇合、NetVLAD/NeXtVLAD、NetFV、RNN、3D 卷积等。另外,我们可以借助一些传统算法来补充时序关系,例如,双流法利用光流显式地计算帧之间的运动关系,TDD 利用 iDT 计算的轨迹进行汇合等。基于 2D 卷积的动作识别方法的一个优点是可以快速吸收图像分类领域的最新成果,通过改变骨架网络,新的图像分类模型可以十分方便地迁移到基于 2D 卷积的动作识别方法中。

    b8f19c2831dd90a117988e035c9ae0e1.png

    图 4:基于 2D 卷积的动作识别算法。本图源于《深度学习视频理解》

    2.3 基于 3D 卷积的动作识别

    另一方面,图像是三维的,而视频比图像多了一维,是四维。图像使用的是 2D 卷积,因此视频使用的是 3D 卷积。我们可以设计对应的 3D 卷积神经网络,就像在图像分类中利用 2D 卷积可以从图像中学习到复杂的图像表示一样,利用 3D 卷积可以从视频片段中同时学习图像特征和相邻帧之间复杂的时序特征,最后利用学到的高层级特征进行分类。

    相比于 2D 卷积,3D 卷积可以学习到视频帧之间的时序关系。我们可以将 2D 卷积神经网络扩展为对应的 3D 卷积神经网络,如 C3D、Res3D/3D ResNet、LTC、I3D 等。由于 3D 卷积神经网络的参数量和计算量比 2D 卷积神经网络大了很多,不少研究工作专注于对 3D 卷积进行低秩近似,如 FSTCN、P3D、R(2+1)D、S3D 等。TSM 对 2D 卷积进行改造以近似 3D 卷积的效果。3D 卷积 + RNN、ARTNet、Non-Local、SlowFast 等从不同角度学习视频帧之间的时序关系。此外,多网格训练和 X3D 等对 3D 卷积神经网络的超参数进行调整,使网络更加精简和高效。

    2597114576fe74cd5d3d56082f4a7bdc.png

    图 5:基于 3D 卷积的动作识别算法。本图源于《深度学习视频理解》

    3. 时序动作定位


    时序动作定位 (Temporal Action Localization) 也称为时序动作检测 (Temporal Action Detection),是视频理解的另一个重要领域。动作识别可以看作是一个纯分类问题,其中要识别的视频基本上已经过剪辑(Trimmed),即每个视频包含一段明确的动作,视频时长较短,且有唯一确定的动作类别。而在时序动作定位领域,视频通常没有被剪辑(Untrimmed),视频时长较长,动作通常只发生在视频中的一小段时间内,视频可能包含多个动作,也可能不包含动作,即为背景(Background) 类。时序动作定位不仅要预测视频中包含了什么动作,还要预测动作的起始和终止时刻。相比于动作识别,时序动作定位更接近现实场景。

    时序动作定位可以看作由两个子任务组成,一个子任务是预测动作的起止时序区间,另一个子任务是预测动作的类别。由于动作识别领域经过近年来的发展,预测动作类别的算法逐渐成熟,因此时序动作定位的关键是预测动作的起止时序区间,有不少研究工作专注于该子任务,ActivityNet 竞赛除了每年举办时序动作定位竞赛,还专门组织候选时序区间生成竞赛(也称为时序动作区间提名)。

    既然要预测动作的起止区间,一种最朴素的想法是穷举所有可能的区间,然后逐一判断该区间内是否包含动作。对于一个 T 帧的视频,所有可能的区间为 ,穷举所有的区间会带来非常庞大的计算量。

    时序动作检测的很多思路源于图像目标检测 (Object Detection),了解目标检测的一些常见算法和关键思路对学习时序动作定位很有帮助。相比于图像分类的目标是预测图像中物体的类别,目标检测不仅要预测类别,还要预测出物体在图像中的空间位置信息,以物体外接矩形的包围盒(Bounding Box) 形式表示。

    3.1 基于滑动窗的算法

    这类算法的基本思路是预先定义一系列不同时长的滑动窗,之后滑动窗在视频上沿着时间维度进行滑动,并逐一判断每个滑动窗对应的时序区间内具体是什么动作类别。图 6 (a) 中使用了 3 帧时长的滑动窗,图 6 (b) 中使用了 5 帧时长的滑动窗,最终汇总不同时长的滑动窗的类别预测结果。可以知道,该视频中包含的动作是悬崖跳水、动作出现的起止时序区间在靠近视频结尾的位置。

    b44a10ece11d330114e9c7c6d34063d1.png

    图 6:基于滑动窗的算法流程图。本图源于《深度学习视频理解》

    如果对目标检测熟悉的读者可以联想到,Viola-Jones 实时人脸检测器 (Viola & Jones, 2004) 中也采用了滑动窗的思想,其先用滑动窗在图像上进行密集滑动,之后提取每个滑动窗对应的图像区域的特征,最后通过 AdaBoost 级联分类器进行分类。Viola-Jones 实时人脸检测器是计算机视觉历史上具有里程碑意义的算法之一,获得了 2011 年 CVPR(Computer Vision and Pattern Recognition,计算机视觉和模式识别)大会用于表彰十年影响力的 Longuet-Higgins 奖。

    3.2 基于候选时序区间的算法

    目标检测算法中的两阶段 (Two-Stage) 算法将目标检测分为两个阶段: 第一阶段产生图像中可能存在目标 的候选区域(Region Proposal),一般一张图像可以产生成百上千个候选区域,这一阶段和具体的类别无关; 第二阶段逐一判断每个候选区域的类别并对候选区域的边界进行修正。

    类比于两阶段的目标检测算法,基于候选时序区间的时序动作定位算法也将整个过程分为两个阶段: 第一阶段产生视频中动作可能发生的候选时序区间; 第 二阶段逐一判断每个候选时序区间的类别并对候选时序区间的边界进行修正。最终将两个阶段的预测结果结合起来,得到未被剪辑视频中动作的类别和起止时刻预测。

    d86ed9e2d5198ac4bbf905ddf4b504b5.png

    图 7:Faster R-CNN 和基于候选时序区间的方法类比。本图源于《深度学习视频理解》

    3.3 自底向上的时序动作定位算法

    基于滑动窗和基于候选时序区间的时序动作定位算法都可以看作是自顶向下的算法,其本质是预先定义好一系列不同时长的滑动窗或锚点时序区间,之后判断每个滑动窗位置或锚点时序区间是否包含动作并对边界进行微调以产生候选时序区间。这类自顶向下的算法产生的候选时序区间会受到预先定义的滑动窗或锚点时序区间的影响,导致产生的候选时序区间不够灵活,区间的起止位置不够精确。

    本节介绍自底向上的时序动作定位算法,这类算法首先局部预测视频动作开始和动作结束的时刻,之后将开始和结束时刻组合成候选时序区间,最后对每个候选时序区间进行类别预测。相比于自顶向下的算法,自底向上的算法预测的候选时序区间边界更加灵活。了解人体姿态估计 (Human Pose Estimation) 的读者可以联想到,人体姿态估计也可以分为自顶向下和自底向上两类算法,其中自顶 向下的算法先检测出人的包围盒,之后对每个包围盒内检测人体骨骼关键点,如 (Chen et al., 2018) 等; 自底向上的算法先检测所有的人体骨骼关键点,之后再组合成人,如 (Cao et al., 2021) 等。

    BSN(Boundary Sensitive Network,边界敏感网络)(Lin et al., 2018b)是自底向上的时序动作定位算法的一个实例,BSN 获得了 2018 年 ActivityNet 时序动作定位竞赛的冠军和百度综艺节目精彩片段预测竞赛的冠军。

    1191bdf43e21b05fbb77a74973eb5ebf.png

    图 8:BSN 网络结构图。本图源于《深度学习视频理解》

    3.4 对时序结构信息建模的算法

    假设我们的目标是识别视频中的体操单跳 (Tumbling) 动作和对应的动作起止区间,见图 9 中的绿色框。图 9 中的蓝色框表示模型预测的候选时序区间,有的候选时序区间时序上并不完整,即候选时序区间并没有覆盖动作完整的起止过程。图 9 上半部分的算法直接基于候选时序区间内的特征对候选时序区间内的动作类别进行预测,导致模型一旦发现任何和单跳动作有关的视频片段,就会输出很高的置信度,进而导致时序定位不够精准。

    de3bcc7ca2ef562d264ce07032eff492.png

    图 9:SSN 对动作不同的阶段进行建模。本图源于(Zhao et al., 2020)

    SSN(Structured Segment Network,结构化视频段网络)算法 (Zhao et al., 2020) 对动作不同的阶段 (开始、过程、结束) 进行建模,SSN 不仅会预测候选时序区间内的动作类别,还会预测候选时序区间的完整性,这样做的好处是可以更好地定位动作开始和结束的时刻,SSN 只在候选时序区间和动作真实起止区间对齐的时候输出高置信度。

    3.5 逐帧预测的算法

    我们希望模型对动作时序区间的预测能够尽量精细。CDC (Convolutional-De-Convolutional networks,卷积 - 反卷积网络)算法 (Shou et al., 2017) 和前文介绍的其他算法的不同之处在于,CDC 可以对未被剪辑的视频逐帧预测动作的类别,这种预测粒度十分精细,使得对动作时序区间边界的定位更加精确。

    如图 10 所示,输入一个未被剪辑的视频,首先利用动作识别网络提取视频特征,之后利用多层 CDC 层同时对特征进行空间维度的下采样和时间维度的上采样,进而得到视频中每帧的预测结果,最后结合候选时序区间得到动作类别和起止时刻的预测。CDC 的一个优点是预测十分高效,在单 GPU 服务器下,可以达到 500 FPS(Frames per Second,帧每秒)的预测速度。

    61d9a373e58f412e9dcd0c0f35d93476.png

    图 10:CDC 网络结构图。本图源于《深度学习视频理解》

    3.6 单阶段算法

    目标检测算法可以大致分为两大类,其中一大类算法为两阶段算法,两阶段算法会先从图像中预测可能存在目标的候选区域,之后逐一判断每个候选区域的类别,并对候选区域边界进行修正。时序动作定位中也有一些算法采用了两阶段算法的策略,先从视频中预测可能包含动作的候选时序区间,之后逐一判断每个候选时序区间的类别,并对候选时序区间的边界进行修正,这部分算法已在 3.2 节介绍过。

    另一大类算法为单阶段 (One-Stage) 算法,单阶段算法没有单独的候选区域生成的步骤,直接从图像中预测。在目标检测领域中,通常两阶段算法识别精度高,但是预测速度慢,单阶段算法识别精度略低,但是预测速度快。时序动作定位中也有一些算法采用了单阶段算法的策略。

    到此为止,我们了解了许多时序动作定位算法,一种直观的想法是预先定义一组不同时长的滑动窗,之后滑动窗在视频上进行滑动,并逐一判断每个滑动窗对应的时序区间内的动作类别,如 S-CNN。TURN 和 CBR 以视频单元作为最小计算单位避免了滑动窗带来的冗余计算,并且可以对时序区间的边界进行修正; 受两阶段目标检测算法的启发,基于候选时序区间的算法先从视频中产生一些可能包含动作的候选时序区间,之后逐一判断每个候选时序区间内的动作类别,并对区间边界进行修正,如 R-C3D 和 TAL-Net; 自底向上的时序动作定位算法先预测动作开始和结束的时刻,之后将开始和结束时刻组合为候选时序区间,如 BSN、TSA-Net 和 BMN;SSN 不仅会预测每个区间的动作类别,还会 预测区间的完整性; CDC 通过卷积和反卷积操作可以逐帧预测动作类别。此外,单阶段目标检测的思路也可以用于时序动作定位中,如 SSAD、SS-TAD 和 GTAN。

    e7baf4daa2ba360d35a5e8c32f50124d.png

    图 11:时序动作定位算法。本图源于《深度学习视频理解》

    4. 视频 Embedding


    Embedding 直译为嵌入,这里译为向量化更贴切。视频 Embedding 的目标是从视频中得到一个低维、稠密、浮点的特征向量表示,这个特征向量是对整个视频内容的总结和概括。其中,低维是指视频 Embedding 特征向量的维度比较低,典型值如 128 维、256 维、512 维、1024 维等; 稠密和稀疏 (Sparse) 相对,稀疏是指特征向量中有很多元素为 0,稠密是指特征向量中很多元素为非 0; 浮点是指特征向量中的元素都是浮点数。

    不同视频 Embedding 之间的距离 (如欧式距离或余弦距离) 反映了对应视频之间的相似性。如果两个视频的语义内容接近,则它们的 Embedding 特征之间的距离近,相似度高; 反之,如果两个视频不是同一类视频,那么它们的 Embedding 特征之间的距离远,相似度低。在得到视频 Embedding 之后,可以用于视频推荐系统、视频检索、视频侵权检测等多个任务中。

    动作识别和时序动作定位都是预测型任务,即给定一个视频,预测该视频中出现的动作,或者更进一步识别出视频中出现的动作的起止时序区间。而视频 Embedding 是一种表示型任务,输入一个视频,模型给出该视频的向量化表示。视频 Embedding 算法可以大致分为以下 3 大类。

    第一类方法基于视频内容有监督地学习视频 Embedding。我们基于视频的类别有监督地训练一个动作识别网络,之后可以从网络的中间层 (通常是全连接层) 提取视频 Embedding。这类方法的重点在于动作识别网络的设计。

    第二类方法基于视频内容无监督地学习视频 Embedding。第一类方法需要大量的视频标注,标注过程十分耗时、耗力,这类方法不需要额外的标注,从视频自身的结构信息中学习,例如,视频重建和未来帧预测、视频帧先后顺序验证、利用视频 和音频信息、利用视频和文本信息等。

    第三类方法通过用户行为学习视频 Embedding。如果我们知道每个用户的视频观看序列,由于用户有特定类型的视频观看喜好,用户在短时间内一起观看的视频通常有很高的相似性,利用用户观看序列信息,我们可以学习得到视频 Embedding。

    其中,第一类和第二类方法基于视频内容学习视频 Embedding,它们的优点是没有视频冷启动问题,即一旦有新视频产生,就可以计算该视频的 Embedding 用于后续的任务中。例如,这可以对视频推荐系统中新发布的视频给予展示机会; 基于内容的视频 Embedding 的另一个优点是对所有的视频“一视同仁”,不会推荐过于热门的视频。另外,也可以为具有小众兴趣爱好的用户进行推荐。

    一旦新视频获得了展示机会,积累了一定量的用户反馈 (即用户观看的行为数据) 之后,我们就可以用第三类方法基于用户行为数据学习视频 Embedding, 有时视频之间的关系比较复杂,有些视频虽然不属于同一个类别,但是它们之间存在很高的相似度,用户常常喜欢一起观看。基于用户行为数据学习的视频 Embedding 可以学习到这种不同类别视频之间的潜在联系。

    第三大类方法通过用户行为学习视频 Embedding,其中 Item2Vec 将自然语言处理中经典的 Word2Vec 算法用到了用户行为数据中,并在后续工作中得到了优化,DeepWalk 和 Node2Vec 基于图的随机游走学习视频 Embedding,是介于图算法和 Item2Vec 算法之间的过渡,LINE 和 SDNE 可以学习图中结点的一阶和二阶相似度,GCN GraphSAGE 和 GAT 等将卷积操作引入到了图中,YouTube 召回模型利用多种信息学习视频 Embedding。

    5d0999647cba580f39ada06b4c769cbd.png

    图 12:视频 Embedding 算法。本图源于《深度学习视频理解》

    受篇幅所限,本文只是对视频理解的概要介绍。

    本文仅做学术分享,如有侵权,请联系删文。

    3D视觉精品课程推荐:

    1.面向自动驾驶领域的多传感器数据融合技术

    2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
    3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
    4.国内首个面向工业级实战的点云处理课程
    5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
    6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
    7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
    8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

    重磅!3DCVer-学术论文写作投稿 交流群已成立

    扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

    同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

    一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

    cd92a9902a548b1dccae2a1150e11c8a.png

    ▲长按加微信群或投稿

    2c0a9189d0111a9e3c0f96385bd3097e.png

    ▲长按关注公众号

    3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定激光/视觉SLAM自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

    学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

    655818f0b3e0d70c693373a3869532c9.png

     圈里有高质量教程资料、答疑解惑、助你高效解决问题

    觉得有用,麻烦给个赞和在看~  

    展开全文
  • 目标在本章中,– 我们将了解光流的概念及其使用Lucas-Kanade方法的估计。...光流光流是由物体或照相机的运动引起的两个连续帧之间图像物体的视运动的模式。它是2D向量场,其中每个向量都是位移向量,表示点从...

    目标

    在本章中,

    – 我们将了解光流的概念及其使用Lucas-Kanade方法的估计。

    – 我们将使用cv.calcOpticalFlowPyrLK()之类的函数来跟踪视频中的特征点。

    – 我们将使用cv.calcOpticalFlowFarneback()方法创建一个密集的光流场。

    光流

    光流是由物体或照相机的运动引起的两个连续帧之间图像物体的视运动的模式。它是2D向量场,其中每个向量都是位移向量,表示点从第一帧到第二帧的运动。考虑下面的图片(图片提供:Wikipedia关于Optical Flow的文章)。

    它显示了一个球连续5帧运动。箭头显示其位移向量。光流在以下领域具有许多应用:

    – 运动的结构

    – 视频压缩

    – 视频稳定…

    光流基于以下几个假设进行工作:

    1. 在连续的帧之间,对象的像素强度不变。

    2. 相邻像素具有相似的运动。

    考虑第一帧中的像素$I(x,y,t)$(在此处添加新维度:时间。之前我们只处理图像,因此不需要时间)。它在$dt$时间之后拍摄的下一帧中按距离$(dx,dy)$移动。因此,由于这些像素相同且强度不变,因此可以说

    $$

    I(x,y,t) = I(x+dx, y+dy, t+dt)

    $$

    然后采用泰勒级数的右侧逼近,去掉常用项并除以$dt$得到下面的式子

    $$

    f_x u + f_y v + f_t = 0 ;

    $$

    其中

    $$

    f_x = frac{partial f}{partial x} ; ; ; f_y = frac{partial f}{partial y}

    $$

    $$

    u = frac{dx}{dt} ; ; ; v = frac{dy}{dt}

    $$

    上述方程式称为光流方程式。在其中,我们可以找到$f_x$和$f_y$,它们是图像渐变。同样,$f_t$是随时间变化的梯度。但是$(u,v)$是未知的。我们不能用两个未知变量来求解这个方程。因此,提供了几种解决此问题的方法,其中一种是Lucas-Kanade。

    Lucas-Kanade 方法

    之前我们已经看到一个假设,即所有相邻像素将具有相似的运动。Lucas-Kanade方法在该点周围需要3×3色块。因此,所有9个点都具有相同的运动。我们可以找到这9点的$(fx,fy,ft)$。所以现在我们的问题变成了求解带有两个未知变量的9个方程组的问题。用最小二乘拟合法可获得更好的解决方案。下面是最终的解决方案,它是两个方程式-两个未知变量问题,求解以获得解决答案。

    $$

    begin{bmatrix} u v end{bmatrix} = begin{bmatrix} sum_{i}{f_{x_i}}^2 & sum_{i}{f_{x_i} f_{y_i} } sum_{i}{f_{x_i} f_{y_i}} & sum_{i}{f_{y_i}}^2 end{bmatrix}^{-1} begin{bmatrix} – sum_{i}{f_{x_i} f_{t_i}} – sum_{i}{f_{y_i} f_{t_i}} end{bmatrix}

    $$

    (用哈里斯拐角检测器检查逆矩阵的相似性。这表示拐角是更好的跟踪点。)因此,从用户的角度来看,这个想法很简单,我们给一些跟踪点,我们接收到这些光流矢量点。但是同样存在一些问题。到现在为止,我们只处理小动作,所以当大动作时它就失败了。为了解决这个问题,我们使用金字塔。当我们上金字塔时,较小的动作将被删除,较大的动作将变为较小的动作。因此,通过在此处应用Lucas-Kanade,我们可以获得与尺度一致的光流。

    OpenCV中的Lucas-Kanade

    OpenCV在单个函数cv.calcOpticalFlowPyrLK()中提供所有这些功能。在这里,我们创建一个简单的应用程序来跟踪视频中的某些点。为了确定点,我们使用cv.goodFeaturesToTrack()。我们采用第一帧,检测其中的一些Shi-Tomasi角点,然后使用Lucas-Kanade光流迭代地跟踪这些点。对于函数cv.calcOpticalFlowPyrLK(),我们传递前一帧,前一点和下一帧。它返回下一个点以及一些状态码,如果找到下一个点,状态码的值为1,否则为零。我们将这些下一个点迭代地传递为下一步中的上一个点。请参见下面的代码:

    (此代码不会检查下一个关键点的正确性。因此,即使任何特征点在图像中消失了,光流也有可能找到下一个看起来可能与它接近的下一个点。因此,对于稳健的跟踪,实际上 应该以特定的时间间隔检测点。OpenCV样本附带了这样一个样本,该样本每5帧发现一次特征点,并且还对光流点进行了后向检查,以仅选择良好的流点。请参阅代码 samples/python/lk_track.py)。

    查看我们得到的结果:

    OpenCV中的密集光流

    Lucas-Kanade方法计算稀疏特征集的光流(在我们的示例中为使用Shi-Tomasi算法检测到的角)。OpenCV提供了另一种算法来查找密集的光流。它计算帧中所有点的光通量。它基于Gunner Farneback的算法,在2003年Gunner Farneback的“基于多项式展开的两帧运动估计”中对此进行了解释。

    下面的示例显示了如何使用上述算法找到密集的光流。我们得到一个带有光流矢量$(u,v)$的2通道阵列。我们找到了它们的大小和方向。我们对结果进行颜色编码,以实现更好的可视化。方向对应于图像的色相值。幅度对应于值平面。请参见下面的代码:

    查看以下结果:

    原创文章,作者:磐石,如若转载,请注明出处:https://panchuang.net/2020/03/30/opencv-python-%e7%b3%bb%e5%88%97-%e5%9b%9b%e5%8d%81%e4%b8%83-%e5%85%89%e6%b5%81/

    展开全文
  • 1、第一步, 我从牌顶拿出一张牌, 放到桌子上。 2、第二步, 我从牌顶再拿一张牌, 放在手上牌的底部。 3、第三步, 重复第一步、第二步的操作, 直到我手中所有的牌都放到了桌子上。 最后, 观众可以看到桌子.....

    前几天一同事去xx头条面试前端开发,遇到了一个面试问题,当时面试官是希望他通过当场思考以后说出答案,并说出解答的思路,问题是这样的:

    我手中有一堆扑克牌, 但是观众不知道它的顺序。

    1、第一步, 我从牌顶拿出一张牌, 放到桌子上。

    2、第二步, 我从牌顶再拿一张牌, 放在手上牌的底部。

    3、第三步, 重复第一步、第二步的操作, 直到我手中所有的牌都放到了桌子上。

    最后, 观众可以看到桌子上牌的顺序是:(牌底部)1,2,3,4,5,6,7,8,9,10,11,12,13(牌顶部)

    请问, 我刚开始拿在手里的牌的顺序是什么?

    给我一说,吓了我一大跳,现在的面试题都这么复杂了,说实话真换做我,当场也答不出来!

    接下来这半天里,通过手动演示,加上程序debug终于把这玩意搞出来了

    先说说我的思路

    你的手里拿了13张牌,每一次往桌子上放牌的时候,还要把手牌的第一张放到手牌的最后, 那可以推理出这可以通过13次的循环来完成,每次循环执行两个动作

    1、先将手牌最上面一张放在桌子上

    2、再将手牌中最上面的一张放手牌的最后

    以上的这种操作,我称他为正向操作,也就是手牌到桌子上

    问题中是知道了桌子上的结果,需要知道初始手牌的顺序,那其实就是把上面的操作以反向形式操作一次,也就是从桌子上到手里,简称反向操作

    来看看代码Java代码的实现:

    package xyz.abc.test;
    
    import com.google.common.primitives.Ints;
    
    import java.util.Arrays;
    import java.util.LinkedList;
    import java.util.Queue;
    
    
     * @date 2018/11/7 17:37
     */
    public class PokerService {
        /**
         * 正向,从手到桌子 t2 = {1,12,2,8,3,11,4,9,5,13,6,10,7};
         * 返回 {13,12,11,10,9,8,7,6,5,4,3,2,1};
         *
         * @param pokers
         */
        public void sort2(int[] pokers) {
            //13张牌转换成数组  方便操作,不用考虑太多
            LinkedList<Integer> pokerList = new LinkedList<>();
            for (int poker : pokers) {
                pokerList.add(poker);
            }
            //声明一个新的容器,在这里可以理解成桌子
            LinkedList<Integer> newPokers2 = new LinkedList<>();
            for (int i = 0; i < pokers.length; i++) {
                //将手牌中的第一张放在桌子上
                newPokers2.add(pokerList.pollFirst());
                //假如这是最后一次循环手牌已经没有了就不需要进入这个判断了
                if (pokerList.size() > 0) {
                    //将第一张放在牌堆的最后
                    pokerList.addLast(pokerList.pollFirst());
                }
            }
            //循环打印到控制台,
            newPokers2.forEach(System.out::println);
        }
    
        /**
         * 这里的操作是从桌子把牌拿回到手上
         * 从桌子 到 手上 int[] t = {13,12,11,10,9,8,7,6,5,4,3,2,1};
         * 返回 {1,12,2,8,3,11,4,9,5,13,6,10,7}
         *
         * @param pokers
         */
       public void sort(int[] pokers) {
            //从数组转换成list,只是为了方便操作,不用考虑其它的
            LinkedList<Integer> pokerList = new LinkedList<>(Ints.asList(pokers));
            //声明一个目标容器,理解成手
            LinkedList<Integer> newPokers2 = new LinkedList<>();
            for (Integer aPokerList : pokerList) {
                //判断手上的牌是否大于1张
                if (newPokers2.size() > 1) {
                    //如果大于一张,则把手牌的最后一张放在最上面
                    newPokers2.addFirst(newPokers2.pollLast());
                }
                //从桌子上拿一张牌放在手上
                newPokers2.addFirst(aPokerList);
            }
            //循环打印到控制台,
            newPokers2.forEach(System.out::println);
        }
    }

    有同学问,在这里是否要使用数组来完成?

    我的建议:

    1、数组概念是一组连续的内存空间,存储相同的类型的数据,那么对于这么多的数据移动操作来说,数组需要不停的重新分配的新的内存空间,对于内存来说不是很友好

    2、LinkedList的本质是一个双向链表,链表中对内存空间的连续性并没有要求,且中间结点的增加与删除,那效率优于数组,而且本身提供了pollFirst 和 pollLast方法

    基于以上两点,链表更适合当前这个场景

     

    以上仅是个人思路,大家有更好的解题思路,望大家能赐教

     

     

    展开全文
  • 一张图了解机器学习

    千次阅读 2021-10-27 10:03:58
    策略Policy ——将代理的状态映射到动作的方法,通过状态选择做什么行动 价值Value ——代理在特定状态下采取行动将获得的未来奖励 deephub译者注 机器学习可以根据不同的分类方法分成不同的类型,例如本文是根据...
  • 当然没骗你,给模型一张图片和一系列目标姿势,生成视频当然也没问题啦~ 视频里的系列动作拆解开来,就是上图这样。考验眼力的时刻到了:你能猜出哪两行是真实的、哪两行是合成的吗? 答案是,1、3行是合成的动作...
  • 我想要解决的问题是这样的:给定某个动漫人物的一张人脸图像和一个「姿势(pose)」,生成同一人物的另一张图像,并且其人脸会根据姿势而变化。在这里,姿势是一个指定了该人物面部表情和头部旋转情况的数值的集合。...
  • 3.IDT特征(稠密轨迹特征) IDT指的是提升的密集轨迹算法(iDT算法),对于一张图片来说,它是由帧构成的,而一个图像帧的数量够多,我们必须抓住重要的特征点来分析,并且必须在时间序列上跟踪这些特征点,IDT...
  • 深度学习在视频动作识别中的应用

    千次阅读 2018-01-31 11:05:09
    深度学习在视频动作识别领域的应用
  • 视频人体动作捕捉技术

    千次阅读 多人点赞 2020-08-31 15:57:18
    视频人体动作捕捉技术 FesianXu 2020/08/25 at UESTC 前言 人体动作捕捉技术(简称人体动捕技术)是影视游戏行业中常用的技术,其可以实现精确的人体姿态,运动捕捉,但是用于此的设备昂贵,很难在日常生活中...
  • 我看了很多文件,都是整合成一张图片,然后制作的动画,于是我遇到了多张图片的问题,已经成功做出来了,现在把方法分享~ 我这个代码中的图片是放到当前目录下的,并且让动画停止的条件就是停止代码运行。 import...
  • 深度学习在视频动作识别应用

    万次阅读 多人点赞 2017-07-31 23:13:41
    深度学习在最近十来年特别火,几乎是带动AI浪潮的最大贡献者。... 不说具体的技术,先上一张福利图,该图展示了机器对一个视频的认知效果。其总红色的字表示objects, 蓝色的字表示scenes,绿色的字表示activities。
  • 动作(基础篇)

    2020-06-25 00:00:00
    Photoshop中的动作Action可以让你自动、连续地完成多个操作,包括基础的调色、复杂的合成等。对于经常要执行的任务,使用动作,可大大提高工作效率。Ps菜单:窗口/动作快捷键:A...
  • 现下的 iPhone 最大不过 5.5 英寸,一屏能容纳的信息十分有限。在手机上你或许可以上下拖动查看,可若是想将内容分享给好友,截屏是最便捷的方法之一。截图能最大程度保证「所享即所见...在繁琐的截屏动作后,你还得...
  • 点击事件中的组件获取,setPosition的坐标问题》(点击打开链接)已经介绍过Cocos2dx的按钮,怎么用CCScale9Sprite与CCControlButton实现,然而这样的按钮必须要有文字与图片配合起来才能够实现,有时我们只需要一个...
  • html图片左右无缝循环滚动示例

    万次阅读 多人点赞 2016-11-28 15:17:02
    原理:(以左方向为例)先向左移动一个图片的宽度,此时第一个图片已经看不见了,这个时候将第一个标签元素克隆后追加到末尾,然后将第一个元素移除。达到循环滚动的效果。右移也是同理。下面是代码实现和demo<!...
  • 【新智元导读】随着GAN的发展,单凭...GANimation构建了一种人脸解剖结构(anatomically)上连续的面部表情合成方法,能够在连续区域中呈现图像,并能处理复杂背景和光照条件下的图像。 若是能单凭一张图像就能自...
  • ps批量将图片切割成4份

    千次阅读 2021-04-12 16:24:02
    1.打开ps 2.点击【窗口】选择【动作】 3.点击创建【新组】并命名 4.点击创建【新动作】 5.打开图片,点击
  • 浅谈动作识别TSN, TRN, ECO

    千次阅读 2018-09-24 11:35:06
    其它机器学习、深度学习算法的全面系统讲解可以阅读《机器...动作识别表面是简单的分类问题,但从本质上来说,是视频理解问题,很多因素都会影响其中,比如不同类型视频中空间时间信息权重不同?视频长短不一致?...
  • 这种问题在mtk平台上碰到过,现在做高通平台又碰到。 mtk平台上把摄像头堵住的情况下比较容易复现,原因就是isp的帧率较小,app处理的时序不对,导致没有处理拍照事件...app层:拍照的时候首先会下拍照的动作,然...
  • 论文阅读_人体姿态估计、动作识别现状

    千次阅读 多人点赞 2020-04-26 15:02:18
    二、基本任务:给定一张RGB图像,定位图像中人体的关键点位置,并确定其隶属的人体。 直观的问题: 关键点及周围的局部特征是什么样的? 关键点之间、人体肢体的空间约束关系是什么样的,以及层级的人体部件关系是...
  • 3种摄影中捕捉动作的基本方法

    千次阅读 2020-12-22 06:51:49
    让我们看一下使用相机捕捉动作的三种基本方法。1.冻结运动“冻结”运动中的主体是任何优秀运动摄影师的主要内容,并通过使用快速快门并将相机设置为连拍模式来实现。虽然这种技术似乎有助于某种程度的轻松,但重要...
  • 连续签到奖励 数据库如何设计?

    万次阅读 2016-07-11 17:20:22
    用户连续签到7天 7天均有不同的奖励 如果有中间则会从第一天重新开始签到 7天一个周期完成后恢复到第一天开始重新签到 考虑到用户数大概在200W,数据库如何设计更加合理? 添加评论  分享 ...
  • 硬核图解面试最怕的红黑树【建议反复摩擦】

    万次阅读 多人点赞 2020-11-05 09:26:58
    以下是它的转化过程: 光看单个节点的转化可能还不够明显,我制作了一张红黑树转2-3树的示意图,很清晰地描绘了它们之间的关系。 只要把左倾红黑树中的红色节点顺时针方向旋转45°使其与黑父平行,然后再将它们看作...
  • //终止所有动作。 bool HelloWorld::init() {  //////////////////////////////  // 1. super init first  if ( !CCLayer::init() )  {  return false;  }  CCSprite * sp= CCSprite::...
  • 近年来,基于深度序列的人体动作分类的研究越来越多,出现了基于不同数据源:深度图或RGB视频的3D人体关节的人体动作分类的方法以及特征表示方法。 本文着眼于人体动作识别领域的进展及挑战,总结了基于3D骨架的...
  • 基于3D关节点的人体动作识别综述

    万次阅读 多人点赞 2017-12-04 21:56:14
    文基于3D关节点的人体动作识别综述 原文:2016,Pattern Recognition: 3D skeleton-based human action classification: A survey 摘要 近年来,基于深度序列的人体动作分类的研究越来越多,出现了基于不同...
  • 3D 卷积神经网络 视频动作识别

    万次阅读 多人点赞 2017-12-15 17:54:30
    a)和b)分别为2D卷积用于单通道图像和多通道图像的情况(此处多通道图像可以指同一张图片的3个颜色通道,也指多张堆叠在一起的图片,即一小段视频),对于一个滤波器,输出为一张二维的特征图,多通道的信息被完全...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,524
精华内容 10,609
关键字:

一张一张的连续动作图片

友情链接: iat_sample.zip