概述
人脸识别SeetaFace2原理与代码详解
- 前言
- 一、人脸识别步骤
- 二、SeetaFace2基本介绍
- 三、seetaFace2人脸注册、识别代码详解
-
- 3.1 人脸注册
-
- 3.1.1 人脸检测
- 3.1.2 人脸对齐
- 3.1.3 人脸特征提取
- 3.2 人脸识别
- 附:seetaface2代码的三个接口
前言
生物特征识别(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.cpp
中Detect
函数,该函数输入一张包含人脸的图片,输出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_
最后
以上就是天真枫叶为你收集整理的人脸识别SeetaFace2原理与代码详解前言一、人脸识别步骤二、SeetaFace2基本介绍三、seetaFace2人脸注册、识别代码详解附:seetaface2代码的三个接口的全部内容,希望文章能够帮你解决人脸识别SeetaFace2原理与代码详解前言一、人脸识别步骤二、SeetaFace2基本介绍三、seetaFace2人脸注册、识别代码详解附:seetaface2代码的三个接口所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复