人脸识别SeetaFace2原理与代码详解

本文详细介绍了人脸识别的步骤,包括人脸检测、对齐和特征提取,并重点解析了SeetaFace2库在人脸注册和识别中的实现。通过对SeetaFace2源码的解读,阐述了关键函数的功能,提供了代码示例,帮助读者理解和应用SeetaFace2进行人脸识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

生物特征识别(Biometrics)是利用机器学习算法对生物个体,尤其是人类本身的某些特性进行分析和识别的技术。其不仅限于利用人体所固有的指纹、掌纹、面部、虹膜等生理特征,也包括使用步态、打字习惯等个人行为进行身份鉴定。近年来广义的定义也将表情等图片属性归为软生物特征识别(Soft biometrics)一类。生物特征识别应用的领域主要是门禁系统、考勤系统等。

一、人脸识别步骤

如图所示为本人使用XMind ZEN软件绘制的人脸注册、识别流程图,从图中可以清晰的看出人脸识别的步骤。其中,最主要的模块分为3步:人脸检测,人脸对齐,人脸特征提取。
1)人脸检测(face detect):在图像中首先定位出人脸的位置,然后裁剪(crop)出包含人脸位置的矩形框,一般还会进行填充、缩放到指定尺寸,还可能会对人脸图像进行标准化normalize;
2)人脸对齐(face alignment):提取人脸关键点坐标,然后使用放射变化或相似变换等进行人脸对齐变换。(人脸对齐的目标就是把所有的人脸图片统一到一个固定的正脸姿态和大小,从而提高模型对人脸姿态变化的鲁棒性。)
3)人脸特征提取(extract feature):主要使用深度学习等方法提取人脸的特征。

在这里插入图片描述

二、SeetaFace2基本介绍

SeetaFace2.0是中科视拓开源的第二代跨平台C++商业人脸识别库,关于其介绍可以参考以下链接,本文将不再赘述。

1、官方Github源码:
2、其他博客介绍

三、seetaFace2人脸注册、识别代码详解

主要参考serach工程中的example.cpp

3.1 人脸注册

3.1.1 人脸检测

通过example.cpp line42中 engine.Register( image )跳转到FaceDetectorPrivate.cppDetect函数,该函数输入一张包含人脸的图片,输出SeetaFaceInfoArray格式的包含人脸框(x,y,w,h)和人脸置信度得分score的数据,以及一幅图像中人脸的个数,并将SeetaFaceInfoArray格式的以上数据存入vector中。

SeetaFaceInfoArray FaceDetectorPrivate::Detect( const SeetaImageData &image )
{
   
    SeetaFaceInfoArray  ret;
    ret.size = 0;
    ret.data = nullptr;
    Impl *p = ( Impl * )impl_; //??
    if( !p->IsLegalImage( image ) )
    {
   
        return ret;
    }

    // sclae image
    seeta::Image img = image;

    float scale = 1;
    seeta::Image scaled_img = ScaleImage( img, p->width_limit_, p->height_limit_, &scale );
    img = scaled_img;

    img = seeta::color( img );

    int pad_h = std::min( int( p->max_pad_ratio * img.height() ), p->max_pad_h );
    int pad_w = std::min( int( p->max_pad_ratio * img.width() ), p->max_pad_w );
    SeetaImageData img_pad;
    img_pad.width = img.width() + 2 * pad_w;
    img_pad.height = img.height() + 2 * pad_h;
    img_pad.channels = img.channels();
    img_pad.data = new uint8_t[img_pad.channels * img_pad.height * img_pad.width];
    p->PadImage( img.data(), img.width(), img.height(), img.channels(), img_pad.data, pad_w, pad_h );

    auto local_min_face_size = std::max( 12, int( p->min_face_ * scale ) );
    auto local_max_face_size = p->max_face_;
    if( local_max_face_size > 0 ) local_max_face_size = std::max( 12, int( p->max_face_ * scale ) );

    std::vector<Rect> winList;
    winList = p->SlidingWindow( img, img_pad, p->net_[0], p->class_threshold_[0], local_min_face_size, local_max_face_size );
    winList = p->
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值