精华内容
下载资源
问答
  • 主动形状模型

    2012-07-11 11:19:35
    主动形状模型 人脸特征定位 主动形状模型 人脸特征定位 主动形状模型 人脸特征定位
  • 开发形状模型的框架。 对齐是在排除的情况下执行的对于 0.05 水平的异常值SVD 分解基于 Drik Jan Kroon 之前的工作文件和使用 “SSMbuilder.m” 构建形状模型的主文件“plotshapemode.m” 绘制特定形状向量 +3 SD ,...
  • 基于活动形状模型的舌头形状合成
  • 比如我要往模型的胸部丢一个鸡蛋,然后鸡蛋碎了,在胸部炸开一个鸡蛋,留下一点东西,然后改变胸部的模型样子
  • 花朵形状吊灯3D模型

    2021-07-31 14:55:55
    花朵形状吊灯3D模型适用于灯具模型设计
  • 隐式形状模型

    千次阅读 2016-04-14 18:05:56
    在这次我们将学会隐式形状模型算法通过pcl::ism::ImplicitShapeModel这个类来实现。这个算法是把Hough转换和特征近似包进行结合。有训练集,这个算法将计算一个确定的模型用来预测一个物体的中心。 这个算法由两...

    在这次我们将学会隐式形状模型算法通过pcl::ism::ImplicitShapeModel这个类来实现。这个算法是把Hough转换和特征近似包进行结合。有训练集,这个算法将计算一个确定的模型用来预测一个物体的中心。

    这个算法由两部分组成,第一部分是训练,第二部分是物体识别。它有以下6步:

    1.先发现特征点。这只是一个训练点云的简化。在这个步骤里面所有的点云都将被简化,通过体元栅格这个途径。余下来的点就是特征点。

    2.对特征点用FPFH进行预测。

    3.通过k-means这个算法进行聚类。

    4.计算每一个实例里面的对中心的方向。

    5.对每一个视觉信息,数学权重将会被计算。

    6.每一个特征点的权重将会被计算。

    我们在训练的过程结束以后,接下来就是对象搜索的进程。

    1.特征点检测。

    2.每个点云特征点的特征检测。

    3.对于每个特征搜索最近的视觉信息。

    4.对于每一个特征:

    对于每一个实例:

         对相应的方向进行决策。

    5.前面的步骤给了我们一个方向集用来预测中心与能量。

    上面的步骤很多涉及机器学习之类的,大致明白那个过程即可

    代码部分:

    第一步我们需要点云的训练集。在下面是一些可以用的训练集.

    Cat (train)

    Horse (train)

              Lioness (train)

              Michael (train)

    Wolf (train)

    用来检测的点云:

                           Cat

                           Horse

                            Lioness

                            Michael

                             Wolf

     

    下面是代码

    #include <iostream>
    #include <pcl/io/pcd_io.h>
    #include <pcl/features/normal_3d.h>
    #include <pcl/features/feature.h>
    #include <pcl/visualization/cloud_viewer.h>
    #include <pcl/features/fpfh.h>
    #include <pcl/features/impl/fpfh.hpp>
    #include <pcl/recognition/implicit_shape_model.h>
    #include <pcl/recognition/impl/implicit_shape_model.hpp>
    
    int
    main (int argc, char** argv)
    {
      if (argc == 0 || argc % 2 == 0)
        return (-1);
    
      unsigned int number_of_training_clouds = (argc - 3) / 2;
    
      pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normal_estimator;
      normal_estimator.setRadiusSearch (25.0);
    
      std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> training_clouds;
      std::vector<pcl::PointCloud<pcl::Normal>::Ptr> training_normals;
      std::vector<unsigned int> training_classes;
    
      for (unsigned int i_cloud = 0; i_cloud < number_of_training_clouds - 1; i_cloud++)
      {
        pcl::PointCloud<pcl::PointXYZ>::Ptr tr_cloud(new pcl::PointCloud<pcl::PointXYZ> ());
        if ( pcl::io::loadPCDFile <pcl::PointXYZ> (argv[i_cloud * 2 + 1], *tr_cloud) == -1 )
          return (-1);
    
        pcl::PointCloud<pcl::Normal>::Ptr tr_normals = (new pcl::PointCloud<pcl::Normal>)->makeShared ();
        normal_estimator.setInputCloud (tr_cloud);
        normal_estimator.compute (*tr_normals);
    
        unsigned int tr_class = static_cast<unsigned int> (strtol (argv[i_cloud * 2 + 2], 0, 10));
    
        training_clouds.push_back (tr_cloud);
        training_normals.push_back (tr_normals);
        training_classes.push_back (tr_class);
      }
    
      pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::Histogram<153> >::Ptr fpfh
        (new pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::Histogram<153> >);
      fpfh->setRadiusSearch (30.0);
      pcl::Feature< pcl::PointXYZ, pcl::Histogram<153> >::Ptr feature_estimator(fpfh);
    
      pcl::ism::ImplicitShapeModelEstimation<153, pcl::PointXYZ, pcl::Normal> ism;
      ism.setFeatureEstimator(feature_estimator);
      ism.setTrainingClouds (training_clouds);
      ism.setTrainingNormals (training_normals);
      ism.setTrainingClasses (training_classes);
      ism.setSamplingSize (2.0f);
    
      pcl::ism::ImplicitShapeModelEstimation<153, pcl::PointXYZ, pcl::Normal>::ISMModelPtr model = boost::shared_ptr<pcl::features::ISMModel>
        (new pcl::features::ISMModel);
      ism.trainISM (model);
    
      std::string file ("trained_ism_model.txt");
      model->saveModelToFile (file);
    
      model->loadModelFromfile (file);
    
      unsigned int testing_class = static_cast<unsigned int> (strtol (argv[argc - 1], 0, 10));
      pcl::PointCloud<pcl::PointXYZ>::Ptr testing_cloud (new pcl::PointCloud<pcl::PointXYZ> ());
      if ( pcl::io::loadPCDFile <pcl::PointXYZ> (argv[argc - 2], *testing_cloud) == -1 )
        return (-1);
    
      pcl::PointCloud<pcl::Normal>::Ptr testing_normals = (new pcl::PointCloud<pcl::Normal>)->makeShared ();
      normal_estimator.setInputCloud (testing_cloud);
      normal_estimator.compute (*testing_normals);
    
      boost::shared_ptr<pcl::features::ISMVoteList<pcl::PointXYZ> > vote_list = ism.findObjects (
        model,
        testing_cloud,
        testing_normals,
        testing_class);
    
      double radius = model->sigmas_[testing_class] * 10.0;
      double sigma = model->sigmas_[testing_class];
      std::vector<pcl::ISMPeak, Eigen::aligned_allocator<pcl::ISMPeak> > strongest_peaks;
      vote_list->findStrongestPeaks (strongest_peaks, testing_class, radius, sigma);
    
      pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = (new pcl::PointCloud<pcl::PointXYZRGB>)->makeShared ();
      colored_cloud->height = 0;
      colored_cloud->width = 1;
    
      pcl::PointXYZRGB point;
      point.r = 255;
      point.g = 255;
      point.b = 255;
    
      for (size_t i_point = 0; i_point < testing_cloud->points.size (); i_point++)
      {
        point.x = testing_cloud->points[i_point].x;
        point.y = testing_cloud->points[i_point].y;
        point.z = testing_cloud->points[i_point].z;
        colored_cloud->points.push_back (point);
      }
      colored_cloud->height += testing_cloud->points.size ();
    
      point.r = 255;
      point.g = 0;
      point.b = 0;
      for (size_t i_vote = 0; i_vote < strongest_peaks.size (); i_vote++)
      {
        point.x = strongest_peaks[i_vote].x;
        point.y = strongest_peaks[i_vote].y;
        point.z = strongest_peaks[i_vote].z;
        colored_cloud->points.push_back (point);
      }
      colored_cloud->height += strongest_peaks.size ();
    
      pcl::visualization::CloudViewer viewer ("Result viewer");
      viewer.showCloud (colored_cloud);
      while (!viewer.wasStopped ())
      {
      }
    
      return (0);
    }

    1.首先加载用于训练的点云

      for (unsigned int i_cloud = 0; i_cloud < number_of_training_clouds - 1; i_cloud++)
      {
        pcl::PointCloud<pcl::PointXYZ>::Ptr tr_cloud(new pcl::PointCloud<pcl::PointXYZ> ());
        if ( pcl::io::loadPCDFile <pcl::PointXYZ> (argv[i_cloud * 2 + 1], *tr_cloud) == -1 )
          return (-1);
    
        pcl::PointCloud<pcl::Normal>::Ptr tr_normals = (new pcl::PointCloud<pcl::Normal>)->makeShared ();
        normal_estimator.setInputCloud (tr_cloud);
        normal_estimator.compute (*tr_normals);
    
        unsigned int tr_class = static_cast<unsigned int> (strtol (argv[i_cloud * 2 + 2], 0, 10));
    
        training_clouds.push_back (tr_cloud);
        training_normals.push_back (tr_normals);
        training_classes.push_back (tr_class);
      }

    2.创建特征评估器的实例。

     pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::Histogram<153> >::Ptr fpfh
        (new pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::Histogram<153> >);
      fpfh->setRadiusSearch (30.0);
      pcl::Feature< pcl::PointXYZ, pcl::Histogram<153> >::Ptr feature_estimator(fpfh);

    3.创建pcl::ism::ImplicitShapeModeEstimation的实例。

      ism.setFeatureEstimator(feature_estimator);
      ism.setTrainingClouds (training_clouds);
      ism.setTrainingNormals (training_normals);
      ism.setTrainingClasses (training_classes);
      ism.setSamplingSize (2.0f);

    4.这个实例将输入训练集和特征预估器

    pcl::ism::ImplicitShapeModelEstimation<153, pcl::PointXYZ, pcl::Normal>::ISMModelPtr model = boost::shared_ptr<pcl::features::ISMModel>
        (new pcl::features::ISMModel);
      ism.trainISM (model);

    上面这些将简化训练过程的启动

    5.把训练模型存到文件里面为了使代码复用

      std::string file ("trained_ism_model.txt");
      model->saveModelToFile (file);

    6.从文件里面加载模型。

    model->loadModelFromfile (file);

    7.分类操作的点云和法线也需要训练的过程。

      unsigned int testing_class = static_cast<unsigned int> (strtol (argv[argc - 1], 0, 10));
      pcl::PointCloud<pcl::PointXYZ>::Ptr testing_cloud (new pcl::PointCloud<pcl::PointXYZ> ());
      if ( pcl::io::loadPCDFile <pcl::PointXYZ> (argv[argc - 2], *testing_cloud) == -1 )
        return (-1);
    
      pcl::PointCloud<pcl::Normal>::Ptr testing_normals = (new pcl::PointCloud<pcl::Normal>)->makeShared ();
      normal_estimator.setInputCloud (testing_cloud);
      normal_estimator.compute (*testing_normals);

    8.启动分类的进程。代码将会告诉算法去找testing_class类型的物体,在给定的testing_cloud这个点云里面。注意算法将会使用任何你放进去进行训练的模型。在分类操作以后,一列的决策将会以pcl::ism::ISMVoteList这个形式返回。

      double radius = model->sigmas_[testing_class] * 10.0;
      double sigma = model->sigmas_[testing_class];
      std::vector<pcl::ISMPeak, Eigen::aligned_allocator<pcl::ISMPeak> > strongest_peaks;
      vote_list->findStrongestPeaks (strongest_peaks, testing_class, radius, sigma);

    上面的代码将会找到决策里面的最好的峰值。

    运行下面的代码

    ./implicit_shape_model
          ism_train_cat.pcd      0
          ism_train_horse.pcd    1
          ism_train_lioness.pcd  2
          ism_train_michael.pcd  3
          ism_train_wolf.pcd     4
          ism_test_cat.pcd       0

    最后的参数是你要检测的点云和你感兴趣的类别。(比如猫)

    ~接下去你会看到

     

    红点表示物体的中心。

    如果你想要可视化决策的过程,你就会看到如下的东西。蓝色是决策点

     

     

    展开全文
  • ASM主动形状模型

    千次阅读 2014-04-24 09:06:58
    主动形状模型(Active Shape Models,ASM)是基于统计学习模型的特征点提取方法。 训练阶段--建立模型 1.选择合适的特征点(人工标定) 标定特征点时着重关注以下几点:边缘点、曲率大的、T型连接点和以上这些点的...

    主动形状模型(Active Shape Models,ASM)是基于统计学习模型的特征点提取方法。


    训练阶段--建立模型


    1.选择合适的特征点(人工标定

    标定特征点时着重关注以下几点:边缘点、曲率大的、T型连接点和以上这些点的连线上的等分点。(如下图)


    记录好这些特征点的顺序,以便于后面确定图形的边界和连线等等。这样得到一组特征点集 

    把特征点集看做是一个2n维的向量,这样每一幅人脸可以用一个2n维的形状向量表示,记为


    人工标定400张人脸图像(训练样本),每一幅人脸图像的特征点用形状向量表示。


    2.求每个特征点的轮廓向量(训练集)

    • 将某个标定的特征点与其相邻的两个标定特征点分别连线,取这两条连线的角平分线;
    • 在角平分线上以该特征点为中心,两边各取一定数量的像素形成灰度向量
    • 对灰度向量求梯度并做大小归一化就得到该特征点处的轮廓向量,如下图所示


    令训练样本中第i幅图像的轮廓向量为,某个特征点的平均轮廓向量为:

                   

    某个特征点的轮廓向量的协方差矩阵为:

                  

                               N为样本的个数(400)。

    注:某个特征点的平均轮廓向量,是对每个样本相应位置特征点的轮廓向量求平均!

    比如,第一个特征点的平均轮廓向量,是所有训练样本标定的第一个特征点的轮廓向量的平均。


    3.求训练样本的投影矩阵

    为第i个样本的形状向量,根据主成分分析(PCA)方法计算出形状向量的投影矩阵


    测试阶段--新来一幅图像怎么自动找特征点?


    首先对人脸图像进行人脸检测,获取人脸区域。

    然后对人脸形状模型中的平均人脸形状根据人脸区域进行放缩、平移得到初始人脸形状,如下图所示:


    局部调整:

    • 对于当前人脸形状的每一个特征点,以该特征点为中心,在与其相邻的两个特征点连线的角平分线上,两边各取一定数量的像素作为调整范围;
    • 对于调整范围内的每一个像素点,以其为中心,按照和训练阶段一样的方法获取轮廓向量 ;
    • 此时调整范围中的每个像素都对应一个轮廓向量,根据马氏距离,求与距离最短的像素,该像素点即为局部调整的结果。

    马氏距离:

    记:所有特征点局部调整后的形状向量为

    全局调整: (全局调整暂时没弄明白!)

    仿射变换:






    展开全文
  • Computer Vision Models,Learning and Inference17章形状模型翻译。形状及表示,snake模型,形状模板,统计形状模型,子空间形状模型,三维形状模型,形状和外观的统计模型,非高斯统计形状模型,铰接式模型,应用
  • 主动形状模型的理解

    千次阅读 2018-03-31 14:31:58
    主动形状模型

    捋了捋,将自己对主动形状模型(Active Shape Model)的理解从下面这三个方面介绍

    建模

    首先是ASM的建模部分,建模部分较繁琐,我又从下面俩方面介绍

    点分布模型

    ASM是在点分布模型(Point DIstribution Model)的基础上继承发展而来,点分布模型是这样定义的:对于一些外形相似的物体,比如人脸,手,心脏等几何形状的物体通过若干关键特征点的坐标一次串联成一个向量,用该向量来表示这个物体。如图,我们用一系列的点描述出手部的形状。用这个形状向量来表示这个手。同理,对于右边的人脸 我们也可以用一系列特征点标示出人脸的大致轮廓,借此向量来表示人脸。
    PDM特征点表示

    那么我们如何选择合适的额标定点呢?
    根据Tim中原论文给出建议,一般选择在高曲率处和T型连接处,如在手部中的指尖处和俩个手指间隙,在选定这些明显的点后,那么剩下的点可以在这些点之间等距选取。

    我们在标记按上面规则再细分标志点为三类:

    1. 标记点描述部分对某种应用有意义,如眼 睛的中心或边界的尖角。
    2. 与应用无关的标记点,如物体在某方向上的最高点。
    3. 在1、2类标记点之间等距插入点

    重要的:如果我们标记多幅图片,那么每幅图片的标记点顺序都应该一样

    在ASM中形状的定义:是指某个物体所有的几何信息,这种信息在滤除了位置、尺度大小以及旋转等因素的影响之后是保持不变。
    如下图是在欧几里得转换下的四个相同的形状:
    形状的定义

    对齐形状

    对齐操作的目的是为了滤除位置偏移、尺度大小以及旋转所带来的影响。主要是用普式分析法(Procrustes Analysics)操作对齐。

    1. 训练集中所有的人脸对齐到第一个人脸特征形状向量
    2. 计算平均人脸形状向量 x¯¯¯=1nni=1xi x ¯ = 1 n ∑ i = 1 n x i
    3. 再将所有的人脸形状向量对齐到平均向量 x¯¯¯ x ¯
    4. 重复2、3直到收敛

    以俩个形状间的对齐为例,当通过普式分析法使俩者间的普式距离最小时,就说俩个形状2已经与形状1对齐。具体公式如下:
    普式分析法

    通过调整旋转角度,缩放尺度,位移距离使与俩个形状之间的普氏距离最小,所以要计算旋转角度,缩放尺度,位移距离三个参数。
    W是每个标记点的权值对角矩阵,权重大小取决于标记点的稳定性,稳定性指的是在不同形状中一个点相对于其他点距离变化的大小。距离变化越小,稳定性就越强,权值越大;如果距离变化越大,越不稳定,对应的权值越小。
    权值矩阵

    计算标记点的权值,如计算 k k 点权值,首先计算在同一形状中点l与点L间的距离 Rkl R k l , VRkl V R k l 表示整个训练集中不同图像间 Rkl R k l 的方差。
    利用公式能求的旋转角度 θ θ ,尺度大小  s   s 以及位移  t   t 的值。

    形状统计分析

    对齐算法剔除了形状间因角度、尺度和位移等因素带来的差异,剩下的是形状本身固有的差别。统计分析阶段主要是分析这种形状间的变化,建立形状模型。
    因为每个样本是一个 2n 2 n 维向量表示,则可以将每个样本看做 2n 2 n 维空间内的一个点。当样本数增多时,在 2n 2 n 维空间内计算显得尤为复杂。可以采用PCA降维。提取形状变化的主相关和规律。
    P P λ分别表示矩阵 S S 的特征向量和特征值k=1,2,2n λt λ t 为特征值总和
    取前 t t 个特征向量,将形状向量由2n维降到t维。
    在此范围内改变 b b 会得到不同的形状。

    搜索

    建模结束后,便利用生成的形状模型在图像中定位和匹配目标轮廓。

    1. 使模型尽可能靠近目标轮廓,实现模型的初始定位。
    2. 初始定位结束后,在一个迭代过程中搜索各个标记点的最佳匹配位置,然后在形状约束条件下调整形状参数,使模型尽可能与目标轮廓吻合。

    搜索流程

    1. 以得到的模型X在新图像上搜索,找到新图像上 X X 中每个点的位置。
    2. 更新xtytsθb,找到最佳匹配位置。

      • 确保 b b <script type="math/tex" id="MathJax-Element-25">b</script>在合适范围内更新。
      • 重复直到收敛。
      • 匹配

        匹配模型有俩种方法,公式有点多,我就直接从做好的ppt中截图了。

        局部灰度模型

        一般采用每个标志点的局部灰度模型来进行匹配。局部灰度模型是通过局部特征点建立起来的局部特征,通过比较新位置与原来特征点位置的马氏距离,找到每个特征点该移动的位置。
        局部灰度模型

        具体实施过程如下图,对每个样本重复这个过程,对每个标记点都会得到一个灰度模型。
        具体过程

        更新模型参数:
        更新模型参数

        更新过程

        更新结果

        多分辨率搜索策略

        在搜索标志点最佳匹配位置的过程中,搜索路径的长度是影响搜索结果的重要因素,一方面,搜索路径须足够长,才能保证目标点在搜索的范围内;另一方面,希望搜索路径尽可能的短以减少计算量,同时如果模型靠近目标轮廓,而搜索路径过长会导致搜索越过目标延伸到较远的地方,错过邻近的正确目标点。这两个互相矛盾的要求,可以通过多分辨搜索来满足。

        1. 首先获得同一图像的不同分辨率等级,搜索先在较低分辨率图像上进行,然后用先前的输出在较高分辨率图像上继续搜索,重复这个过程直至到原始图像上。
        2. 为获得多分辨率图像,采用5 × 5的高斯核对分辨率较高的图像进行平滑处理,并按每两个像素取一个的采样方法获得分辨率较低的图像。对得到的 n 层图像金字塔,将原始图像定义为 Level 0,经过一次平滑和采样得到的图像定义为 Level 1,其长宽尺寸均为 Level 0 的 1/2。以此类推,得到更高的 Level 2、Level 3、…、Level n。

          下面是一个简图
          搜索简图

        后记

        以上是ASM的大体过程,与ASM相似的算法相似的还有主动外观模型(Active Apperance Model),因为ASM只利用位置信息,AAM在此基础上加入了纹理信息。也相对比ASM复杂一点。
        ASM算法在人脸识别,特征点跟踪方面有较广泛的应用,提出的时间很早了,当初也是基于人脸特征点定位找的,现在来看有点老了,现在的paper动不动就是深度学习搞一波,唉,当初还是短视了,先mark一下吧。

        相关资料

        ASM算法介绍
        主动形状模型(ASM)和主动外观模型(AAM)资源汇总
        人脸器官精确定位/人脸特征点的跟踪(经典方法:ASM,活动形状模型)
        人脸特征点定位——ASM和AAM算法
        几种关于ASM & AAM 模型代码实现的对比
        Active Shape Models —Their Training and Application对作者论文比较详解
        opencv中文网站上关于AAM的资源

    展开全文
  • 主动形状模型(ASM)

    2011-04-27 20:29:13
    主动形状模型是一种较为成熟的人脸特征点定位方法。它用局部纹理模型在特征点周围进行局部搜索,用全局统计模型约束特征点集组成的形状,二者反复迭代,最终收敛至最优形状。
  • 详细介绍了主动形状模型方法的建模,及搜索方法,可在多个领域使用
  • 形状模型分割中形状对齐GPU加速的OpenCL实现.pdf
  • 低阶形状变形模型对退化变形的非刚动运动
  • 一种基于遗传算法的明暗恢复形状重构模型光顺方法,王浩臣,王军,针对SFS重构曲面光顺性差的问题,提出基于遗传算法的明暗恢复形状重构模型光顺方法。首先,利用SFS方法获取曲面的三维点云数据;再
  • 针对海量、异构、 复杂的三维模型高效形状分析需求,提出基于最优最小生成树的三维模型形状优化方法。首先基于三维模型最小生成树(3D-MST)构造模型的结构描述;其次通过拓扑结构与几何形状检测并结合双边滤波与熵权...
  • 基于特征词及形状模型的图像类别学习
  • 用于Unity3D的各种形状模型,包括棱柱体,半圆柱体,给你的游戏各种想象的空间
  • 针对面向唇读的水平集模型在嘴唇分割中存在边界过收敛和过早收敛的问题,文中提出了一种改进的基于先验知识的水平集模型(简称为PS-LevelSet)来进行嘴唇几何形状的定位。PS-LevelSet模型利用改进的差值能量函数引入...
  • 老外编写的主动形状模型代码matlab实现
  • ——简介—— 脸部建模一直是计算机图像和视觉领域的热门话题,每个人脸模型的网格顶点个数各不相同,也就是拓扑结构不同。...近来,级联形状回归模型在特征点定位任务上取得了重大突破,该方法使用回归模型,直...

    ——简介——
    脸部建模一直是计算机图像和视觉领域的热门话题,每个人脸模型的网格顶点个数各不相同,也就是拓扑结构不同。因此我们需要对我们的训练数据,做一个归一化处理。这里以世纪晟科技构建的一个快速的、交互的、基于深度学习的人脸建模框架为基础,展示级联形状回归模型在特征点定位任务上取得了重大突破。

    ——级联线性回归模型——

    近来,级联形状回归模型在特征点定位任务上取得了重大突破,该方法使用回归模型,直接学习从人脸表观到人脸形状(或者人脸形状模型的参数)的映射函数,进而建立从表观到形状的对应关系。

    面部特征点定位问题可以看作是学习一个回归函数F,以图象I作为输入,输出θ为特征点的位置(人脸形状):θ = F(I)

    简单的说,级联回归模型可以统一为以下框架:学习多个回归函数{f1 ,…, fn-1, fn}来逼近函数F:
    θ = F(I)= fn (fn-1 (…f1(θ0, I) ,I) , I)
    θi= fi (θi-1, I), i=1,…,n

    所谓的级联,即当前函数fi的输入依赖于上一级函数fi-1的输出θi-1,而每一个fi的学习目标都是逼近特征点的真实位置θ,θ0为初始形状。通常情况,fi不是直接回归真实位置θ,而回归当前形状θi-1与真实位置θ之间的差:Δθi = θ - θi-1

    ——典型的形状回归方法——

    如下图所示,给定初始形状θ0,通常为平均形状,根据初始形状θ0提取特征(两个像素点的差值)作为函数f1的输入。每个函数fi建模成Random Fern回归器,来预测当前形状θi-1与目标形状θ的差Δθi,并根据ΔӪi预测结果更新当前形状得θ i = θi-1+ΔӪi,作为下一级函数fi+1的输入。
    在这里插入图片描述
    ——级联形状回归模型成功的关键——

    1. 使用了形状相关特征,即函数fi的输入和当前的人脸形状θi-1紧密相关;
    2. 函数fi的目标也与当前的人脸形状θi-1相关,即fi的优化目标为当前形状θi-1与真实位置θ之间的差Δθi

    以上基于级联形状回归的世纪晟人脸识别实现方法对于大姿态(左右旋转-60°~+60°)、各种表情变化都能得到较好的定位结果,处理速度快,具备很好的产品应用前景。

    ——总结——

    以上主要讲解了级联形状回归模型在特征点定位任务上取得了重大突破,该方法使用回归模型,直接学习从人脸表观到人脸形状(或者人脸形状模型的参数)的映射函数,进而建立从表观到形状的对应关系。深度学习为人脸识别技术领域带来了巨大的飞跃,结合形状回归框架可以进一步提升定位模型的精度,成为当前特征定位的主流方法之一。

    展开全文
  • 基于三维统计形状模型的肝脏分割
  • 这是 Cootes 和 Taylor 引入的基本主动形状模型 (ASM) 和主动外观模型 (AAM) 的示例,具有多分辨率方法、彩色图像支持和改进的边缘查找方法的 2D 和 3D。 对于生物医学对象的自动分割和识别非常有用。 . ASM 基本...
  • 针对煤矿井下光照变化较大、矿工脸部受污染及遮挡等情况下主动形状模型(ASM)应用于井下人脸跟踪精度低的问题,提出了一种改进ASM。首先选用专用的训练样本集,通过定义镜像图像形成镜像样本集,然后对镜像样本集进行...
  • 我们在端点重叠模型中计算质子Pauli形状因子F2的动量传递依赖性。 我们发现该模型正确地再现了在杰斐逊实验室观察到的F2与Dirac形状因子F1的比例关系。 该计算使用了夸克光锥波函数的超前功率,超前扭曲Dirac结构...
  • 基于主动形状模型的人脸特征提取的研究,资料~
  • 主动形状模型的Matlab实现代码,可以直接运行,代码的条理清晰,有助于入门学习!
  • 针对三维模型检索中的形状特征提取问题,提出利用三维模型自身形状变化信息...该方法与三维模型的旋转、平移无关,同时不依赖于模型的点云分布,并且精简模型三角面片对算法的影响较。实验结果验证了该方法的有效性。
  • 针对模型配准中需要预配准操作的问题, 提出了一种基于几何形状描述的模型配准方法。首先利用一种基于距离场的几何形状描述方法从预配准模型中获取特征点并建立对应关系, 即构造预配准模型间的特征点对; 之后, 以特征...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,559
精华内容 47,423
关键字:

形状小模型