人脸识别

    windows-基础版

    温馨提示:2020年4月离线采集SDK Win&Linux版本正式下线,若您需要此版本请到离线识别SDK进行申请;老客户转正式版请提交工单申请。

    目录

    1 基础信息
      1.1 产品概述
      1.2 规格信息
      1.3 兼容性
    2 业务介绍
      2.1 功能简介
      2.2 业务流程
    3 快速集成
      3.1 名词介绍
      3.2 SDK文件结构
      3.3 授权激活
      3.4 运行Demo工程
    4 接口说明
      4.1 人脸检测track接口(传入图片)
      4.2 人脸检测track接口(传入二进制图片buffer)
      4.3 人脸检测track_max_face接口
      4.4 人脸检测track_max_face接口(传入二进制图片buffer)
      4.5 人脸检测设置接口
      4.6 USB摄像头检测(实时视频帧人脸检测)
      4.7 人脸检测track接口(传入opencv的mat)
      4.8 人脸质量接口(通过传入图片)
    5 错误码及错误信息
    6 常见问题

    1、基础信息

    1.1 产品概述

    百度FaceSDK Windows基础版是一种面向Windows设备的人脸技术开发包,此版SDK包含人脸检测追踪等方法。基于该方案,开发者可以轻松的构建包含人脸检测、采集的应用。在您使用SDK之前,我们首先为您介绍一下SDK本身及相关人脸能力,以便您能更方便使用人脸服务。

    1.2 规格信息

    • 包大小:~500M(相关库文件较大)
    • 最小人脸检测大小:50px * 50px
    • 可识别人脸角度:yaw ≤ ±30°, pitch ≤ ±30°
    • 检测速度:100ms 720p*
    • 追踪速度:30ms 720p*
    • 人脸检测耗时:< 100ms

    备注:以上指标,由最新版SDK运行在真实设备上,采用真实数据集所得,但算法性能受实际运行设备、实际数据集等情况影响,以上数字仅供参考。

    1.3 兼容性

    • x86、x64两个版本,支持Win7、Win10
    • 推荐基于vs2015进行开发

    2、业务介绍

    2.1 功能简介

    2.1.1 人脸检测与跟踪

    可在设备端,离线实时检测视频流中的人脸。同时支持处理静态图片或者视频流,并对当前检测到的人脸持续跟踪,动态定位人脸轮廓,稳定贴合人脸。

    2.1.2 质量控制

    在人脸检测及追踪过程中,实时校验人脸的姿态角度、遮挡、清晰度、光照条件,符合质量条件的人脸图片才会被采集。

    2.1.3 人脸采集

    针对视频流实时完成人脸图片采集,并输出满足质量过滤条件的人脸图片,可自定义采集人脸大小,采集频率,采集质量等设置。

    2.2 业务流程

    人脸识别的应用场景,核心可以分为三大类:

    1. 身份核验:即1:1对比,判断两张脸的相似度,判断你是你,通常用于需要验证用户身份真实性的场景,如人证对比。
    2. 身份识别:即1:N识别,在一个人脸集合中找到最相似的人脸,判断你是谁,通常用于判断用户身份是否存在,及身份信息内容的场景,如人脸门禁、人脸支付等。
    3. 属性分析:即人脸属性分析,基于人脸信息,返回年龄、性别等属性值,通常用于客群分析、娱乐营销等场景,如统计线下客群年龄分布。

    而以上场景的几乎所有业务过程,核心可以分为两个步骤:

    1. 人脸采集:人脸识别的前置步骤,即获取到人脸图片,用于对比、识别、属性分析等操作。
    2. 人脸分析:包括人脸图片的加工处理,特征抽取与对比,结果返回等一系列操作,也是通常理解为的人脸识别操作。

    要想确保人脸识别的应用效果得到保障,最为核心的一个环节即人脸的获取,即人脸采集。目前市面上所有人脸识别应用落地,面临的主要问题就是应用环境复杂,包括光照、遮挡、作弊攻击等一系列环境因素干扰,涉及产品策略、硬件选型、施工方案等多个维度地综合作用,才能不断提升最终效果。

    3、快速集成

    3.1 名词介绍

    名词 定义
    采集SDK Windows离线人脸识别SDK
    vs2015 微软的开发工具visual studio 2015 (推荐安装vs community 2015)
    License 人脸识别激活所需要的激活文件,可利用激活工具生成
    License_key 创建授权时需要传入的授权标识字段

    3.2 SDK文件结构

    SDK提供动态库BaiduFaceApi.dllBaiduFaceApi.lib及头文件face.h。另外有附带的demo工程BaiduFaceCollect以及鉴权激活工具LicenseTool.exe。

    在此之外,还附带支撑SDK使用的人脸识别模型文件夹face-resource,该文件夹在BaiduFaceCollect示例工程里面,存放路径请参考BaiduFaceCollect工程,默认存放路径为您要开发的exe(如demo工程BaiduFaceCollect.exe)所在路径的上级目录下。若存放不对,可能会影响sdk正常使用,另外请勿删除该文件夹。

    为运行exe,需要用到一些底层的库文件(dll),相关库文件在BaiduFaceCollect的win32和x64文件夹(分别对应x86和x64平台)中均已提供。此外,随BaiduFaceCollect还有一些辅助文件或开源库,如opencv及头文件,base64文件,这些都是开源文件,随demo工程根据用户需要可自行修改,另外就是一些示例demo文件。

    3.3 授权激活

    激活分测试阶段按设备单机授权、和按产品线授权

    • 按设备单机授权:调试阶段的一种授权方式,主要用于指定设备上反复测试程序功能,激活状态只适用于授权的设备硬件。
    • 按产品线授权:针对发布的exe,该exe可应用于所有设备。

    3.3.1 按设备单机授权

    该方式授权,主要用于在测试开发阶段,在测试机器上反复调试编译,所以提供按照设备维度的授权。

    第一步:SDK附带一个LicenseTool.exe,双击可运行,弹出如图所示的设备指纹信息。

    第二步:复制此硬件指纹信息,在后台填写到下图所在的位置,并创建授权,下载对应的License文件。

    第三步(重要!!):在SDK中,您需要在初始化的时候传入license_key,此license_key为您在后台填写的「授权标识」,添加一个-face-winadnlinux-test的后缀,如下图所示,授权标识填写的为「baidutest」,则license_key为:baidutest-face-winadnlinux-test。

    // 传入license_key,牢记在后台填写的「授权标识」,并在此授权标识基础上添加 -face-winadnlinux-test 的后缀
    // 如您填写的授权标识填写的为「baidutest」,则license_key为:baidutest-face-winadnlinux-test
    std::string license_key = "baidutest-face-winadnlinux-test";
    
    //初始化sdk
    sdk_init(license_key.c_str());

    第四步:在官网下载License文件,如下图所示:

    需要重命名为:license.ini,并拷贝到exe所在路径同一目录位置,如SDK的win32或x64目录下。

    以上四步完毕后,您的exe就可以通过授权激活运行。

    3.3.2 按产品线授权

    该方式授权,主要用于发布正式的exe安装包,授权将会识别具体的exe程序,确保指定exe的正常运行。

    :所以每次程序升级,需要单独创建一个License文件进行更新。

    第一步:在后台新建授权中表单中,平台类型选择「Windows & Linux」,授权类型选择「产品线」,并填写以下几个内容:

    1. 授权标识:自定义用于标识您的license授权信息,每个授权只能有唯一的标识,支持英文、数字、横线,20个英文字符以内;
    2. 产品名:填写exe可执行程序的具体名称,例如face.exe,则产品名为face.exe;
    3. 程序文件的md5:此项稍后填写,exe文件的md5:如face.exe,请填写此程序的md5值

    第二步:在SDK初始化的时候传入license_key,此license_key为您在后台填写的「授权标识」,添加一个-face-win的后缀,如下图所示,授权标识填写的为「baidutest」,则license_key为:baidutest-face-win。

    // 传入license_key,牢记在后台填写的「授权标识」,并在此授权标识基础上添加 -face-win 的后缀
    // 如您填写的授权标识填写的为「baidutest」,则license_key为:baidutest-face-win
    std::string license_key = "baidutest-face-win";
    
    //初始化sdk
    sdk_init(license_key.c_str());

    第三步:完成License代码配置后,再编译生成exe文件,用md5命令或工具生成该exe的md5,并填写到第一步的表单中,提交表单,并下载生成的License文件。

    :exe一旦编译后,则license_key和exe不能再编译改变,否则该license文件无法通过激活。

    第四步:若按上述步骤生成license文件后,重命名为:license.ini,并拷贝到exe所在路径同一目录位置,如SDK的win32或x64目录下。则可运行exe通过授权激活。

    3.4 运行Demo工程

    Demo示例工程BaiduFaceCollect展示了如何集成百度人脸识别采集SDK。即导入BaiduFaceApi.dllBaiduFaceApi.lib及头文件face.h。另外为了示例视频人脸跟踪等,用到了一些opencv的库文件以及一些实现demo的支持文件,如image_base64等。

    :这些支持文件均为代码开源或是开源库

    在BaiduFaceCollect中的test_face.cpp的main()方法中,有使用sdk的各个接口方法示例。可通过vs2015双击打开如下图的sln文件。

    后工程展开为(入口函数在test_face.cpp的main方法,请编译release版本的工程,x64或x86):

    SDK实现的主要功能有人脸实时跟踪检测、人脸属性、人脸质量,返回识别出的人脸信息等,另外支持对人脸检测进行设置,达到根据设置进行识别的目的。各接口功能及传入参数和返回结果(返回结果一般为json格式的字符串)详见下方接口说明。

    4、接口说明

    4.1 人脸检测track接口(传入图片)

    方法名

    track

    方法说明

    人脸检测,返回人脸信息

    请求信息

    参数 必须 类型 描述
    out std::vector 返回的检测到的人脸图片信息结构体
    std::vector *& out 通过传入TrackFaceInfo的结构体指针引用,在检测到人脸信息后,用该引用返回人脸信息。TrackedFaceInfo结构体为检测到的人脸信息,其中:box为检测到的人脸框(为FaceInfo结构体,包含人脸框大小,中心点坐标,人脸宽度等信息)landmarks为检测到的人脸关键点,一般为144个。score为人脸打分headPose的向量组为人脸x,y,z的三个角度
    image string 人脸图片信息,根据image_type,传入图片内容
    img_type int 传入的图片类型。为1时候表示base64编码的图片,为2时候表示传入图片的本地路径。BASE64:图片的base64值;FACE_FILE:图片的本地文件路径地址;
    maxTrackObjNum int 最多检测人脸数量,默认为1,最大不超过5

    返回信息

    返回结果为int,表示检测到几个人脸信息,1为1个人,0为没检测到人脸。

    4.2 人脸检测track接口(传入二进制图片buffer)

    方法名

    track_by_buf

    方法说明

    人脸检测,返回人脸信息

    请求信息

    参数 必须 类型 描述
    out std::vector 返回的检测到的人脸图片信息结构体
    std::vector *& out 通过传入TrackFaceInfo的结构体指针引用,在检测到人脸信息后,用该引用返回人脸信息。TrackedFaceInfo结构体为检测到的人脸信息,其中:box为检测到的人脸框(为FaceInfo结构体,包含人脸框大小,中心点坐标,人脸宽度等信息)landmarks为检测到的人脸关键点,一般为144个。score为人脸打分headPose的向量组为人脸x,y,z的三个角度
    image Unsigned char * 人脸图片信息,二进制图片buffer内容
    size int 二进制图片的大小
    maxTrackObjNum int 最多检测人脸数量,默认为1,最大不超过5

    返回信息

    返回结果为int,表示检测到几个人脸信息,1为1个人,0为没检测到人脸。

    4.3 人脸检测track_max_face接口

    方法名

    track_max_face

    方法说明

    检测最大人脸。

    请求信息

    参数 必须 类型 描述
    out std::vector<TrackFaceInfo> 返回的检测到的人脸图片信息结构体
    std::vector *& out 通过传入TrackFaceInfo的结构体指针引用,在检测到人脸信息后,用该引用返回人脸信息。TrackedFaceInfo结构体为检测到的人脸信息,其中:box为检测到的人脸框(为FaceInfo结构体,包含人脸框大小,中心点坐标,人脸宽度等信息);landmarks为检测到的人脸关键点,一般为144个;score为人脸打分;headPose的向量组为人脸x,y,z的三个角度
    image string 图片信息(数据大小应小于10M)
    image_type int 为1时候表示base64编码的图片;为2时候表示传入图片的本地路径。BASE64:图片的base64值;FACE_FILE:图片的本地文件路径地址;

    返回信息

    返回结果为int,表示检测到几个人脸信息,1为1个人,0为没检测到人脸。

    4.4 人脸检测track_max_face接口(传入二进制图片buffer)

    方法名

    track_max_face_by_buf

    方法说明

    检测最大人脸。

    请求信息

    参数 必须 类型 描述
    out std::vector<TrackFaceInfo> 返回的检测到的人脸图片信息结构体
    std::vector *& out 通过传入TrackFaceInfo的结构体指针引用,在检测到人脸信息后,用该引用返回人脸信息。TrackedFaceInfo结构体为检测到的人脸信息,其中:box为检测到的人脸框(为FaceInfo结构体,包含人脸框大小,中心点坐标,人脸宽度等信息);landmarks为检测到的人脸关键点,一般为144个;score为人脸打分;headPose的向量组为人脸x,y,z的三个角度
    image Unsigned char * 人脸图片信息,二进制图片buffer内容
    size int 二进制图片的大小

    返回信息

    返回结果为int,表示检测到几个人脸信息,1为1个人,0为没检测到人脸。

    4.5 人脸检测设置接口

    请参考TestFaceApi工程中的代码示例及头文件BaiduFaceApi.h中的定义及setting.cpp里的代码注释。

    4.6 USB摄像头检测(实时视频帧人脸检测)

    通过打开usb摄像头,返回实时检测到的视频帧人脸信息。请参考TestFaceApi中的示例liveness.cpp中的usb_track_face_info,该方法中用到了人脸检测track视频帧,接口如下4.5:

    4.7 人脸检测track接口(传入opencv的mat)

    方法名

    Track

    方法说明

    人脸检测,返回人脸信息。

    请求信息

    参数 必须 类型 描述
    out std::vector<TrackFaceInfo> 返回的检测到的人脸图片信息结构体
    std::vector *& out 通过传入TrackFaceInfo的结构体指针引用,在检测到人脸信息后,用该引用返回人脸信息。TrackedFaceInfo结构体为检测到的人脸信息,其中:box为检测到的人脸框(为FaceInfo结构体,包含人脸框大小,中心点坐标,人脸宽度等信息);landmarks为检测到的人脸关键点,一般为144个;score为人脸打分;headPose的向量组为人脸x,y,z的三个角度
    Mat Opencv格式的单帧图片mat 人脸图片信息
    maxTrackObjNum int 最多检测人脸数量。默认为1,最大不超过5

    返回信息

    返回结果为TrackedFaceInfo的向量指针,向量组为0时候表示没检测到人脸。TrackedFaceInfo结构体为检测到的人脸信息,其中:box为检测到的人脸框(为FaceInfo结构体,包含人脸框大小,中心点坐标,人脸宽度等信息);landmarks为检测到的人脸关键点,一般为144个;score为人脸打分;headPose的向量组为人脸x,y,z的三个角度。

    4.8 人脸质量接口(通过传入图片)

    方法名

    face_quality

    方法说明

    人脸质量检测接口

    请求信息

    参数 必须 类型 示例描述
    image string 需要检测的人脸图片,小于10M, 图片类型根据image_type参数定
    imgae_type int 图片类型,必选择以下2种形式之一。
    Image_type为1代表BASE64为2代表FACE_FILE。
    BASE64:图片的base64值;
    FACE_FILE:图片的本地文件路径地址;

    返回信息

    errno信息:

    • errno=0 : Success
    • errno>0 : 错误码对应的详细msg

    data信息:

    字段 类型 说明
    bluriness float 模糊度
    illum float 光照
    occl_l_eye float 左眼遮挡度
    occl_r_eye float 右眼遮挡度
    occl_nose float 鼻子遮挡度
    occl_mouth float 嘴巴遮挡度
    occl_l_contour float 左脸遮挡度
    occl_r_contour float 右脸遮挡度
    occl_chin float 下巴遮挡度

    5、错误码及错误信息

    错误码 错误内容 错误描述
    0 SUCCESS 成功
    1 SYSTEM ERROR 系统错误
    2 UNKNOWN ERROR 未知错误
    1001 NOT_AUTH 授权校验失败
    1002 REQUEST PARAMS ERROR 请求参数错误
    1003 DB_OP_FAILED 数据库操作失败
    1004 NO_DATA 没有数据
    1005 RECORD_UNEXIST 记录不存在
    1006 RECORD_ALREADY_EXIST 记录已经存在
    1007 FILE_NOT_EXIST 文件不存在
    1008 GET_FEATURE_FAIL 提取特征值失败
    1009 FILE_TOO_BIG 文件太大
    1010 FACE_RESOURCE_NOT_EXIST 人脸资源文件不存在
    1011 FEATURE_LEN_ERROR 特征值长度错误
    1012 DETECT_NO_FACE 未检测到人脸

    6、常见问题

    Q:编译demo工程时候出现如opencv-win\include\opencv2\flann\logger.h(66): error C4996: 'fopen': This function or variable may be unsafe的错误提示
    A:这种错误一般是因为vs强制要求安全等级提高所致,可以通过右键工程-属性-C/C++ -- 预处理器—预处理器定义中加入:_CRT_SECURE_NO_WARNINGS后重新编译即可解决问题。

    Q:工程运行过程中,提示face-resource不存在
    A:此SDK需要一些模型文件,在demo工程的face-resource文件夹中,该文件夹需要放置在exe所在路径的上级目录下。若放置不正确,可能出现找不到模型文件,没法进行人脸识别。

    Q:exe不能运行或者崩溃
    A:编译的工程exe,需要和dll等在一个文件夹里面,如示例工程win32和x64就有不少动态库dll文件,这是exe运行所需的库文件,不放在一起的话,可能exe不能运行或者崩溃。

    Q:激活后是否可以把激活文件license.ini拷贝到其他设备运行?
    A:如果是按设备激活的,则license.ini和设备绑定,只能用于该设备测试,若是按产品方式激活,则该激活文件可随产品可执行文件一起拷贝到任意设备上运行。

    Q:激活工具license.exe运行不起来,还有其他方法获取测试用的设备指纹吗?
    A:直接运行SDK的exe如BaiduFaceCollect.exe,查看console的输出页面device id:字样后面的串,该串即设备指纹。

    上一篇
    linux-基础版
    下一篇
    Android-SDK