精华内容
下载资源
问答
  • 关键点检测是计算机视觉中比较重要的任务之一,当前主流的算法可总结如下: 1、基于coordinate 即将卷积神经网络(CNN)的特征通过一个全连接层来回归关键点的坐标和对应的置信度信息,在对卷积特征的利用上, ...

        关键点检测是计算机视觉中比较重要的任务之一,当前主流的算法可总结如下:

        1、基于coordinate 

            即将卷积神经网络(CNN)的特征通过一个全连接层来回归关键点的坐标和对应的置信度信息,在对卷积

    特征的利用上,逐渐由单层特征到金字塔特征转换,有代表性的算法为人脸关键点检测的PFLD算法,全称为:

    PFLD:A Practical Facial Landmark Detector

         2、基于heatmap

            顾名思义,其核心思想是将输出的特征层利用卷积来得到各个关键点的置信度,即,每个通道代表了某个

    关键点在输入图片上各个位置的置信度,随后在每个通道上取置信度最大值和对应位置即可;heatmap的生成

    方式较多样,如使用高斯分布将距离关键点中心远的位置设置低点,呈现出辐射状。

        3、基于heatmap + offset

            该方法与2中所述方法相似,仅在回归时加入了坐标偏移量,使用这一方式可以将网络输出特征图下采样至

    更小尺度,比较典型的算法为《Towards Accurate Multi-person Pose Estimation in the Wild》,其在设计

    ground truth时,使用了多对一的方式,即将某一点作为中心点,半径R范围内的点用来回归该点。

     

      上述方法主要介绍了关键点检测的一些发展放向,当下关键点检测与目标框检测的任务融合是一种主流发展方

    向。

     

    展开全文
  • 人脸关键点检测算法--MTCNN

    千次阅读 2019-05-29 09:28:24
    本文是对MTCNN进行人脸关键点检测和对齐的原理的描述,具体代码请见:https://github.com/Emma0118/preprocessing-images-for-Face-Recognition 一、概述 MTCNN(Multi-task Cascaded Convolutional Networks)是 一...

    本文是对MTCNN进行人脸关键点检测和对齐的原理的描述,具体代码请见:https://github.com/Emma0118/preprocessing-images-for-Face-Recognition

    一、概述

    MTCNN(Multi-task Cascaded Convolutional Networks)是 一种多任务级联卷积神经网络,用以同时处理人脸检测和人脸关键点定位问题。作者认为人脸检测和人脸关键点检测两个任务之间往往存在着潜在的联系,然而大多数方法都未将两个任务有效的结合起来,MTCNN充分利用两任务之间潜在的联系,将人脸检测和人脸关键点检测同时进行,可以实现人脸检测和5个特征点的标定。

    目前人脸检测大体分为两个阶段:找出所有可能是人脸的候选区域,从候选区域中选择出最可能是人脸的区域。

    MTCNN为了解决人脸识别的两阶段问题,提出三个级联的多任务卷积神经网络(Proposal Network (P-Net)、Refine Network (R-Net)、Output Network (O-Net),每个多任务卷积神经网络均有三个学习任务,分别是人脸分类、边框回归和关键点定位。每一级的输出作为下一级的输入。

    二、算法主体流程

    1.Image Pyramid(图像金字塔):

    MTCNN使用了“Image Pyramid(图像金字塔)”方法,解决不同尺度的人脸的检测。通过把原图按照一定的比例(如0.5),多次等比缩放得到多尺度的图片。

    • 由于MTCNN下一阶段使用的P-Net是基于12x12的图片训练出来的,所以MTCNN在本阶段将缩放图片,直至最小边小于或者等于12,由此生成具有不同尺度的图片金字塔。
    • 具体实现:先把原图等比缩放`12/minsize`,再按缩放因子`factor`(例如0.5)用上一次的缩放结果不断缩放,直至最短边小于或等于12。(code from detector.py)
    # scales for scaling the image
    scales = []
     
    # scales the image so that
    # minimum size that we can detect equals to
    # minimum face size that we want to detect
    m = min_detection_size/min_face_size
    min_length *= m
     
    factor_count = 0
    while min_length > min_detection_size:
        scales.append(m*factor**factor_count)
        min_length *= factor
        factor_count += 1
    • factor(缩放因子):官方使用了0.709,基于面积每次等比缩放1/2,因此没边缩放sqrt(1/2), 约等于 0.709
    • 图片归一化处理,使图片像素分布于[-1, 1]区间内:(x – 127.5)/128

    2.Proposal Network (P-Net):

    该网络结构主要获得了人脸区域的候选窗口和边界框的回归向量。并用该边界框做回归,对候选窗口进行校准,然后通过非极大值抑制(NMS)来合并高度重叠的候选框。

    • 该网络是 Fully Convolutional Network,可以接受任意尺寸的输入。
    • 3次卷积、1次池化、经过全卷积层,输出1*1*2的三维矩阵,每个点对应原始输入的每个12x12区域。
    • 将不同尺寸的金字塔图像输入到p-net中,最终得到包含box位置信息及其置信度和box的回归系数信息

    金字塔图像输入

    with torch.no_grad():
        output = net(img)
        probs = output[1].cpu().data.numpy()[0, 1, :, :]
        offsets = output[0].cpu().data.numpy()
        # probs: probability of a face at each sliding window
        # offsets: transformations to true bounding boxes
    • 生成box,设置阈值为0.6,得到一系列点,影射回原img,以此点为左上角,向右向下各扩展12pixel,得到12*12的矩形框
    • 接下来对一帧图像上检测到的所有12*12矩形框进行nms运算
    • 最后得到的所有box会放置在一个number*9的数组里,number表示box的数量,9代表box的坐标信息、score、坐标回归信息[x1、y1、x2、y2、score、reg_x1reg_y1、reg_x2、reg_y2]

    boxes及NMS操作

    
    boxes = _generate_bboxes(probs, offsets, scale, threshold)
    if len(boxes) == 0:
        return None
    keep = nms(boxes[:, 0:5], overlap_threshold=0.5)

     

    • 对box进行坐标修正,修正过程可表示为

    new_x1   =  x1 +  reg_x1 * width_of_box 

    new_y1 = y1 + reg_y1 * height_of_box

    new_x2 = x2 + reg_x2 * width_of_box

    new_y2 = y2 + reg_y2 * height_of_box

    其中,由于原始窗口和真实窗口的尺寸差异不大,上面等式中reg_x1, reg_x2, reg_y1, reg_y2可以通过线性映射,先做平移,再做变换,学习到。

    窗口对精细调整

    def calibrate_box(bboxes, offsets):
        """Transform bounding boxes to be more like true bounding boxes.
        'offsets' is one of the outputs of the nets.
     
        Arguments:
            bboxes: a float numpy array of shape [n, 5].
            offsets: a float numpy array of shape [n, 4].
     
        Returns:
            a float numpy array of shape [n, 5].
        """
        x1, y1, x2, y2 = [bboxes[:, i] for i in range(4)]
        w = x2 - x1 + 1.0
        h = y2 - y1 + 1.0
        w = np.expand_dims(w, 1)
        h = np.expand_dims(h, 1)
     
        # this is what happening here:
        # tx1, ty1, tx2, ty2 = [offsets[:, i] for i in range(4)]
        # x1_true = x1 + tx1*w
        # y1_true = y1 + ty1*h
        # x2_true = x2 + tx2*w
        # y2_true = y2 + ty2*h
        # below is just more compact form of this
     
        # are offsets always such that
        # x1 < x2 and y1 < y2 ?
     
        translation = np.hstack([w, h, w, h])*offsets
        bboxes[:, 0:4] = bboxes[:, 0:4] + translation
        return bboxes

     

    3.R-Net(refine network)

    主要通过边界框回归和NMS来去掉false-positive区域。将P-Net最后输出的所有box,resize到24*24后输入R-Net。经过R-Net后,输出与P-Net类似,prob1:box坐标信息与置信度与conv5-2的回归系数信息。根据所得的置信度信息与该层阈值对比,小于阈值的直接drop掉,大于阈值的留下,经过nms、再利用回归系数信息进行精修、rec2square、pad。

    stage2

    # STAGE 2
     
    img_boxes = get_image_boxes(bounding_boxes, image, size=24)
    img_boxes = torch.FloatTensor(img_boxes)
     
    output = rnet(img_boxes)
    offsets = output[0].data.numpy()  # shape [n_boxes, 4]
    probs = output[1].data.numpy()  # shape [n_boxes, 2]
     
    keep = np.where(probs[:, 1] > thresholds[1])[0]
    bounding_boxes = bounding_boxes[keep]
    bounding_boxes[:, 4] = probs[keep, 1].reshape((-1,))
    offsets = offsets[keep]
     
    keep = nms(bounding_boxes, nms_thresholds[1])
    bounding_boxes = bounding_boxes[keep]
    bounding_boxes = calibrate_box(bounding_boxes, offsets[keep])
    bounding_boxes = convert_to_square(bounding_boxes)
    bounding_boxes[:, 0:4] = np.round(bounding_boxes[:, 0:4])

     

     相比P-Net, 这个网络多个一个全连接层,会有更好的抑制false-positive的作用。

    preview

    4.O-Net(output network 

    该层比R-Net层又多了一层卷基层,所以处理的结果会更加精细。作用和R-Net层作用一样。但是该层对人脸区域进行了更多的监督,同时还会输出5个地标(landmark)。

     

    • 将R-Net最后输出的所有box,resize到48*48后输入O-Net。经过O-Net后,输出prob1:box坐标信息与置信度、conv6-2的回归系数信息、以及conv6-3的关键点坐标信息。
    • conv6-3是number*10的二维数组,number代表box的数量,10则包含了5个关键点信息的x、y坐标信息:[Rx1,Rx2, Rx3, Rx4, Rx5, Ry1, Ry2, Ry3, Ry4, Ry5],此时的坐标为目标框内部的比例,最后影射回原img得到真实的坐标。
    • 根据prob1置信度信息与该层阈值对比,小于阈值的直接drop掉,大于阈值的留下,再利用回归系数信息进行精修,最后再进行一次nms。
    • 最后,输出一副包含人脸框与人脸关键点的检测图像。

     

    三、算法总结与评价 

    1.MTCNN继承了人脸关键点检测两阶段的特征,准确度高;;

    2.但是由于算法使用图片金字塔,需要多次迭代,耗时较多并且受图片大小影响较大

    3.多任务级联的各级网络都需要对输入进行resize,同样增加了运行耗时。

    References

    1.Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks(https://arxiv.org/ftp/arxiv/papers/1604/1604.02878.pdf)

    2.拒绝调包!且看MTCNN人脸检测推断过程详解!http://www.sfinst.com/?p=1683

    3.深度学习人脸关键点检测方法----综述 https://blog.csdn.net/u011995719/article/details/78890333

    4.Mutiple Human Face Detection And Reconition Using MTCNN And FaceNet   https://www.youtube.com/watch?v=0ShchBW4Ve8

     

    展开全文
  • opencv之SURF算法原理及关键点检测

    万次阅读 多人点赞 2017-04-18 10:51:54
    1.概述在基础篇里面讲模板匹配的时候已经介绍过,图像匹配主要有...SIFT是一种鲁棒性好的尺度不变特征描述方法,但SIFT算法计算数据量大、时间复杂度高、算法耗时长。针对上述缺点许多研究者对SIFT算法做了不同的改进,

    1.概述

    在基础篇里面讲模板匹配的时候已经介绍过,图像匹配主要有基于灰度和基于特征两种方法。基于特征匹配的方法有很多种如:FAST、HARRIS、SIFT、SURF、SUSAN等。其中SIFT算法由D.G.Lowe于1999年提出,2004年完善总结。SIFT是一种鲁棒性好的尺度不变特征描述方法,但SIFT算法计算数据量大、时间复杂度高、算法耗时长。针对上述缺点许多研究者对SIFT算法做了不同的改进,Yanke等人提出用PCA-SIFT方法对特征描述进行数据降维,但在没有任何先验知识的情况下反而增加了计算量;Delpont等人提出用SVD方法进行特征匹配,但匹配过程计算复杂,且不能用于宽基线匹配;Grabner等人用积分图像虽提高了SIFT的计算速度,但是降低了SIFT方法的优越性。
    Herbert Bay等人于2006年提出了SIFT算法的改进算法SURF算法,其性能超过了SIFT算法且能够获得更快的速度。SURF在光照变化和视角变化不变性方面的性能接近SIFT算法,尤其对图像严重模糊和旋转处理得非常好。且标准的SURF算子比SIFT算子快好几倍,SURF算法最大的特征在于采用了harr特征以及积分图像的概念,这大大加快了程序的运行速度。
    SURF算法和SIFT算法在opencv中是一种很高级的算法,opencv提供了SURF算法的API接口。需要说明的是SURF和SIFT算法在OpenCV提供的nonfree中,而且在OpenCV3.x后不再集成到OpenCV发行版中,同意存放到opencv_contrib中,需要去opencv github页面手动下载编译。点击跳转,编译方法网上有很多教程。

    2.Surf原理

    特征点的提取基于尺度空间理论,我们通过检测图像局部极值点来锁定特征点坐标,即局部的最亮点或最暗点。

    2.1构建Hessian矩阵

    SURF算法检测特征点是基于Hessian矩阵实现的,Hessian矩阵是SURF算法的核心。设f(x,y)为二阶可微函数,Hessian矩阵H是函数、偏导数组成如下:
    这里写图片描述
    Hessian矩阵判别式为:
    这里写图片描述
    判别式的值是H矩阵的特征值,可以利用判别式的符号确定是否是极值,若det⁡(H)<0则可判断(x, y)不是局部极值点,若det⁡(H)>0则可判断点(x, y)为局部极值点。
    将上述方法应用到图像中,给出图像中的一个点,其像素可表示为I(x, y),在尺度为σ其Hessian矩阵定义如下:
    这里写图片描述
    式中:L_xx是高斯滤波二阶导这里写图片描述同I=(x,y)卷积的结果,其中这里写图片描述L_xy、L_yy的含义类似。
    空间尺度理论中高斯是最优化的分析方法。Bay等人指出高斯分析需要对图像进行离散化和裁剪,即使使用高斯滤波对图像进行采样也会出现走样的情况。所以可以使用方框滤波来代替高斯滤波,使用积分图像来加快卷积以提高计算速度。
    在原始图像上,使用方框滤波器的效果反映在掩膜版尺寸上。如图所示为9×9方框滤波掩膜版,其中灰色部分掩膜版值为0.对应二阶高斯滤波系数σ=1.2,方框滤波模板同图像卷积运算后的值记分别记为D_xx,D_yy,D_xy。
    这里写图片描述
    为平衡准确值与近似值间的误差引入权值,权值随尺度变化,H矩阵判别式可以表示为:
    这里写图片描述
    由于高斯滤波与近似高斯滤波的差异性,我们用根据公式这里写图片描述计算滤波响应的相对权重系数进一步平衡Hessian矩阵行列式的相对权重,其中|��|��是Frobenius范数,这样就保证了Frobenius范数能够适用于任何尺寸的滤波器模板。在实际应用中,用常量0.9表示其相对权重系数不会对结果产生较大的影响。

    2.2尺度不变性

    为了使图像具有尺度不变性以适应不同的图像中目标尺度的变化,我们需要构建尺度空间进行SURF特征点的提取。图像金字塔是图像多尺度表达的一种方式,为了获取图像在不同尺度下通过Hessian矩阵判别式得到极值点,用类似SIFT的方法构建尺度图像金字塔,将尺度空间分为若干阶(octave),每一阶存储了不同尺寸的方框滤波对输入图像进行滤波后得到的模糊程度不同的图片。但SURF算法中图片大小是一直不变的,只是不同阶中方框滤波模板大小不相同。在每一阶中选择4层的尺度图像,构建参数如图所示:
    这里写图片描述
    灰色底的数字表示方框滤波模板的大小。如果图像尺寸远大于模板大小,还可以继续增加阶数。若模板尺寸为N×N,则该模板对应的尺度为σ=1.2×9/N。通过Hessian矩阵求出个尺度极值后,在3×3×3的立体邻域内进行非极大值比较,若该极值点仍为最大值或最小值,则该极值点为候选特征点,然后在尺度空间和图像空间中进行插值运算,得到稳定的特征点位置及所在的尺度值。

    2.3特征点主方向选取

    SIFT算法选取特征点主方向是采用在特征点领域内统计其梯度直方图,取直方图bin值最大的以及超过最大bin值80%的那些方向作为特征点的主方向。而SURF算法是通过统计特征点领域内的Haar小波特征确定其主方向。
    这里写图片描述
    为保证旋转不变性,以特征点为中心,计算特征点邻域(如半径为6s的圆,s为该点所在尺度)内的点在x,y方向的Haar小波响应,Haar小波边长取4s,这样一个扇形得到了一个值。然后60°扇形以一定间隔进行旋转,将60°范围内的响应相加以形成新的矢量,遍历整个圆形区域,选择最长矢量的方向为该特征点的主方向。

    2.4特征点描述算子

    SURF算法中,以特征点为中心,将坐标轴旋转到主方向以确保旋转不变性。按照主方向选取边长为20s的正方形区域,然后将该区域划分为4×4的子区域,每个子区域计算5s×5s范围内的小波响应。
    这里写图片描述
    相对于主方向的水平、垂直方向的Haar小波响应分别记做d_x 、d_y,同样赋予响应值以权值系数,以增加对集合变换的鲁棒性;之后将每个子区域的响应及其绝对值相加形成这里写图片描述,这样在每个子区域形成四维分量的矢量这里写图片描述,因此对每一个特征点,则形成64维的描述向量,再进行向量的归一化,从而对光照具有一定的鲁棒性。

    3.OpenCV API

    在opencv中可以看到如下定义

    typedef SURF    cv::xfeatures2d::SurfDescriptorExtractor
    
    typedef SURF    cv::xfeatures2d::SurfFeatureDetector
    

    也就是说在我们实际使用中是根据不同的功能分别调用SurfDescriptorExtractor和SurfFeatureDetector两个函数的,同样SIFT算法也有类似定义如下:

    typedef SIFT    cv::xfeatures2d::SiftDescriptorExtractor
    
    typedef SIFT    cv::xfeatures2d::SiftFeatureDetector
    

    有需要使用SIFT算法的同学可以参考下。重点说一下SURF算法的两个函数。
    SURF算法作为一个大类,其继承关系可参照下图:
    这里写图片描述
    其成员函数有很多,如下:

    virtual bool    getExtended () const =0
    
    virtual double  getHessianThreshold () const =0
    
    virtual int     getNOctaveLayers () const =0
    
    virtual int     getNOctaves () const =0
    
    virtual bool    getUpright () const =0
    
    virtual void    setExtended (bool extended)=0
    
    virtual void    setHessianThreshold (double hessianThreshold)=0
    
    virtual void    setNOctaveLayers (int nOctaveLayers)=0
    
    virtual void    setNOctaves (int nOctaves)=0
    
    virtual void    setUpright (bool upright)=0
    

    函数详细含义可以查询OpenCV文档得知。这里介绍一下特征点的检测。
    利用SURF算法进行特征点检测可以使用SurfFeatureDetector及它的子函数detect(位于其父类Feature2D中)来实现检测过程,使用drawKeypoints函数绘制检测到的关键点。
    drawKeypoints

    void cv::drawKeypoints  (   InputArray  image,
                                const std::vector< KeyPoint > &     keypoints,
                                InputOutputArray    outImage,
                                const Scalar &  color = Scalar::all(-1),
                                int     flags = DrawMatchesFlags::DEFAULT 
                            )
    

    image:输入图像
    **keyPoint:**SURF算法检测到的特征点
    outImage:输出图像,其内容取决于第五个参数标识符
    color:绘制特征点颜色,有默认值Scalar::all(-1)
    flags:绘制特征点的特征标识符,有默认值,有如下方式:

    enum    { 
                DEFAULT = 0, //创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点
                DRAW_OVER_OUTIMG = 1,//不创建输出图像矩阵,而是在输出图像上绘制匹配对 
                NOT_DRAW_SINGLE_POINTS = 2, //单点特征点不被绘制 
                DRAW_RICH_KEYPOINTS = 4 //对每一个特征点绘制带大小和方向的关键点图形。
            }
    

    这里有必要说一下KeyPoint()类,是一个为特征点检测而形成的数据结构,用于表示特征点,其类结构如下:

    cv::KeyPoint::KeyPoint  (   Point2f     _pt,
                                float   _size,
                                float   _angle = -1,
                                float   _response = 0,
                                int     _octave = 0,
                                int     _class_id = -1 
                            )   
    

    _pt:特征点坐标
    _size特征点直径
    _angle:特征点方向,范围为[0,360),负值表示不使用
    _response:关键点检测器对于关键点的响应程度,也就是关键点强度
    _octave:特征点所在金字塔的层
    _class_id:用于聚类的id
    函数还有另外一种定义形式如下:

    cv::KeyPoint::KeyPoint  (   float   x,
                                float   y,
                                float   _size,
                                float   _angle = -1,
                                float   _response = 0,
                                int     _octave = 0,
                                int     _class_id = -1 
                            )
    

    4.示例代码

    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/nonfree/nonfree.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
        Mat srcImage = imread("Surf_test_image.jpg");
    
        //判断图像是否读取成功
        if (srcImage.empty())
        {
            cout << "图像加载失败" << endl;
            return -1;
        } 
        else
        {
            cout << "图像加载成功" << endl << endl;
        }
    
        namedWindow("原图像",WINDOW_AUTOSIZE);
        imshow("原图像",srcImage);
    
        Mat imageMid;   //定义滤波后图像
        //GaussianBlur(srcImage,imageMid,Size(9, 9),0,0);       //kernel尺寸为3x3的高斯滤波
        //namedWindow("高斯滤波后图像",WINDOW_AUTOSIZE);
        //imshow("高斯滤波后图像",imageMid);
    
        int minHessian = 700;                           //定义Hessian矩阵阈值特征点检测算子
        SurfFeatureDetector detector(minHessian);       //定义SURF检测器
    
        vector<KeyPoint> keypoints;                     //定义KeyPoint类型的矢量容器vector存储检测到的特征点
        detector.detect(srcImage,keypoints);            //调用detect检测特征点
    
        //绘制检测到的特征点
        Mat dstImage;
        //drawKeypoints(imageMid,keypoints,dstImage,Scalar::all(-1),DrawMatchesFlags::DEFAULT); //高斯滤波后关键点检测
        drawKeypoints(srcImage, keypoints, dstImage, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
    
        namedWindow("特征点检测",WINDOW_AUTOSIZE);
        imshow("特征点检测",dstImage);
    
    
        waitKey(0);
    
        return 0;
    }

    运行结果这里写图片描述

    展开全文
  • 人脸识别,人脸关键点检测算法

    万次阅读 2015-09-05 13:52:26
    其提供的技术服务有1:人脸检测(人脸检测追踪,人脸关键点检测) 2:人脸分析(微笑分析,性别年龄种族表情)3:人脸识别(1:1,1:N,大规模人脸搜索)。我需要关注的是这里的人脸关键点检测的实现。Face++为美图...

    1 Face++:http://www.faceplusplus.com.cn/tech_landmark/

    其提供的技术服务有1:人脸检测(人脸检测追踪,人脸关键点检测) 2:人脸分析(微笑分析,性别年龄种族表情)3:人脸识别(1:1,1:N,大规模人脸搜索)。我需要关注的是这里的人脸关键点检测的实现。Face++为美图秀秀,美颜相机提供人脸关键点检测的技术服务。

    2 Face++一个采访问题,能够了解人脸识别技术的整个流程。

    CSDN移动:可否介绍一下,典型的人脸识别系统是什么样子的?

    印奇:当今的人脸识别系统虽然包含无数细节和各种工程技巧,但大的系统框架不外乎如下图所示的流程:一张人脸图片输入后,需要先找到人脸的位置(人脸检测),然后在这个基础上定位人脸关键点的位置(如眼睛中心或嘴角等),每个系统关键提取的数量相差很大,有的只有左右眼睛中心两个点,有的可能多达近百个点。这些点的位置一是用来做人脸的几何校正,即把人脸通过缩放、旋转、拉伸等图像变化变到一个比较标准的大小位置。这样待识别的人脸区域会更加规整,便于后续进行匹配。同时,现在的实际系统一般也都配有人脸光学校正模块,通过一些滤波的方法,去除一些对光照更加敏感的面部特征。在做完这些预处理之后,就是从人脸区域提取各种特征,包括LBP、HOG、Gabor等。最终相关的特征会连接成一个长的特征向量(Feature Vector),然后匹配出人脸的相似度,根据相似度的大小,系统会判定两张图片到底是不是一个人。不难看出,人脸识别技术还是一个系统链条较长,较为有技术门槛的领域。因为这条流水线的每个环节可能都会严重影响最终系统性能,所以一个好的人脸识别技术公司需要在各个环节上追求细节,建立自己的技术优势,最终才有可能在最后的人脸识别精度上有出色的表现。


    3 人类识别人脸用的是什么算法http://www.zhihu.com/question/20154853

    上面链接是知乎上面的讨论,有一个关于生物学方面的解释。

    又一个Face++的专访:http://segmentfault.com/a/1190000000452539

    通过下面这段话可以了解到目前的一些测试平台:

    1. 人脸检测(在照片中精准定位人脸位置的算法),在世界公开评测集FDDB 排名第一
    2. 人脸关键点检测(精准定位面部关键部门的位置),在世界公开评测比赛300-W排名第一
    3. 在最重要的互联网图片人脸识别(Face recognition) 比赛LFW中,Face++团队更是力压Facebook人脸团队 (前face.com团队),获得世界第一。在极难识别的互联网新闻图片上,获得了97.3%的准确率。
    Face++: Face++已经能够较为稳定地应对复杂的光照和人脸姿态,但过于极端的光照和姿态还是十分困难。Face++的全线技术都更新为大数据深度学习算法,通过收集的海量人脸照片,新型的神经网络算法可以通过大数据训练形成性能更好的人脸检测,人脸分析,和人脸识别技术。

    所以我的感觉是技术实现的方式采用:深度学习与传统算法相结合,互补的方式,并注重深度学习方面的创新。Face++ 目前发布的两篇论文,关键点检测和人脸特征表示都是基于DCNN的技术。

    SegmentFault: Face++的算法研发用到了C++、Matlab和Python?能比较下Matlab和Python在视觉算法研究方面的优势和不足么?

    Face++: 优势是比较糙快猛,方便验证idea;落实到系统和实用级别,可能还是要采用C++。所以用matlab验证完idea后,用C++做实现。不妨申请下Face++的实习生。

    4 阅读文献《人脸特征点定位研究与应用-吴证》

    文中提到几种人脸关键点检测的方法:

    1投影(五官灰度值较周围皮肤灰度值低)

    2基于先验规则(先验知识指的是人脸比如眼睑、虹膜等一些已知的灰度、形状信息)

    3基于几何形状(比如可变形模板,能够较好检测眼睛嘴唇特征形状,但是由于边缘不精确难以精确定位特征点,依赖初始参数大,容易陷入局部最小,计算时间长)(另外还有主动形状模型(ASM),主动表观模型(AAM))

    4基于统计的方法(该方法的思想是将特征部位看做一类模式,然后使用大量的特征部位样本和非特征部位样本进行训练,然后构造分类器,该类方法主要有PCA(主成分分析)、SVM、ANN(神经网络)、AdaBoost、模板匹配

    5基于小波和小波包

    5 机器学习的封装好的库:

    这里有关于库的介绍:http://www.chinacloud.cn/show.aspx?id=21150&cid=16


    theano:妹纸目前推荐我用这个库,python封装的。知乎上有不少人用这个,但是统一的评论是调试不方便。theano,教程比较基础,安装非常简单,几个指令可以搞定,不过用他来做开发实在太麻烦,建议配合keras使用,非常赞。

    Theano   

    主页:http://deeplearning.net/software/theano/

    Github网址:https://github.co

    还有一些库比如:matconvnet、Lasagne、opencv、nolearn、keras、caffe

    最新的kaggle比赛中很多人用的是nolearn + lasagne,这两个库也是基于Theano作为核心建立的。 

    dlib

    http://matthewearl.github.io/2015/07/28/switching-eds-with-python/

    http://blog.csdn.net/qingnianzhi/article/details/47322627

    6 目前我的打算

    我的目的:实现对人脸的关键点定位

    学习思路:打算通过深度学习的方式来进行关键点检测,首先在ufldl上学习深度学习的入门知识,然后在网络的博客上找别人用python写的人脸检测的算法,最后自己基于C++实现,然后app中java调用。

    比如链接:http://blog.csdn.net/qingnianzhi/article/details/46912383#comments















    展开全文
  • 点击上方“AI算法与图像处理”,选择加"星标"或“置顶”重磅干货,第一时间送达这篇文章作者分别来自天津大学、武汉大学、腾讯AI实验室、美国天普大学。该算法对在高通ARM ...
  • 人脸关键点:DAN-Deep Alignment Network: A convolutional neural network for robust face alignmentDAN-Deep Alignment Network,发表于CVPR-2017。很纳闷DAN取名中的D,为什么是deep,如果是深度学习的deep,岂...
  • 依作者所说,这是第一篇在人脸关键点检测任务上对loss function进行讨论分析的文章,文章在loss function上进行改进,为人脸关键点检测任务提出“专用”的loss function——Wing loss,作者的出发点值得借鉴。...
  • 3D-SIFT关键点检测(基于曲率不变特征约束)
  • 异常点检测算法分析与选择

    千次阅读 2018-05-28 12:06:28
    转自:https://blog.csdn.net/xmuecor/article/details/45039163目录111 基于统计的异常点检测算法112 基于距离的异常点检测算法113 基于密度的异常点检测算法114 基于深度的异常点检测算法115 基于偏移的异常...
  • 人体骨骼关键点检测综述

    万次阅读 多人点赞 2018-06-11 12:53:45
    其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。...近年来,随着深度学习技术的发展,人体骨骼关键点检测效果不断...
  • 人体姿态估计(Human Posture Estimation),是通过将图片中已检测到的人体关键点正确的联系起来,从而估计人体姿态。 人体关键点通常对应人体上有一定自由度的关节,比如颈、肩、肘、腕、腰、膝、踝等,如下图。 ...
  • OpenCV实现人体姿态估计(人体关键点检测)OpenPose

    万次阅读 多人点赞 2019-08-04 11:53:03
    OpenCV实现人体姿态估计(人体关键点检测)OpenPose OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态...
  • 点检测算法

    千次阅读 2015-06-29 14:40:35
    本次范例讲的都是检测角点的算法,在这里我们会讲到,harris角点检测,Shi-Tomasi角点检测,FAST角点检测,尺度不变surf检测,尺度不变sift检测,特征点的描述。由于是算法问题,相对来说会比较复杂,而且都是一些...
  • 普林斯顿大学提出:CornerNet-Lite,基于关键点的实时且精度高的目标检测算法,已开源! 本文要介绍一篇实时性好,准确率又高的论文:CornerNet-Lite。该论文是由普林斯顿大学的几位学者提出。截止2019年4月20...
  • 人体骨骼关键点检测

    千次阅读 2019-08-15 11:02:37
    关键点检测算法 关键点检测算法主要分为自上而下和自下而上两种。 自上而下 就是目标检测+单人骨骼关键点检测 1关键点的局部信息区分度很弱,背景中很容易出现同样的局部信息造成的混淆,需要考虑较大的感...
  • 人脸关键点检测总结

    万次阅读 多人点赞 2018-05-31 10:38:21
    人脸关键点检测也称为人脸关键点检测、定位或者人脸对齐,是指给定人脸图像,定位出人脸面部的关键区域位置,包括眉毛、眼睛、鼻子、嘴巴、脸部轮廓等。 人脸关键点检测方法大致分为三种: - 基于模型的ASM(Active...
  • 人脸关键点检测 face keypoint detect

    千次阅读 多人点赞 2019-08-18 23:27:39
    人脸关键点检测 人脸关键点检测,广泛使用的数据集是300W 以及300VW, 为68个关键点。 github demos 结构 该文的实现,主要是使用wing loss,多任务学习以及基于头部姿态以及眼睛和嘴巴姿态的数据增强。 模型只使用...
  • 关键点匹配算法

    千次阅读 2016-02-05 11:13:59
    从局部特征中检测到所求的关键点,但是这种方法对噪声非常敏感。asm也是开先河的经典之作,也是后面被follow最多方法。也是cootes等人提出的aam方法,对外观变化和初始化也非常敏感,以上的这些包括他们的改进都是用...
  • 人脸关键点检测5——Face++(1)

    千次阅读 2018-05-31 23:06:20
    ICCV2013,Face++在DCNN模型上进行改进,提出由粗到精的人脸关键点检测算法。 实现了68个点的高精度定位,该算法将人脸关键点分为内部关键点和轮廓关键点,内部关键点包含眉毛、眼睛、鼻子、嘴巴共计51个...
  • 深度学习算法 openpose 人体关键点识别 python opencv 效果还行
  • Harris角点检测算法详解

    万次阅读 多人点赞 2017-03-07 10:27:09
    现在开始讲解常用的特征点检测,其中Harris角点检测是特征点检测的基础,提出了应用邻近像素点灰度差值概念,从而进行判断是否为角点、边缘、平滑区域。Harris角点检测原理是利用移动的窗口在图像中计算灰度变化值,
  • Surf算法特征点检测与匹配

    万次阅读 多人点赞 2016-09-20 23:53:54
    Speeded Up Robust Features(SURF,加速稳健特征),是一种稳健的局部特征点检测和描述算法。最初由Herbert Bay发表在2006年的欧洲计算机视觉国际会议(Europen Conference on Computer Vision,ECCV)上,并在2008...
  • 图像特征提取算法算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上。对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素,在某一个...
  • ORB FAST特征关键点检测(opencv)

    千次阅读 2019-06-17 18:46:38
    ORB FAST特征关键点检测(opencv) 原理:ORB - (Oriented Fast and Rotated BRIEF)算法是基于FAST特征检测与BRIEF特征描述子匹配实现,相比BRIEF算法中依靠随机方式获取而值点对,ORB通过FAST方法 FAST方式寻找候选...
  • OpenCV特征点检测算法对比

    万次阅读 2015-04-01 13:32:55
    06-20 20:5454441人阅读评论(10)收藏举报 算法blog活动 识别算法概述: SIFT/SURF基于灰度图, 一、首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值周围26个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,663
精华内容 44,265
关键字:

关键点检测最好的算法