精华内容
下载资源
问答
  • 图——关键路径 万次阅读 多人点赞
    2019-04-02 09:10:27
     

    AOE网示例图:

    AOE网:在一个表示工程的带权有向图中,用顶点表示事件(如V0),用有向边表示活动(如<v0,v1> = a1),边上的权值表示活动的持续时间,称这样的有向图为边表示的活动的网,简称AOE网(activity on edge network)

    源点:

    在AOE网中,没有入边的顶点称为源点;如顶点V0

    终点:

    在AOE网中,没有出边的顶点称为终点;如顶点V3

    AOE网的性质:

    【1】只有在进入某顶点的活动都已经结束,该顶点所代表的事件才发生;

             例如:a1和a2活动都结束了,顶点V2所代表的事件才会发生。

    【2】只有在某顶点所代表的事件发生后,从该顶点出发的各活动才开始;

             例如:只有顶点V1所代表的事件结束之后,活动a2和a4才会开始。

     

    在AOE网中,所有活动都完成才能到达终点,因此完成整个工程所必须花费的时间(即最短工期)应该为源点到终点的最大路径长度。具有最大路径长度的路径称为关键路径。关键路径上的活动称为关键活动:

     

    事件的最早发生时间:ve[k]

    根据AOE网的性质,只有进入Vk的所有活动<Vj, Vk>都结束,Vk代表的事件才能发生,而活动<Vj, Vk>的最早结束时间为ve[j]+len<Vj, Vk>。所以,计算Vk的最早发生时间的方法为:

    ve[0] = 0

    ve[k] = max(ve[j] + len<Vj, Vk>)

    事件的最迟发生时间:vl[k]

    vl[k]是指在不推迟整个工期的前提下,事件Vk允许的最迟发生时间。根据AOE网的性质,只有顶点Vk代表的事件发生,从Vk出发的活动<Vk, Vj>才能开始,而活动<Vk, Vj>的最晚开始时间为vl[j] - len<Vk, Vj>。

    活动的最早发生时间:ee[i]

    ai由有向边<Vk, Vj>,根据AOE网的性质,只有顶点Vk代表的事件发生,活动ai才能开始,即活动ai的最早开始时间等于事件Vk的最早开始时间。

    活动的最迟发生时间:el[i]

    el[i]是指在不推迟真个工期的前提下,活动ai必须开始的最晚时间。若活动ai由有向边<Vk, Vj>表示,则ai的最晚开始时间要保证事件vj的最迟发生时间不拖后。

    案例:

    原始AOE网:

    事件的最早发生时间:ve[k]

    从源点向终点方向计算

    ve[0] = 0

    ve[1] = ve[0] + a0 = 0 + 4 = 4

    ve[2] = max( ve[0] + a1, ve[1] + a2 ) = max(0 + 3, 4 + 2 = 6

    ve[3] = max(ve[1] + a4, ve[2] + a3) = max(4 + 6, 3 + 4) = 10

    事件的最迟发生时间:vl[k]

    从终点向源点方向计算

    vl[3] = ve[3] = 10

    vl[2] = vl[3] - a3 = 10 - 4 = 6

    vl[1] = min(vl[3] - a4, vl[2] - a2) = min(10-6, 6-2) = 4

    vl[0] = min(vl[2] - a1, vl[1] - a0) = min(4-4, 4-2) = 0 

    活动的最早发生时间:ee[i]

    共有五个活动:

    ee[0] = ve[0] = 0

    ee[1] = ve[0] = 0

    ee[2] = ve[1] = 4

    ee[3] = ve[2] = 6

    ee[4] = ve[1] = 4

    活动的最迟发生时间:el[i]

    el[0] = v[1] - a0 = 4 - 4 = 0

    el[1] = vl[2] - a1 = 6 - 3 = 3

    el[2] = vl[2] - a2 = 6 - 2 = 4

    el[3] = vl[3] - a3 = 10 - 4 = 6

    el[4] = vl[3] - a4 = 10 - 6 = 4

     

    活动的最早开始时间和最晚开始时间相等,则说明该活动时属于关键路径上的活动,即关键活动。

    经过比较,得出关键活动有:a0, a2, a3, a4,画出示意图如下:

    该AOE网有两条关键路径。

    所以,通过此案例也可以发现,一个AOE网的关键路径可能有多条。

    更多相关内容
  • 本文展示了如何在 Carneades 论证系统中将与论证方案匹配的关键问题建模为三种前提。 普通前提只有在得到充分论证的支持时才成立。 默认情况下,假设成立,直到他们受到质疑。 默认情况下,在异常情况下,否定成立,...
  • 用好统编教材:前提是忠实,关键是落实
  • 通过反射机制调用系统隐藏的API清除手机所有的app缓存.关键方法freeStorageAndNotify。前提添加AIDL文件.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • flash actionscript3循环播放动画gotoAndPlay 前提是要求fla中要在每个标签动画后加入1帧关键
  • 数据流通首选需要解决数据资源在符合使用方质量要求的前提 下的高效流动。高效流动需要数据资源标准化、产品化,数据资源实 时在线可按需查询,数据资源覆盖度能满足需方业务需求,以及相同 需求的数据资源具备多个...
  • hevc关键技术

    2014-04-22 09:09:04
    HEVC的核心目标是在H.264/AVC high profile的基础上,压缩效率提高一倍。即在保证相同视频图像质量的前提下,视频流的码率减少50%。在提高压缩效率的同时,可以允许编码端适当提高复杂度。
  • 人脸识别之人脸关键点(仅供本人参考)

    千次阅读 多人点赞 2022-05-12 16:18:58
    人脸关键

     深度学习人脸关键点检测方法----综述

    转自人脸关键点检测综述

    不知道为什么在ubuntu下知呼中的图片无法显示

    人脸关键点检测是人脸识别和分析领域中的关键一步,它是诸如自动人脸识别、表情分析、三维人脸重建及三维动画等其它人脸相关问题的前提和突破口。因此,本文针对深度学习方法进行了人脸关键点检测的研究。

    一、人脸关键点数据集

    传统人脸关键点检测数据库为室内环境下采集的数据库,比如 Multi-pie、Feret、Frgc、AR、BioID 等人脸数据库。而现阶段人脸关键点检测数据库通常为复杂环境下采集的数据库.LFPW 人脸数据库有 1132 幅训练人脸图像和 300 幅测试人脸图像,大部分为正面人脸图像,每个人脸标定 29 个关键点AFLW 人脸数据库包含 25993 幅从 Flickr 采集的人脸图像,每个人脸标定 21 个关键点。COFW 人脸数据库包含 LFPW 人脸数据库训练集中的 845 幅人脸图像以及其他 500 幅遮挡人脸图像,而测试集为 507 幅严重遮挡(同时包含姿态和表情的变化)的人脸图像,每个人脸标定 29 个关键点。MVFW 人脸数据库为多视角人脸数据集,包括 2050 幅训练人脸图像和 450 幅测试人脸图像,每个人脸标定 68 个关键点。OCFW 人脸数据库包含 2951 幅训练人脸图像(均为未遮挡人脸)和 1246 幅测试人脸图像(均为遮挡人脸),每个人脸标定 68 个关键点。

    1.1 传统方法

    1.1.1 ASM(Active Shape Model)

     An Introduction to Active Shape Models

    人脸Pose检测:ASM、AAM、CLM总结 - wishchin - 博客园 (详细说明)

    ASM(Active Shape Model)算法介绍

     ASM(Active Shape Model)主动形状模型通俗易懂讲解一:理论

    搜索ASM有很多。

    ASM(Active Shape Model) 是由 Cootes 于 1995 年提出的经典的人脸关键点检测算法,主动形状模型即通过形状模型对目标物体进行抽象,ASM 是一种基于点分布模型(Point Distribution Model, PDM)的算法。在 PDM 中,外形相似的物体,例如人脸、人手、心脏、肺部等的几何形状可以通过若干关键点(landmarks)的坐标依次串联形成一个形状向量来表示。ASM 算法需要通过人工标定的方法先标定训练集,经过训练获得形状模型,再通过关键点的匹配实现特定物体的匹配。

    ASM 主要分为两步:

    第一步:训练

    首先,构建形状模型:

    1. 搜集 n 个训练样本(n=400);
    2. 手动标记脸部关键点(68个);
    3. 将训练集中关键点的坐标串成特征向量;
    4. 对形状进行归一化和对齐(对齐采用 Procrustes 方法);
    5. 对对齐后的形状特征做 PCA 处理。

    接着,为每个关键点构建局部特征。目的是在每次迭代搜索过程中每个关键点可以寻找新的位置。局部特征一般用梯度特征,以防光照变化。有的方法沿着边缘的法线方向提取,有的方法在关键点附近的矩形区域提取。

    第二步:搜索。

    首先:计算眼睛(或者眼睛和嘴巴)的位置,做简单的尺度和旋转变化,对齐人脸;

    接着,在对齐后的各个点附近搜索,匹配每个局部关键点(常采用马氏距离),得到初步形状;

    再用平均人脸(形状模型)修正匹配结果;迭代直到收敛。

    ASM 算法的优点在于模型简单直接,架构清晰明确,易于理解和应用,而且对轮廓形状有着较强的约束,但是其近似于穷举搜索的关键点定位方式在一定程度上限制了其运算效率

    1.1.2 Active Appearance Models

    主动外观模型(AAM) - OpenCV China

    AAM(Active Appearance Model)算法介绍

    AAM算法简介

    1998 年,Cootes 对 ASM 进行改进,不仅采用形状约束,而且又加入整个脸部区域的纹理特征,提出了 AAM 算法。AAM 于 ASM 一样,主要分为两个阶段,模型建立阶段和模型匹配阶段。其中模型建立阶段包括对训练样本分别建立形状模型 (Shape Model) 和纹理模型 (Texture Model),然后将两个模型进行结合,形成 AAM 模型。

    1.1.3 Cascaded pose regression

    Cascaded pose regression 介绍说明

    2010 年,Dollar 提出 CPR(Cascaded Pose Regression, 级联姿势回归),CPR 通过一系列回归器将一个指定的初始预测值逐步细化,每一个回归器都依靠前一个回归器的输出来执行简单的图像操作,整个系统可自动的从训练样本中学习。

    所谓的线性回归,其实就是一个不断迭代的过程,对于每一个stage中,用上一个stage的状态作为输入来更新,产生下一个stage的输入,以此类推,直到达到最底层stage。

    训练过程中,先初始化一个shape ,用一种特征映射方法Φt生成局部二值特征。根据特征和目标shape的增量生成最终shape。权值通过线性回归进行更新。在测试阶段,直接预测形状增量,并应用于更新当前估计的形状。形状增量:

    如上公式所示,I为输入图像,St-1为第t-1 stage的形状,Φt为t stage的特征匹配函数,W为线性回归矩阵。

    人脸关键点检测的目的是估计向量,其中 K 表示关键点的个数,由于每个关键点有横纵两个坐标,所以 S 的长度为 2K。CPR 检测流程如图所示,一共有 T 个阶段,在每个阶段中首先进行特征提取,得到ft, 这里使用的是 shape-indexed features,也可以使用诸如 HOG、SIFT 等人工设计的特征,或者其他可学习特征(learning based features),然后通过训练得到的回归器 R 来估计增量ΔS( update vector),把ΔS 加到前一个阶段的 S 上得到新的 S,这样通过不断的迭代即可以得到最终的 S(shape)。

     1.1.4 人脸关键点定位3000fps的LBF方法

    人脸识别经典算法二:LBP方法

    人脸检测(七)--LBP特征原理及实现

    人脸对齐(八)--LBF算法_Eason.wxd的博客-CSDN博客_lbf算法

    计算机视觉基础-图像处理: LBP特征描述算子 - 知乎

    LBP特征及其一些变种

    基于LBP纹理特征计算GLCM的纹理特征统计量+SVM/RF识别纹理图片

    基于LBF方法的人脸对齐,出自Face Alignment at3000 FPS via Regressing Local Binary Features,由于该方法提取的是局部二值特征(LBF),论文作者的LBF fast达到了3000fps的速度,网上热心网友分享的程序也达到了近300fps的速度,绝对是人脸对齐方面速度最快的一种算法。因此,好多网友也将该方法称为,3000fps。

    该算法的核心工作主要有两部分,总体上采用了随机森林和全局线性回归相结合的方法,相对于使用卷积神经的深度学习方法,LBF采用的算法是传统的机器学习方法。

    1、LBF特征的提取

    LBF算法,将随机森林的输出组成一种特征(这里也就是LBF),并用LBF来做预测,除了采用随机森林的结构做预测,LBF还针对每个关键点给出一个随机森林来做预测,并将所有关键点对应的随机森林输出的局部特征相互联系起来,称作为局部二值特征,然后利用这个局部二值特征做全局回归,来预测形状变化量。

    在特征点附近,随机选择点做残差来学习LBF特征,每一个特征点都会学到由好多随机树组成的随机森林,因此,一个特征点就得用一个随机森林生成的0,1特征向量来表示,将所有的特征点的随机森林都连接到一起,生成一个全局特征,后续过程就可以使用该全局特征做全局线性回归了

    其中

    表示在第t次级联回归中,第j个特征点所对应的随机森林,所有的关键点的随机森林一起组成了,它的输出为LBF特征。然后利用LBF特征来训练全局线性回归或者预测形状变化量

    上图描述生成局部二值特征LBF的过程,图的下半部分描述了单个关键点上随机森林输出了一个局部二值特征,然后把所有随机森林的输出前后连接起来组成一个非常大但又十分稀疏的LBF特征。第一颗树遍历后来到了最左边的叶子节点所以记为[1,0,0,0],对于第一课树访问到的叶子节点记为1,其他的记为0,把所有的结果串联起来就是=[1,0,0,0,0,1,0,0,0,0,1,0.....],其中这个特征只有0,1组成,且大部分是0,特征非常的稀疏。真正的局部 二值特征就是将所有的landmark的特征串联起来,即是

    2、形状索引特征(shape-indexed)

    每一个关键点对应一个随机森林,而随机森林是由多个独立的随机树组成。论文中的随机树采用的特征是形状索引特征,ESR(CVPR‘12)和RCPR(ICCV'13)也是采用了类似的特征,这个特征主要是描述人脸区域中两个点的像素差值。关于两个像素点的选取,三个方法都使用了不同的策略。

    ESR方法采用的是在两个关键点附近随机出两个点,做这两个点之间的差值作为形状索引特征。

    RCPR方法采用的选取两个关键点的中点,外加一个随机偏置来生成特征点,用两个这样的特征点的差值作为形状索引特征。

    在LBF算法中,由于随机森林是针对单个关键点的,所有随机树使用到的特征点不会关联到其他关键点,3000fps的做法是在当前关键点的附近区域随机产生两个特征点,用这两个点的像素差值来作为形状索引特征。下图是每个特征点的局部区域面积变化,索引面积从大到小逐渐变小,目的是为了获得更加准确的局部索引特征。

    3、随机森林训练

    在LBF算法中,由于随机森林是针对单个关键点的,所有随机树种使用到的特征点不会关联到其他关键点,只有在当前关键点的附近区域随机产生两个特征点,做像素差值来作为形状索引特征。

    计算每一张图片的这两个点处的像素值的像素差,从事先随机生成的形状索引特征集合F中选取一个,作为分裂特征,之后随机产生一个分裂阈值,如果一幅图像的像素差小于这个阈值,就往左分裂,否则往右分裂,将所有图片都这样判断一次,就将所有图片分成了两部分,一部分在左,一部分在右。我们重复上面这个过程若干次,看看哪一次分裂的好(判断是否分裂的好的依据是方差,如果分在左边的样本的方差小,这说明它们是一类,分的就好),就把这个分裂的好的选择保存下来,即保存下这两个点的坐标值和分裂阈值。这样一个节点的分裂就完成了。然后每一个节点的分裂都按照这个步骤进行,直到分裂到叶子节点。

    分配的目的是希望左右子树的样本点的Y具有相同的模式。论文实现中,特征选取可以采用如下的方式进行。

    信息增益

    上式中f表示选取到的特征函数(即利用随机采样到的特征点计算形状索引特征(这里用的像素差值), Δ表示随机生成的阈值,S用来刻画样本点之间的相似度或者样本集合的熵(论文中,采用的是方差)。针对每一个几点,训练数据(X,Y)被分成两部分,(X1,Y1)和(X2,Y2),我们期望左右字数的样本数据具有相同的模式,论文中采用了方差刻画,所以选择特征函数f时,我们希望方差减小最大。

    权值学习:使用的双坐标下降方法,使下公式最小:

    λ是控制Wt长度,即让Wt尽量稀疏。测试的时候,先对一幅图像提取形状索引特征, 然后使用随机森林进行编码,最后使用w估计shape增量。

    from:人脸对齐 - ERP 和 LBF

    from:LBF特征_zhou894509的专栏-CSDN博客_lbf特征

    github上热心网友的程序,

    matab版本:jwyang/face-alignment

    c++版本:yulequan/face-alignment-in-3000fps

    1.2 深度学习方法

    1.2.1 Deep Convolutional Network Cascade for Facial Point Detection

    2013 年,Sun 等人首次将 CNN 应用到人脸关键点检测,提出一种级联的 CNN(拥有三个层级)——DCNN(Deep Convolutional Network),此种方法属于级联回归方法。作者通过精心设计拥有三个层级的级联卷积神经网络,不仅改善初始不当导致陷入局部最优的问题,而且借助于 CNN 强大的特征提取能力,获得更为精准的关键点检测。

    如图所示,DCNN 由三个 Level 构成。Level-1 由 3 个 CNN 组成;Level-2 由 10 个 CNN 组成(每个关键点采用两个 CNN);Level-3 同样由 10 个 CNN 组成。

    evel-1 分 3 个 CNN,分别是 F1(Face 1)、EN1(Eye,Nose)、NM1(Nose,Mouth);F1 输入尺寸为 39*39,输出 5 个关键点的坐标;EN1 输入尺寸为 39*31,输出是 3 个关键点的坐标;NM11 输入尺寸为 39*31,输出是 3 个关键点。Level-1 的输出是由三个 CNN 输出取平均得到。

    Level-2,由 10 个 CNN 构成,输入尺寸均为 15*15,每两个组成一对,一对 CNN 对一个关键点进行预测,预测结果同样是采取平均。Level-3 与 Level-2 一样,由 10 个 CNN 构成,输入尺寸均为 15*15,每两个组成一对。Level-2 和 Level-3 是对 Level-1 得到的粗定位进行微调,得到精细的关键点定位。

    Level-1 之所以比 Level-2 和 Level-3 的输入要大,是因为作者认为,由于人脸检测器的原因,边界框的相对位置可能会在大范围内变化,再加上面部姿态的变化,最终导致输入图像的多样性,因此在 Level-1 应该需要有足够大的输入尺寸。Level-1 与 Level-2 和 Level-3 还有一点不同之处在于,Level-1 采用的是局部权值共享(Lcally Sharing Weights),作者认为传统的全局权值共享是考虑到,某一特征可能在图像中任何位置出现,所以采用全局权值共享。然而,对于类似人脸这样具有固定空间结构的图像而言,全局权值共享就不奏效了。因为眼睛就是在上面,鼻子就是在中间,嘴巴就是在下面的。所以作者借鉴文献 [28] 中的思想,采用局部权值共享,作者通过实验证明了局部权值共享给网络带来性能提升。

    DCNN 采用级联回归的思想,从粗到精的逐步得到精确的关键点位置,不仅设计了三级级联的卷积神经网络,还引入局部权值共享机制,从而提升网络的定位性能。最终在数据集 BioID 和 LFPW 上均获得当时最优结果。速度方面,采用 3.3GHz 的 CPU,每 0.12 秒检测一张图片的 5 个关键点。

    1.2.2 Extensive Facial Landmark Localization with Coarse-to-fine Convolutional Network Cascade

    2013 年,Face++在 DCNN 模型上进行改进,提出从粗到精的人脸关键点检测算法,实现了 68 个人脸关键点的高精度定位。该算法将人脸关键点分为内部关键点和轮廓关键点,内部关键点包含眉毛、眼睛、鼻子、嘴巴共计 51 个关键点,轮廓关键点包含 17 个关键点。

    针对内部关键点和外部关键点,该算法并行的采用两个级联的 CNN 进行关键点检测,网络结构如图所示。

    针对内部 51 个关键点,采用四个层级的级联网络进行检测。其中,Level-1 主要作用是获得面部器官的边界框;Level-2 的输出是 51 个关键点预测位置,这里起到一个粗定位作用,目的是为了给 Level-3 进行初始化;Level-3 会依据不同器官进行从粗到精的定位;Level-4 的输入是将 Level-3 的输出进行一定的旋转,最终将 51 个关键点的位置进行输出。针对外部 17 个关键点,仅采用两个层级的级联网络进行检测。Level-1 与内部关键点检测的作用一样,主要是获得轮廓的 bounding box;Level-2 直接预测 17 个关键点,没有从粗到精定位的过程,因为轮廓关键点的区域较大,若加上 Level-3 和 Level-4,会比较耗时间。最终面部 68 个关键点由两个级联 CNN 的输出进行叠加得到。

    算法主要创新点由以下三点:(1)把人脸的关键点定位问题,划分为内部关键点和轮廓关键点分开预测,有效的避免了 loss 不均衡问题;(2)在内部关键点检测部分,并未像 DCNN 那样每个关键点采用两个 CNN 进行预测,而是每个器官采用一个 CNN 进行预测,从而减少计算量;(3)相比于 DCNN,没有直接采用人脸检测器返回的结果作为输入,而是增加一个边界框检测层(Level-1),可以大大提高关键点粗定位网络的精度。

    Face++版 DCNN 首次利用卷积神经网络进行 68 个人脸关键点检测,针对以往人脸关键点检测受人脸检测器影响的问题,作者设计 Level-1 卷积神经网络进一步提取人脸边界框,为人脸关键点检测获得更为准确的人脸位置信息,最终在当年 300-W 挑战赛上获得领先成绩

    1.2.3 TCDCN-Facial Landmark Detection by Deep Multi-task Learning

    优点是快和多任务,不仅使用简单的端到端的人脸关键点检测方法,而且能够做到去分辨人脸的喜悦、悲伤、愤怒等分类标签属性,这样跟文章的标题或者说是文章的主题贴合——多任务。

    我们可以从下图看到,缺点容易漂移,也就是对于人脸关键点的检测上面,并不能做到很好的精度或者很高的精度,因此有待进一步修改网络的雏形。另外一点是对于人脸关键点的检测上,检测关键点小,如果增加其人脸关键点的检测,或降低精度,这是神经网络模型的通病。

    1.2.4 Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks

    2016 年,Zhang 等人提出一种多任务级联卷积神经网络(MTCNN, Multi-task Cascaded Convolutional Networks)[9] 用以同时处理人脸检测和人脸关键点定位问题。作者认为人脸检测和人脸关键点检测两个任务之间往往存在着潜在的联系,然而大多数方法都未将两个任务有效的结合起来,本文为了充分利用两任务之间潜在的联系,提出一种多任务级联的人脸检测框架,将人脸检测和人脸关键点检测同时进行。

    MTCNN 包含三个级联的多任务卷积神经网络,分别是 Proposal Network (P-Net)、Refine Network (R-Net)、Output Network (O-Net),每个多任务卷积神经网络均有三个学习任务,分别是人脸分类、边框回归和关键点定位。网络结构如图所示:

    MTCNN 实现人脸检测和关键点定位分为三个阶段。首先由 P-Net 获得了人脸区域的候选窗口和边界框的回归向量,并用该边界框做回归,对候选窗口进行校准,然后通过非极大值抑制(NMS)来合并高度重叠的候选框。然后将 P-Net 得出的候选框作为输入,输入到 R-Net,R-Net 同样通过边界框回归和 NMS 来去掉那些 false-positive 区域,得到更为准确的候选框;最后,利用 O-Net 输出 5 个关键点的位置。

    为了提升网络性能,需要挑选出困难样本(Hard Sample),传统方法是通过研究训练好的模型进行挑选,而本文提出一种能在训练过程中进行挑选困难的在线挑选方法。方法为,在 mini-batch 中,对每个样本的损失进行排序,挑选前 70% 较大的损失对应的样本作为困难样本,同时在反向传播时,忽略那 30% 的样本,因为那 30% 样本对更新作用不大。

    实验结果表明,MTCNN 在人脸检测数据集 FDDB 和 WIDER FACE 以及人脸关键点定位数据集 LFPW 均获得当时最佳成绩。在运行时间方面,采用 2.60GHz 的 CPU 可以达到 16fps,采用 Nvidia Titan Black 可达 99fps。

    1.2.5 TCNN(Tweaked Convolutional Neural Networks)

    2016 年,Wu 等人研究了 CNN 在人脸关键点定位任务中到底学习到的是什么样的特征,在采用 GMM(Gaussian Mixture Model, 混合高斯模型)对不同层的特征进行聚类分析,发现网络进行的是层次的,由粗到精的特征定位,越深层提取到的特征越能反应出人脸关键点的位置。针对这一发现,提出了 TCNN(Tweaked Convolutional Neural Networks)[8],其网络结构如图所示

    上图为 Vanilla CNN,针对 FC5 得到的特征进行 K 个类别聚类,将训练图像按照所分类别进行划分,用以训练所对应的 FC6K。测试时,图片首先经过 Vanilla CNN 提取特征,即 FC5 的输出。将 FC5 输出的特征与 K 个聚类中心进行比较,将 FC5 输出的特征划分至相应的类别中,然后选择与之相应的 FC6 进行连接,最终得到输出。

    作者通过对 Vanilla CNN 中间层特征聚类分析得出的结论是什么呢?又是如何通过中间层聚类分析得出灵感从而设计 TCNN 呢?

    作者对 Vanilla CNN 中间各层特征进行聚类分析,并统计出关键点在各层之间的变化程度。越深层提取到的特征越紧密,因此越深层提取到的特征越能反应出人脸关键点的位置。作者在采用 K=64 时,对所划分簇的样本进行平均后绘图如下

    从图上可发现,每一个簇的样本反应了头部的某种姿态,甚至出现了表情和性别的差异。因此可推知,人脸关键点的位置常常和人脸的属性相关联。因此为了得到更准确的关键点定位,作者使用具有相似特征的图片训练对应的回归器,最终在人脸关键点检测数据集 AFLW,AFW 和 300W 上均获得当时最佳效果。

    1.2.6 DAN(Deep Alignment Networks)

    2017 年,Kowalski 等人提出一种新的级联深度神经网络——DAN(Deep Alignment Network)[10],以往级联神经网络输入的是图像的某一部分,与以往不同,DAN 各阶段网络的输入均为整张图片。当网络均采用整张图片作为输入时,DAN 可以有效的克服头部姿态以及初始化带来的问题,从而得到更好的检测效果。之所以 DAN 能将整张图片作为输入,是因为其加入了关键点热图(Landmark Heatmaps),关键点热图的使用是本文的主要创新点。DAN 基本框架如图所示:

    DAN 包含多个阶段,每一个阶段含三个输入和一个输出,输入分别是被矫正过的图片关键点热图由全连接层生成的特征图,输出是面部形状(Face Shape)。其中,CONNECTION LAYER 的作用是将本阶段得输出进行一系列变换,生成下一阶段所需要的三个输入,具体操作如下图所示:

    从第一阶段开始讲起,第一阶段的输入仅有原始图片和 S0。面部关键点的初始化即为 S0,S0 是由所有关键点取平均得到,第一阶段输出 S1。对于第二阶段,首先,S1 经第一阶段的 CONNECTION LAYERS 进行转换,分别得到转换后图片 T2(I)S1 所对应的热图 H2第一阶段 fc1 层输出,这三个正是第二阶段的输入。如此周而复始,直到最后一个阶段输出 SN。文中给出在数据集 IBUG 上,经过第一阶段后的 T2(I)、T2(S1)和特征图,如图所示:

     

    从图中发现,DAN 要做的「变换」,就是把图片给矫正了,第一行数据尤为明显,那么 DAN 对姿态变换具有很好的适应能力,或许就得益于这个「变换」。至于 DAN 采用何种「变换」,需要到代码中具体探究。

    接下来看一看,St 是如何由 St-1 以及该阶段 CNN 得到,先看 St 计算公式:

    其中是由 CNN 输出的,各阶段 CNN 网络结构如图所示:

    该 CNN 的输入均是经过了「变换」——的操作,因此得到的偏移量是在新特征空间下的偏移量,在经过偏移之后应经过一个反变换还原到原始空间。而这里提到的新特征空间,或许是将图像进行了「矫正」,使得网络更好的处理图像。

    关键点热度图的计算就是一个中心衰减,关键点处值最大,越远则值越小,公式如下:

    总而言之,DAN 是一个级联思想的关键点检测方法,通过引入关键点热图作为补充,DAN 可以从整张图片进行提取特征,从而获得更为精确的定位。

    1.2.7 Robust Facial Landmark Detection via a Fully-Convolutional Local-Global Context Network

    网络的设计思路特别,非常特别。下面在CVPR中的一篇论文Look at Boundary: A Boundary-Aware Face Alignment Algorithm具有相同的思路,都是利用heatmap作为引导进行神经网络的监督信号进行引导。不过这里需要preprocess进行热图的产生,即根据标记的数据和高斯模型产生heatmap,然后利用heatmap作为引导进行卷积神经网络的监督学习去逼近人脸关键点

    问题是根据产生的人脸关键点是无差的,只是根据函数的映射关系找到相对应的标记点,缺点是人脸关键点之间并不具有可区别性,也就是不知道哪里是眼睛,哪里是嘴巴,哪里是轮廓,与分层(或者说是级联)的神经网络具有本质性的差异。虽然说设计思路或者概念具有本质性的差异,但是并不妨碍这种方法具有很高的精度。

    1.2.8 Supervision-by-Registration: An Unsupervised Approach to Improve the Precision of Facial Landmark Detectors

    这篇文章一开始看标题觉得非常有意思,通过非监督学习去提升人脸检测关键点的精确率,非监督学习?just kidding?后来细看了一下,确实有意思的是使用CNN模型去检测人脸关键点位置,然后使用光流(flow tracking)跟踪视频流的下一帧图片人脸关键点位置作为融合信息给CNN检测器去作为人脸关键点的辅助信息。

    最后对于连续视频帧的检测效果如下所示:

    1.2.9 2018 最新研究

    ICCV在下一次举行时间为19年,上一次举行时间为17年,因此不太具有参考性。CVPR在2018年刚举行完毕,因此参考CVPR大量的文献,其中关于人脸的有56篇,32篇与2D人脸图像相关,其中与人脸关键点检测相关的只有6篇。因此在这里做简单的文献阅读综述。

    CVPR: Beyond Trade-off: Accelerate FCN-based Face Detector with Higher Accuracy

    参考FCN和SSD网络模型,利用多层FCN特征层对大小不一的人脸进行检测,并且添加有SSCU算法层(基本原理是基于NMS非极大值抑制算法)作为FCN人脸热图判断,然后利用不同层检测的结果进行合并,对于背景中小人脸有较好的检测效果。文中并没有给出时间效率,并且SAP层的实现具有一定难度。

    CVPR:Direct Shape Regression Networks for End-to-End Face Alignment

    使用Doubly convolutional neural networks提出的卷积层进行卷积,然后将得到的特征图经过该论文提出的傅里叶池化层,损失函数使用normalized mean error。对比TCDCN精度有所提高,但是并没有给出时间效率。特点是简单易懂,实现成本客观。

    Real-Time Rotation-Invariant Face Detection with Progressive Calibration Networks

    旋转人脸检测,利用自定义的PCN网络模型,每一次检测旋转角度、boundingbox、分类得分进行判断,通过级联的方式对boundingbox和分类进行过滤,旋转角度作为下一层的输入信息进行累加,从粗到精的一个过程,该文章之前已经见过一次在neurcomputting2017上发表的。

    CVPR:Look at Boundary: A Boundary-Aware Face Alignment Algorithm

    直接对关键点进行预测会存在过拟合问题,特别是对一些具有具有扭曲表情,夸张表情,遮挡表情的人脸关键点检测使用现有的算法是非常不准确的。为了更好地解决这个问题,这篇文章提出了使用boundary边界的检测方法融合人脸关键点检测方法,使得人脸关键点检测更加精准(特殊情况下),在论文实验部分给出的精确度进步并不是很大。

    对于网络模型是把人脸关键点转换成为连接的人脸边界,然后网络同时训练关键点和人脸边界(注意是有顺序的),然后把人脸边界获得Heatmaps信息往下传递给人脸关键点检测作为FMF层融合参考信息,最终使得人脸关键点被控制在人脸边界heatmap上,从原理上可以看出对于关键点漂移的情况会减少,更好地拟合人间关键点。

    CVPR:A Prior-Less Method for Multi-Face Tracking in Unconstrained Videos

    为了解决在视频流中人脸变化复杂,黑暗情况变化差异大的问题,文章并没有直接使用一个大统一的模型去解决这个问题,而是结合三个模块分别使用不同的数学模型去检测人脸。对于第一阶段使用一个Co-occurentce model对人体姿态和人脸进行估计,因为人体基本姿态和人脸是相互作用的关系,特别是对于连续帧来说,因此使用Co-occurentce模型作为第一阶段;第二阶段使用VGG特征作为强关联信息进行聚类提取人脸特征出来;最后阶段使用高斯处理模型对深度特征进行补充和提取精细化的结果。因为设计到的数学理论和模型较多,因此如果想要细节理解需要阅读原论文。

    Disentangling 3D Pose in A Dendritic CNNfor Unconstrained 2D Face Alignment

    提出一个Pose Conditioned Dendritic Convolution Neu-ral Network (PCD-CNN)网络。这个网络从原理来看效果不会太好,会存在漂移问题,因为根据heatmap会存在较粗的定位,但是最后(b)阶段引入了Proposed dendritic structure进行弥补,可是这种弥补方式是根据数学公式进行结构特征点计算的方式能否真正地减少误差读者抱着一定的疑惑,如果是基于检索的方式或者搜图的方式可能会效果更好。

    Style Aggregated Network for Facial Landmark Detection

    这篇文章主要聚焦在对于不同style的图像中,人脸关键点的检测效果是不一样的,为了更好地统一检测效果或者说为了更好地更精确的提高检测效果,因此可以对样本进行一个风格聚合网络Style Aggregated Network,通过该网络模型可以产生各种不同风格的图片,然后利用这些图片融合信息一起送入CNN网络中进行检测。如下图所示,根据上面的描述,这里使用到了两个网络模型,一个是GAN网络模型,一个是CNN网络模型。

    上面的style-aggregated face generation module就是使用GAN模型,具体下面的图会给出更加详细的解析。下面的facial landmark predicction module就是使用CNN网络模型。最后输出heatmap热图的位置点,通过高斯分布获得最佳预测位置。

    文章中使用不同的风格style主要是3哥,一个是草图sketch,一个是强光下light,另外一个是gray灰度图,合成一个[12, width, hegih]的矩阵作为网络模型的输入,增加了算法的抗敏性。

    总结

    深度学习技术的出现,有效促进了不同尺度和不同任务信息之间的融合,使得信息的结合方式由平面开始向立体方法发展,对于人脸关键点提取模型的发展,具有突出的实际意义。正因为如此,本文对目前人脸关键点检测任务中常用的深度学习方法进行综述。

    尽管深度学习方法在人脸关键点检测任务上已经获得了长足的发展,算法性能不断提升,与实际应用的要求也越来越接近。然而,该任务的研究还远未结束,目前还有一些关键性难题亟待解决。在此总结三点:

    (1)输入样本多样性问题:多变的人脸姿态和遮挡。姿态和遮挡是人脸关键点检测所面临的经典难题,近年来也出现了很多处理这两方面问题的思路和方法,但目前在实际应用中,尤其在实时低图像质量条件下,对于这两类难题的处理还难以令人满意. 尤其当姿态发生快速和剧烈改变,以及遮挡比例较大时,现有方法的精度距离实际应用的要求还有较大差距,需要进一步研究和提升。

    (2)大场景小样本问题:在图像中非常多的小人脸。小人脸检测是人脸关键点检测所面临的经典难题,近年来出现了很多论文去解决小人脸检测,但是对于小人脸的关键点检测的思路和方法并不常见。主要受制于一个很严重的问题就是图像的质量不够高,小图像中的单张人脸图像质量低,一个像素包含的内容非常少,图片模糊。因此对于这类型的人脸关键点检测依然是个非常困难的话题;另外一个主要原因是受制于前一个步骤——小场景的人脸检测准确率低的问题,既然人脸检测的准确率低,那么在基于人脸检测下的人脸关键点检测问题会更加凸显和严重。

    (3)方法众多但是百变不离其中:深度学习的方法百花齐放,但是在众多的方法当中没有一个非常outstanding的论文能够统一所有的方法,或则凸显出来。因为在深度学习当中,其主要思路是利用神经网络的非线性映射关系在标注的数据和输入的数据之间找到一个最优映射路径,通过这个映射关系去逼近我们的目标,但是这种方法的缺点是肯定会存在过拟合的问题。究其原因是人脸相似度很高(即使说是千人千脸,但是对比起其他动物的脸,其他物体和人脸对比其人脸与人脸之间的相识度依然非常高),在高相似度中间找到不同人脸之间的细微差别是非常困难的,因此出现了很多方法去解决这个问题,但是各论文分别去解决各自所在细分领域或者细分问题上,并没有一个很好的框架或者算法去解决这问题。

    本文针对近年人脸关键点检测方法中的深度学习方法进行了综述研究。本文对人脸关键点检测任务进行了详细描述,并将具有代表性的深度学习网络模型,从模型设计思路到模型框架均进行较为深入的探究。在所面临的挑战性问题和开展相关研究所需的基础知识方面,本文亦抛砖引玉,希望本文能对相关科研人员了解人脸关键点检测问题并开展相关研究起到微薄的作用。

    展开全文
  • 人脸关键点检测之PFLD

    千次阅读 2020-11-22 23:07:39
    人脸关键点检测也称为人脸对齐,目的是自动定位一组预定义的人脸基准点(比如眼角点、嘴角点)。作为一系列人脸应用的基础,如人脸识别和验证,以及脸部变形和人脸编辑。这个问题一直以来都受到视觉界的高度关注,在...

    1. 简介

    人脸关键点检测也称为人脸对齐,目的是自动定位一组预定义的人脸基准点(比如眼角点、嘴角点)。作为一系列人脸应用的基础,如人脸识别和验证,以及脸部变形和人脸编辑。这个问题一直以来都受到视觉界的高度关注,在过去的几年里,我们的产品取得了很大的进步。然而,开发一种实用的人脸关键点检测器仍然具有挑战性,因为检测精度,处理速度和模型大小都应该考虑

    在现实世界条件下,获得完美的面孔几乎是不可能的。换句话说,人脸经常是出现在控制不足甚至没有约束的环境中。在不同的照明条件下,它的外表有各种各样的姿势、表情和形状,有时还有部分遮挡。下图提供了这样的几个例子。此外,有足够的训练数据用于数据驱动方法也是模型性能的关键。在综合考虑不同条件下,捕捉多个人脸可能是可行的,但这种收集方式会变得不切实际,特别是当需要大规范的数据来训练深度模型时。在这种情况下,我们经常会遇到不平衡的数据分布。本文介绍的这个人脸检测算法PFLD《PFLD: A Practical Facial Landmark Detector》总结了有关人脸关键点检测精度的问题,分为三个挑战(考虑实际使用时,还有一个额外的挑战!)。
    在这里插入图片描述

    • 局部变化:表情、局部特殊光照、部分遮挡,导致一部分关键点偏离了正常的位置,或者不可见了;

    • 全局变化:人脸姿态、成像质量;

    • 数据不均衡:在人脸数据里面,数据不均衡体现在,大部分是正脸数据,侧脸很少,所以对侧脸、大角度的人脸不太准;

    • 模型效率:在 CNN 的解决方案中,模型效率主要由 backbone 网络决定。

    2. 网络结构

    在这里插入图片描述
    黄色曲线包围的是主网络,用于预测特征点的位置

    绿色曲线包围的部分为辅助子网络,在训练时预测人脸姿态(主要包括三个姿态角,,有文献表明给网络加这个辅助任务可以提高定位精度,具体参考原论文),这部分在测试时不需要。

    backbone 网络是 bottleneck,用MobileNet块代替了传统的卷积运算。通过这样做,我们的backbone的计算量大大减少,从而加快了速度。此外,可以根据用户需求通过调整MobileNets的width参数来压缩我们的网络,从而使模型更小,更快。

    姿态角的计算方法:

    • 预先定义一个标准人脸(在一堆正面人脸上取平均值),在人脸主平面上固定11个关键点作为所有训练人脸的参考;
    • 使用对应的11个关键点和估计旋转矩阵的参考矩阵;
    • 由旋转矩阵计算欧拉角。

    网络结构细节如下:
    在这里插入图片描述

    3. 损失函数

    在深度学习中,数据不平衡是另一个经常限制准确检测性能的问题。例如,训练集可能包含大量正面,而缺少那些姿势较大的面孔。如果没有额外的技巧,几乎可以肯定的是,由这样的训练集训练的模型不能很好地处理大型姿势情况。在这种情况下,“平均”惩罚每个样本将使其不平等。为了解决这个问题,我们主张对训练样本数量少进行大的惩罚,而不是对样本数量多的进行惩罚。
    在这里插入图片描述
    M为样本个数,N为特征点个数,Yn为不同的权重,|| * ||为特征点的距离度量(L1或L2距离)。(以Y代替公式里的希腊字母)

    进一步细化 Y n Y_n Yn:
    在这里插入图片描述
    其中:
    在这里插入图片描述
    即为最终的样本权重。

    K=3,这一项代表着人脸姿态估计的三个维度,即yaw, pitch, roll 角度,由计算公式可知角度越高,权重越大。

    C为不同的人脸类别数,作者将人脸分成多个类别,比如侧脸、正脸、抬头、低头、表情、遮挡等,w为与类别对应的给定权重,如果某类别样本少则给定权重大

    4. 测试结果

    检测精度对比如下面的表所示
    在这里插入图片描述
    下面来看一下算法处理速度和模型大小,图中C代表i7-6700K CPU,G代表1080 Ti GPU,G*代表Titan X GPU,A代表移动平台Qualcomm ARM 845处理器。
    在这里插入图片描述
    其中PFLD 1X是标准网络,PFLD 0.25X是MobileNet blocks width 参数设为0.25的压缩网络,PFLD 1X+是在WFLW数据集上预训练的网络。

    下图是该算法在AFLW数据集上与其他算法的精度比较:
    在这里插入图片描述
    消融实验方面作者仅仅分析了损失函数带来的影响,结果如下表所示。
    在这里插入图片描述

    5. PFLD优化

    5.1 GhostNet

    这里简单介绍一下GhostNet,因为优化过程中会使用到GhostNet提出的GhostModule,而且正是GhostModule,PFLD的效率有了一个质的提升。
    《GhostNet: More Features from Cheap Operations》是2020年3月华为、北大为了提升CNN在嵌入式设备的运行效率而提出的算法。其中提出的GhostModule,巧妙地将PointWise Convolution和DepthWise Convolution结合起来,在达到相同通道输出的前提下,有效地减少运算量。虽然上面提到的Inverted Residual Block同样也是PointWise Convolution和DepthWise Convolution的结合体,但是两者将它们的结合方式有所不同,而正是GhostModule的巧妙结合,让网络的计算量得到减少。
    其实按照个人的理解,GhostModule可以一句话概况为:输入的Tensor先做PointWise Convolution,再做DepthWise Convolution,最后将PointWise Convolution和DepthWise Convolution的结果按channel的维度进行拼接,作为最终的输出。大道至简,操作并不复杂,但却大大减少了运算量。

    5.2 PFLD网络结构优化

    5.2.1 1 调整PFLD网络结构,并增加多尺度全连层的数目(保持网络速度不变,尽可能提升网络精度)

    对PFLD的基础网络进行调整,没有用NAS等技术,凭借经验和不断尝试尽量找出性能较好的网络结构,如果大家找到更好的网络结构,也欢迎大家分享出来。
    此外,PFLD论文中提到 “To enlarge the receptive field and better catch the global structure on faces, a multi-scale fully-connected (MS-FC) layer is added for precisely localizing landmarks in images”,大概意思是为了增大感受野和更好地获取人脸的全局结构,多尺度全连层的嵌入,可以准确地定位人脸关键点。论文作者认为,多尺度全连层是为了提升网络的定位精度而加入的,因此在优化过程中,增加了多尺度全连层的数目,以提高网络的定位精度
    初步优化的网络结构如下:
    在这里插入图片描述

    5.2.2 将Inverted Residual Block替换成GhostModule,并细调网络结构(保持网络精度不变,提升网络速度)

    由于GhostModule的轻量化,将PFLD的Inverted Residual Block全部替换成GhostModule,并继续细调网络结构,最终优化的网络结构如下表:
    在这里插入图片描述

    5.3 优化后的测试结果

    WFLW测试结果
    输入大小为112x112
    在这里插入图片描述
    输入大小为96x96
    在这里插入图片描述
    参考代码:PFLD_UltraLight

    6. 最后

    展开全文
  • 关键路径 问题 用【有向网】表示一个【施工流图】 1. 【弧上的权值】:表示完成该项目【子工程】所需时间 2. 整个工程【完成的时间】:从【有向图】的【源点】到【汇点】的最长路径 【问】 哪些子...

    原文链接:https://www.yuque.com/cppdev/algo/amsegl

    AOE网

    【有向无环图】活动在边上的网(Vctivity On edge network),常用来模拟施工流图,进而管理工程的工期

    【例子】此图来源于《数据结构高分笔记》
    在这里插入图片描述

    概念说明举例
    边表示活动,且有权值,权值代表活动的持续时间【边a4】代表活动,权重3,表示该活动要持续3天
    顶点顶点代表事件,事件是图中新活动开始、旧活动结束的标志【顶点1】代表事件,是活动a2、a3的开始,是活动a0的结束
    源点入度为0的顶点,即工程的开始顶点0
    汇点出度为0的顶点,即工程的结束顶点10

    AOE的应用(AOE的相关概念)

    AOE常用来模拟施工流图,进而管理工程的工期,例如在工程中哪些工作要先做;为了控制工期,哪个工作在哪个时间点必须开始

    【先来理解一下“最早”、“最迟”、“关键”】工程:考数学。工期:8:30-11:30

    • 最早发生时间】8:30开始考试,你可以先睡一觉,再起来写;但是你最早开始答题的时间也只能是8:30
    • 最迟发生时间】11:30要交卷,你预估最后一大题要花30min时间,那么你开始做最后一大题的最迟时间是11:00,要不就来不及咯
    • 剩余时间】你预留了30min给最后一大题,那么11:00开始做最后一题做就好了;结果你太聪明,9:00就做到了最后一题;这时有2个小时的空余时间,即是剩余时间,它反应的也是一种松弛度
    • 关键活动或关键事件】剩余时间为0的事件或活动就称之为“关键”,因为做完它前面的事情,这件事情就必须要开始,没有耽搁的余地
    概念解释举例
    在这里插入图片描述
    事件k的最早发生时间ve(k)ve即vertex earliest
    【图中表现为】源点到顶点k的最长路径
    若事件4要发生,事件4的上游0、1、2都要先发生
    【即】事件4的最早发生时间ve(4)=0到4的最长路径=7
    活动z的最早发生时间ee(z)ee即edges earliest
    ve是说顶点的最早发生时间,ee是说边的最早发生时间
    【解释】a7、a8的最早发生时间,即是事件4的最早发生时间,如ee(a7)=ee(a8)=ve(4)=7
    【算法】ee(z)=ve(k)顶点k是边z的头顶点
    【例】边a3的头顶点是1:ee(a3)=ve(1)=3
    关键路径从源点到汇点,图中最长的路径称为关键路径
    【现实意义】整个工期所完成的最短时间
    【即0->10的最长路径】a1->a4->a8->a12->a13->a14
    【关键路径的时间即为此工程完成的最短时间】a1+a4+a8+a12+a13+a14=28
    关键活动关键路径上的活动
    【现实意义】若想要最短时间完成这项工程,这些活动的上游完成后,不能休息,要立刻开始!
    a1、a4、a8、a12、a13、a14
    事件k的最迟发生时间vl(k)vl即vertex latest
    在不推迟工期的前提下,事件k最迟发生时间
    1. 根据关键路径得到工程结束的最短时间为28天
    2. 事件7距离完成需要17天(7-10有两条路,取时间大的:①7->9->10的时间要10天,②7->8->9->10要17天)
    3. 那么,事件7最迟要在第11天开始!不然28天就完不成了!
    【即】vl(7)=28-17=11
    活动的最迟发生时间el(z)el即edges latest
    在不推迟工期的前提下,活动z最迟发生的时间
    【解释】a8的最迟发生时间=vl(7)-a8的权重=vl(7)-4=7
    【算法】el(z)=vl(k)-z顶点k是边z的尾顶点
    【例】边a14的尾顶点是10:el(a14)=vl(10)-a14=28-6=22

    原理:求关键活动和关键路径

    【要注意区分】ve、vl与ee、el的区别

    1. ve、vl针对的是顶点而言,顶点代表的是事件
    2. ee、el针对的是边而言,边代表的是活动

    求ve、vl(顶点)

    概念说明求法
    ve(vertex earliest)顶点的最早发生时间,即事件的最早发生时间①求出拓扑有序序列;②源点的ve=0;③按拓扑序列从头到尾计算ve(k)={ve(j)+<j,k>}的最大值(j为k的上一个结点)
    vl(vertex latest)顶点的最迟发生时间,即事件的最迟发生时间①求出逆拓扑有序序列;②汇点的vl=ve=28;③按逆拓扑序列从尾到头计算vl={vl(j)-<k,j>}的最小值(j为k的下一个结点)

    【拓扑有序序列】0 1 2 3 4 5 6 7 8 9 10,按此顺序求ve
    【逆拓扑有序序列】10 9 6 8 5 7 3 4 1 2 0,按此顺序求vl

    在这里插入图片描述

    顶点ve(顶点)vl(顶点)
    00min{v1(1)-a0, vl(2)-a1}=0
    1ve(0)+a0=3min{vl(3)-a2, vl(4)-a3}=6
    2ve(0)+a1=4min{vl(5)-a5, vl(4)-a4}=4
    3v(1)+a2=5vl(6)-a6=15
    4两条路:①ve(1)+a3=4;②ve(2)+a4=7
    取最大值:ve(4)=7
    min{vl(6)-a7, vl(7)-a8}=7
    5ve(2)+a5=9vl(8)-a9=19
    6两条路:①ve(3)+a6=11;②ve(4)+a7=15;
    取最大值:ve(6)=15
    vl(10)-a10=21
    7ve(4)+a8=7+4=11两条路:①vl(9)-a11=18;②vl(8)-a12=11
    取最小值:vl(8)=11
    8max{ve(7)+a12, ve(5)+a9}=21vl(9)-a13=21
    9max{ve(7)+a11, ve(8)+a13}=22vl(10)-a14=22
    10max{ve(6)+a10, ve(9)+a14}=2828

    求ee、el(边)

    概念说明求法举例
    ee(edges earliest)边的最早发生时间,即活动的最早发生时间①从前往后,遍历顶点;②记下顶点引出的边z;③ee(z)就等于顶点的ve①看顶点0;②顶点0引出了边a0、a1;③ee(a0)=ee(a1)=ve(0)=0;④看一下个顶点,以此类推
    el(edges latest)边的最迟发生时间,即活动的最迟发生时间①从后往前,遍历边,看此边的尾顶点k;②边的el=ve(k)-边的权重①看边a14,a14的尾顶点是10;②el(a14)=ve(10)-a14=28-6=22;③继续看下一个边a13,以此类推
    例子ee和el
    在这里插入图片描述在这里插入图片描述
    ee(边)el(边)
    a003
    a100
    a2313
    a336
    a444
    a5414
    a6515
    a7713
    a877
    a9919
    a101521
    a111118
    a121111
    a132121
    a142222

    求关键路径,关键活动

    关键活动关键路径整个工程完成的最短时间
    说明ee=el的活动即为关键活动关键活动构成的路径关键活动的权重之和
    解释ee=el代表活动不能够推迟的,若该活动推迟了,工程就不能在工期内完成关键路径即图中的最长路径图中的所有活动都要完成,中间不停歇,完成整个工程的最短时间就是图中最长的路径,即关键路径
    例子a1 a4 a8 a12 a13 a140->2->4->7->8->9->10整个工程完成的最短时间:a1+a4+a8+a12+a13+a14=28

    手算举例

    在这里插入图片描述

    C语言实现

    【方法一】关键路径即是图中最长的一条(可修改Dijkstra、Floyd算法求)
    1.用拓扑排序获得图的源点v和汇点w
    2.计算v到w之间的最长路径

    【方法二】求ve、vl、ee和el的算法,时间复杂度O(n+e)

    typedef struct ArcNode{
    	int adjvext;
    	int w;
    	struct ArcNode *nextarc;
    }ArcNode;
    typedef struct{
    	char data;
    	int cnt; //记录该结点的入度
    	ArcNode *firstarc;
    }VNode;
    typedef struct{
    	VNode vers[MAXSIZE];
    	int vernum, arcnum;
    }ALGraph;
    // 计算每个结点的入度
    void CntVNodeInDegree(ALGraph &G) {
    	for (int v=0; v<G.vernum; v++) {
    		for (ArcNode *p=G.vers[v].firstarc; p; p=p->next) {
    			int w = p->adjvex; //边v->w
    			G.vers[w].cnt++;   //w的入度+1
    		}
    	}
    };
    // 拓扑排序:order[]为拓扑有序序列,返回1表示图为有向无环图
    int TopSort(ALGraph &G, int order[]) {
    	int stack[MAXSIZE], top=-1; //存放入度为0的顶点
    	int v,w,n;
    	// 将图中入度为0的顶点入栈
    	for (i=0; i<G.vernum; ++i)
    		if (G.vers[i].cnt==0) stack[++top] = i;
    	n=0; //已删除n个顶点
    	while(top!=-1) { //还有入度为0的顶点
    		v = stack[top—-]; //出栈
    		//删除此顶点
    		order[n] = v; n++;
    		for (ArcNode *p=G.vers[v].firstarc; p; p=p->next) {
    			w = p->adjvex;-(G.vers[w].cnt);
    			if (G.vers[w].cnt==0) stack[++top]=w;
    		}
    	}
    	if (n==G.vernum) return 1;
    	else return 0;
    }
    // 关键路径
    int CriticalPath(ALGraph &G, int **map) {
    	// map[G.vernum][G.vernum]为G的邻接矩阵;map[v][w]=1表示v->w为关键活动。初始值为INF,表示不是关键活动
    	int topo[G.vernum];
    	int ve[G.vernum] = {0}, vl[G.vernum] = {0};
    	int v, w;
    	ArcNode *p;
    	// 拓扑排序:检查是否为有向无环图,并获得拓扑序列存到topo[]中
    	if (TopSort(G, topo)==0 ) return 0;
    	// 计算每个顶点的ve:ve[]初始值为0,ve[w]=Max{ve[v] + vw的边权重}
    	for (i=0; i<G.vernum; i++) ve[i]=0; //ve[]初始值为0
    	for (i=0; i<G.vernum; i++) {		//遍历拓扑有序序列
    		v = topo[i];					//得到拓扑有序序列的顶点
    		// 计算它的下一个顶点:v->w
    		for (p=G.vers[v].firstarc; p; p=p->next) {
    			w = p->adjvex; 				//它的邻边v->w
    			if (ve[w] < ve[v]+p->w) 	//ve(尾) ve(头)+边。取最大值
    				ve[w] = ve[v]+p->w;		//ve(尾)=ve(头)+边
    		}
    	}
    	// 计算每个顶点的vl:vl[]初始值为ve[汇点],vl[w]=min{vl[v] - vw边的权重}
    	v = topo[G.vernum-1]; //汇点
    	for (i=0; i<G.vernum; ++i) vl[i]=ve[v]; //vl[]初始值为ve[汇点]
    	for (i=G.vernum-1; i>=0; i—-) {			//从后往前遍历拓扑有序序列
    		v = topo[i];						//拓扑有序序列的顶点
    		// 计算它的下一个顶点:v->w
    		for (p=G.vers[v].firstarc; p; p=p->next) {
    			 w = p->adjvex; 				//它的邻边v->w
    			 if (vl[v] > vl[w]-p->w) 		//vl(头) vl(尾)-边。取最小值
    			 	vl[v] = vl[w]-p->w;		//vl(头)=vl(尾)-边
    		}
    	}
    	// 求关键活动
    	int ee, el; //当前活动的ee、el
    	for (i=G.vernum-1; i>=0; i—-) { //从右往左遍历拓扑有序序列
    		v = topo[i];
    		for (p=G.vers[v].firstarc; p; p=p->nextarc) {	//遍历该顶点的边
    			w = p->adjvex;		//它的邻边v->w
    			ee = ve[v];			//ee(vw)=ve(v)
    			el = vl[w]-p->w;	//el(vw)=vl(尾)-边
    			if (ee==el) {		//为关键活动
    				printf((%c->%c)\t”, G.vers[v].data, G.vers[w].data);
    				map[v][w] = 1; //v-w边为关键活动
    			}
    		}
    	}
    
    	return 1;
    }
    void PrintAllCriticalPath(ALGraph &G, int **map, int start, int end) {
    	static char path[MAXSIZE] = {‘\0};
    	static int index = 0;
    	// 关键路径不只一条,打印出所有的关键路径
    	path[index++] = G.vers[start].data;
    	if (start==end) {
    		path[index] = ‘\0;
    		printf(%s\n”, path);
    	} else {
    		for (ArcNode *p=G.vers[start].firstarc; p; p=p->nextarc) {
    			int w = p->adjvex;
    			if (map[start][w]==1) {
    				PrintAllCriticalPath(G, map, w, end);
    			}
    		}
    	}
    	index—-;
    }
    
    展开全文
  • 基于关键路线法和约束理论的生产控制模式研究,王光禹,刘颖,针对车间生产过程中经常发生的延迟订单和瓶颈工序在制品堆积问题,在保证均衡的物料流动的前提下,结合关键路线法和约束理论,提
  • 考虑关键点处冲突的进离场排序模型算法研究,王莉莉,张潇潇,为解决终端区内各关键点处进离场航班之间的汇聚、交叉运行问题,综合考虑了间隔、容量等因素,以双跑道混合运行为前提,以总延误
  • 开源人脸106关键

    千次阅读 2020-01-10 18:56:11
    开源人脸106关键点 https://github.com/zeusees/HyperLandmarkgithub地址,高精度https://github.com/lsy17096535/face-landmarkgithub地址,低精度 HyperLandmark-开源人脸106点关键点检测SDK ...
  • 关键路径计算

    万次阅读 多人点赞 2017-09-03 13:58:48
    计算关键路径,只需求出上面的四个特征属性,然后取e(i)=l(i)的边即为关键路径上的边(关键路径可能不止一条)。  先来看看四个特征属性的含义:  Ø  Ve(j):是指从始点开始到顶点Vk的最大路径长度 ...
  • 人脸关键点检测是人脸识别和分析领域中的关键一步,它是诸如自动人脸识别、表情分析、三维人脸重建及三维动画等其它人脸相关问题的前提和突破口。近些年来,深度学习方法由于其自动学习及持续学习能力,已被成功应用...
  • 关键路径求法

    万次阅读 多人点赞 2018-03-26 13:15:05
    关键路径概念: 在无回路的有向网络中,假设只有一个入度为0的顶点(称为源点)和一个出度为0的顶点(称为汇点),则从源点到汇点之间的最长的路径称为关键路径。AOE网: 无回路有向网络可以用来表示一个包含多项活动的...
  • 关键路径C++

    2012-10-05 10:30:32
    (1) 求关键路径必须在拓扑排序的前提下进行,有环图不能求关键路径; (2) 只有缩短关键活动的工期才有可能缩短工期; (3) 若一个关键活动不在所有的关键路径上,减少它并不能减少工期; (4) 只有在不改变...
  • 总浮动时间:指在不延误总工期的前提下,活动的机动时间。活动的总浮动时间等于该活动最迟完成时间与最早完成时间之差,或该活动最迟开始时间与最早开始时间之差。自由浮动时间:是指在不延误任一紧后活动最早开始...
  • 关键路径详细原理

    千次阅读 2018-07-18 20:30:21
     关键路径,顾名思义,就是一个程序中最关键的路径,它关系到整个程序的时间进度,而关键二字指临界点。 我们需要引进两个概念,AOE和AOV网。 二、AOE和AOV网  AOE和AOV网都是一个大型程序的示意图。而AOV关注...
  • 关键路径(完整实例及C语言完整代码实现)

    千次阅读 多人点赞 2020-08-15 18:36:26
    在得知以上四种统计数据后,就可以直接求得 AOE 网中关键路径上的所有的关键活动,方法是:对于所有的边来说,如果它的最早开始时间等于最晚开始时间,称这条边所代表的活动为关键活动。由关键活动构成的路径为关键...
  • 【数据结构】AOE网——关键路径

    千次阅读 2021-05-16 10:01:48
    在AOE网中,从源点到汇点最长的路径称为关键路径,在关键路径上的活动称为关键活动。 因为AOE网中的活动是可以并行进行的,所以整个工程的时间开销,其实是最长路径的时间开销。即关键路径制约整个工程的工期。 &...
  • 本文着重研究了基于Hadoop平台大数据的分析技术的发展和功能模块的应用,对关键技术进行比较分析,将整体结构框架进行改良,使数据分析平台在不受场景限制的前提下进行使用。
  • 数据结构之——关键路径

    千次阅读 2020-06-06 23:07:57
    (2)事件vk的最迟发生时间vl(k) 它是指在不推迟整个整个工程完成的前提下,即保证它所指向的事件vi在ve(i)时刻能够发生时,该事件最迟必须发生的时间。可用下面的递推公式来计算: vl(汇点) = ve(汇点) vl(j) = ...
  • 构造PERT图,需要明确四个概念:事件、活动、松弛时间和关键路线。 事件(Events)表示主要活动结束的那一点; 活动(Activities)表示从一个事件到另一个事件之间的过程; 松弛时间(slac...
  • 1.关键路径(Critical Path)从起点到终点的花费时间最长的一条为关键路径。 注意:在关键路径上的任务的松弛时间为0 ●最早开始时间:在关键路径上,从开始到该任务的最早执行的时间 ●最晚开始时间:关键...
  • 最全详解关键路径法

    万次阅读 多人点赞 2019-10-24 13:01:38
    关键路径法是软考的知识点,我分析了常见的模棱两可的知识点,并进行了图解说明,现在分享给正在准备参加软考试的广大考友。 01什么是关键路径法CPM? 关键路径法用于在进度模型中估算项目最短工期,确定逻辑网络...
  • 图之查找关键路径(python)实现

    千次阅读 2020-11-20 23:46:20
    与AOV-网对应的是AOE-网(Activity on Edge)即便表示活动的网。AOE网是一个带权的有向...)路径长度最长的路径叫做关键路径。 求关键路径的算法: (1)输入e条弧(j,k),建立AOE网; (2)从源点v0v_0v0​出发,令v
  • 关键路径算法

    万次阅读 多人点赞 2016-10-12 12:17:08
    这两个递推公式的计算必须分别在拓扑有序和逆拓扑有序的前提先进行。也就是说,ve(j-1)必须在vj的所有前驱的最早发生时间求得之后才能确定,而vl(j-1)必须在Vj的所有后继的最迟发生时间求得之后才能确定。因此可以在...
  • 【笔记】AOE网与关键路径

    万次阅读 多人点赞 2017-12-02 01:06:32
    AOE网 关键路径 求关键路径的算法实现
  • 上周不少粉丝留言询问如何确定所在单位的系统是否属于关键信息基础设施,e小安马不停蹄地整理相关干货,希望对大家有所帮助。而且就在今天,公安部网络安全保卫局总工程师郭启全在2018ISC互联网安全大会上透露,由...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 254,279
精华内容 101,711
关键字:

关键前提