人脸识别

    人脸闸机

    版本说明

    版本 日期 说明
    v1.1 2017.10.16 优化SDK检测速度、追踪效果,优化部分注释代码
    v1.0 2017.07.23 初版,提供人脸闸机完整示例工程

    目录

    1、简介
      1.1 功能概述
      1.2 名词解释
      1.3 注意事项
      1.4 硬件选型
    2、集成指南
      2.1 准备工作
        2.1.1 注册开发者
        2.1.2 创建应用
        2.1.3 获取密钥
        2.1.4 生成token
        2.1.5 SDK license(十分重要!)
      2.2 安卓集成
        2.2.1 自动配置授权集成
        2.2.2 未使用自动配置授权集成
        2.2.3 SDK初始化
        2.2.4 人脸注册
        2.2.5 人脸识别
        2.2.6 相关类解释
      2.3 iOS集成
    3、常见问题

    1、简介

    1.1 功能概述

    • 本地版活体检测(本地活体):通过让用户做出指定脸部交互动作,识别当前操作者是否为活体,此功能可离线使用,可设定指定动作是否使用及应用顺序。可有效抵御高清图片、3D建模、视频等攻击。
    • 在线版活体检测(在线活体):基于本地版有交互活体检测输出的质量合格的图片,请求在线活体检测接口,可以进一步判断用户上传的图片是否为活体,进一步抵御高精度视频、高精度建模等攻击。此接口建议与本地版活体检测结合使用,且输入的照片一定为二次采集图片(即限于产品前端拍照所得,不可为相册图片)。
    • 人脸质量检测:判断视频流中的图片帧中,哪些图片质量较佳,即人脸图像特征清晰(满足角度、姿态、光照、模糊度等校验)。
    • 人脸图像采集:通过本地SDK能力,采集人脸图像,同时经过人脸质量检测,确保采集到的人脸图像符合各条件校验(角度、姿态、光照、模糊度等),为设备前端获取有效可分析人脸的主要功能。
    • 在线鉴权:API接口的权限判断,在后台获取API Key和Secret Key后生成的token,用于每次请求时供服务器判断是否可通过此次请求。
    • 离线授权:SDK的授权判断,授权介质也称为license,在SDK使用中,需要通过license向授权服务器发起请求,判断SDK的使用合法性及使用有效期。
    • 人脸识别:人脸识别技术的泛称,通常指识别图片或视频中的人脸,提取人脸特征值,用于进一步的人脸对比、搜索等业务操作。
    • 人脸检测:分析并定位图片中的人脸及位置,是人脸识别技术的第一步分析内容。
    • 人脸1:1:目标分析人脸与已知身份人脸进行比对,对比两个图片中的人脸的相似度,根据分值判断两张人脸是否为同一人。
    • 人脸1:N:在一个已知身份的人脸集合中找到相似的人脸,返回内容为人脸集合中每一张脸与目标人脸的相似度分值,找出目标人脸是否属于哪一个已知身份的用户。
    • 人脸属性:通过人脸特征抽取,分析人脸的性别、年龄、种族、是否戴眼镜等属性值。
    • ak:对应API KEY
    • sk:对应Secret Key
    • LicenseID:应用授权标识
    • 包名packageName:安卓应用包名,用来唯一识别一个应用。
    • license文件:授权文件,与ak,sk,安卓包名和签名一一对应。集成的时候请放置在assets目录下。
    • 签名MD5:安卓应用签名jks文件的MD5值。

    1.2 名词解释

    • 前端设备:装有安卓系统的设备,如手机,平板,安卓开发板等。
    • 内置相机:手机或平板自带的相机。
    • 网络摄像机:和前端设备分开的,通过网络进行数据传输的摄像机。一般都是基于RTSP协议传输H264编码的视频。
    • AndroidSDK:百度人脸检测安卓SDK;
    • 用户后台服务:用户的后台服务器。
    • 百度人脸服务:百度基于REST接口的对外人脸服务。

    场景的数据流向为:

    1. 前端设备通过内相相机或者网络摄像机采集照片/视频,进行解码。获取一帧帧的图片。
    2. 调用AndroidSDK对图片内的内容进行分析,分析出是否无人脸,人脸在图片中的位置,人的角度等信息。再经过过虑算法,挑选一张质量较好的图片,对人脸区域进行裁剪。
    3. 数据上传至用户后台服务器。
    4. 用户后台服务接收到照片上传至百度人脸服务进行人脸识别查询。
    5. 百度人脸服务返回结果给用户后台服务,用户后台服务进行相应的逻辑处理,再将结果返回给前端app.

    1.3 硬件选型

    为了跑通整体逻辑,方便理解,安卓demo中也集成了,后台服务器的一些功能。实际使用过程中,我们建议把人脸识别接口的功能放置于自己的服务器当中。主要是为了防止ak,sk,被他人反编译调用,从而造成,经济和数据上的损失!!!!!!

    Android闸机硬件选型推荐有两种方案,一种是使用现有市场上的成品平板,另外一种是使用定制的硬件平台和自选外设摄像头(USB摄像头或网络摄像头)。针对三种方案分别做出如下选择:

    1、平板方案

    名称 指标要求
    CPU ARM v7(支持neon指令集)及以上架构,4核以上
    内存 2G+
    屏幕 640*480以上
    摄像头 720p以上
    系统 Android 4.4+

    平板型号推荐示例:华为M3

    2、USB摄像头方案

    名称 指标要求
    CPU ARM v7(支持neon指令集)及以上架构,4核以上
    内存 2G+
    摄像头 USB2.0+ 支持UVC协议
    系统 Android 4.4+
    • 硬件型号推荐:Firefly-RK3288Firefly-RK3399
    • 摄像头推荐:视派尔 C-SP2820W400

    如何使用:将USB摄像头与开发板连接,SDK可以自动识别摄像头,使用方法和内置相机一致。

    3、网络摄像头

    名称 指标要求
    开发板 rk3399(720p 15+帧,显示和检测异步)
    rk3288(720p 10+帧 显示和检测异步)
    镜头 3.5mm(具体根据检测距离选择)
    分辨率 120W像素以上
    宽动态 100dB以上
    快门 小于 1/500s
    传输协议 RTSP

    如何使用:网络摄像头与开发板连接到同一个局域网内(连接至同一路由器,并使用同一网段如192.168.1.xxx)

    根据网络摄像头说明书,配置网络摄像头,帧率15,分辨率720P,码率12M左右,设置rtsp协议url和用户名和密码。调整焦距至画片清晰。可以用VLC等支持RTSP协议的软件验证摄像头是否配置成功。如摄像头配置没有问题,可参数RTSTTestActivity,修改摄像头地址。其它流程与自带摄像头一致。

    2、集成指南

    2.1 准备工作

    在正式集成前,需要做一些准备工作,完成一些账号、应用及配置,具体如下:

    2.1.1 注册开发者

    • STEP1:点击百度AI开放平台导航右侧的控制台中的人脸识别,页面跳转登录完毕后,进入人脸识别后台
    • STEP2:使用百度账号完成登录,如您还未持有百度账户,可以点击此处注册百度账户
    • STEP3:进入百度云欢迎页面,填写企业/个人基本信息,注册完毕,至此成为开发者。注:(如您之前已经是百度云用户或百度开发者中心用户,STEP3可略过。)
    • STEP4:进入百度云控制台,找到人工智能相关服务面板。
    • STEP5:点击进入「人脸识别」模块。

    注一:如果您通过百度AI开放平台登录到后台,AI相关服务模块入口,如下图所示:

    注二:如果您通过百度云直接登录后台,AI相关服务模块入口,则如下图红框部分所示:

    说明:两种入口只是展现形式不同,相关AI服务模块内容完全一样。

    2.1.2 创建应用

    创建好账号后,在正式调用AI能力之前,需要您创建一下应用,这个是调用服务的基础能力单元。选择「人脸识别」服务,首先见到此服务的控制台概览页,点击「创建应用」,即可进入应用创建界面,如下图所示:

    2.1.3 获取密钥

    在您创建完毕应用后,平台将会分配给您此应用的相关凭证,主要为AppIDAPI KeySecret Key,以上三个信息是您应用实际开发的主要凭证,每个应用之间各不相同,请您妥善保管。如上图所示。

    :::warning 注意:开发中请注意区分多份aksk(API Key、Secret Key),每个aksk代表一个人脸库。 :::

    2.1.4 生成token

    刚才所创建的应用在调用开放平台API之前,首先需要获取Access Token(用户身份验证和授权的凭证)您需要使用创建应用所分配到的AppIDAPI KeySecret Key,进行Access Token的生成,方法详见Access Token获取,我们为您准备了几种常见语言的请求示例代码。

    ::: warning 注:Access Token的有效期为30天(以秒为单位),请您集成时注意在程序中定期请求新的token,或每次请求都获取一次token。 :::

    2.1.5 SDK license(十分重要!)

    人脸SDK License:此license用于SDK离线功能使用,在您的申请人脸SDK的后台页面,下载两个端的license,用于接下来集成使用。

    不过我们为您提供了自动化配置脚本,如下图所示:

    您可以在下载登录示例工程的同时,直接下载已经配置好授权信息的版本。

    2.2 安卓集成

    2.2.1 自动配置授权集成

    如果您是通过自动配置授权信息下载的示例工程,只需要谢欧冠Config类和配置签名。您的集成将少很多步骤。

    1、修改Config类中参数,自动配置已经为您修改好了licenseID和license文件,您只需要修改appKey、appSecret(即ak/sk), groupId是自己定义的,用于人脸注册和人脸识别等接口使用。保证注册的人脸和查找的人脸在同一个groupId即可。

    2、 配置签名(申请license时的md5为打包签名的文件,所以必须用申请license的签名文件) 因为SDK运行时会对比license里面的md5和签名文件的md5,为了能debug也能使用人脸,所以需要进行下面的配置。实际发布时只要使用申请时关联的签名文件即可,没有下面的配置也行。

    app->build.gradle->android->signingConfigs

    注意:keyAlias为你创建的打包签名文件的别名。

    2.2.2 未使用自动配置授权集成

    1、把申请的license(idl-license.face-android)放到到项目中assets目录中

    2、修改Config类中的参数:

    licenseID为您申请license填的授权信息字符串+"-face-android"

    groupId是自己定义的,用于人脸注册和人脸识别等接口使用。保证注册的人脸和查找的人脸在同一个groupId即可。

    3、配置签名(申请license时的md5为打包签名的文件,所以必须用申请license的签名文件)

    因为SDK运行时会对比license里面的md5和签名文件的md5,为了能debug也能使用人脸,所以需要进行下面的配置。实际发布时只要使用申请时关联的签名文件即可,没有下面的配置也行。

    app->build.gradle->android->signingConfigs

    • keyAlias为你创建的打包签名文件的别名
    • keyPassword为你创建的打包签名的别名密码
    • storeFile为签名文件的路径
    • storePassword为签名文件的密码

    4、修改包名 app->build.gradle->android->defaultConfig ->您申请license时填的包名

    2.2.3 SDK初始化

    使用人脸检测之前先要对识别库进行初始化。推荐在applicaton的onCreate方法中调用如下代码片段

    2.2.4 人脸注册

    1、可以通过RegDetectActivity实时检测获取注册的人脸。注册过程是往人脸库中注册照片,因为该照片做为识别标准所以对质量的要求也更高。为了保证人脸注册图片的质量。

    Demo中提供了RegDetectActivity.该Activity在屏幕上指定了一定的区域,要求用户在屏幕中央,脸正对着摄像头。如果用户的姿势达不到要求,会提示用户,直到符合要求为止。

    下面的代码片段是,检测人脸过程中,根据检测结果值,提示用户进行调整,从而得到高质量的照片。

    2、或者相册获取注册的人脸。

    3、调用在线api进行注册。

    2.3.5 人脸识别

    • 创建FaceDetectManager对象,该类封装了,人脸检测整体逻辑。
    • 创建CameraImageSource用于,从系统相机获取图片。如果是网络相机,创建 RtspImageSource从网络摄像头获取 图片进行识别。
    • FaceDetectManager设置previewView,进行预览显示。
    • FaceDetectManager设置OnFaceDetectListener,该回调在检测完一帧图片之后会被调用。
    • OnTrackListener只有当检测到人脸的时候会被调用。
    • FaceDetectManager.getFaceFilter()会返回人脸条件过滤器,可以设置过滤角度。符合条件的人脸图片上传至服务器进行人脸识别。(也就是1:N接口)
    • 正常场景,相似度80以上可以认为可信。小于80的可以采取策略,选择重试。重度逻辑,请自行修改。

    1、检测人脸(从Android手机自带摄像头和usb摄像头获取人脸)(DetectActivity)

    2、从网络摄像头获取人脸(RtspTestActivity)

    3、人脸识别(调用在线API)

    Demo中为了方便演示逻辑,直接请求的百度服务器,实际场景可将图片发送给自己的服务器,再由服务器发起识别请求,或者,把ak,sk放置在服务器上。客户端调用接口获取accessToken。保证账户信息安全。

    2.3.6 相关类解释

    • FaceDetector封装了人脸检测相关底层的各种操作。
    • ImageFrame:封装了一帧帧的图片。
    • ImageSource:图片来源,如系统相机,图片文件,网络摄像头等。
    • FaceDetectManager:封装了图片采集到,检测的一整套逻辑。
    • PreviewView:显示相机的View;
    • FaceCropper:工具类,用于裁剪人脸图片。

    2.3 iOS集成

    把申请的idl_license.license文件添加到工程当中。

    1、确定工程的BundleIdentifier和申请时填写的bundleID相同

    App启动时创建FaceSDK实例,注意「APIKEY」对应后台的LicenseID,如下图示意:

    替换Config.h 中的APP_KEY和APP_SECRET(对应的后台应用列表中的API-KEY和SECRET-KEY),如下图所示:

    设置SDK参数,正常情况使用demo中提供的参数即可。

    至此,项目配置完成。

    注册和识别人脸检测和截取的代码类似,区别在于获取到人脸图片之后调用的API不同。注册相关代码说见 CaptureImageViewController

    创建相机,设置frame,将相机预览的layer,添加到View的layer当中。用于显示相机预览图片。

    相机预览过程中会回调- (void)cameraControl:(CameraControl )camera didOutputFrame:(UIImage )image 覆写该方法,调用[[FaceVerifier sharedInstance] prepareDataWithImage:image andActionType:FaceVerifierActionTypeVerify];对该图片进行人脸检测。检测结果 NSArray* faces = [[FaceVerifier sharedInstance] getTrackedFace];获取检测结果 。

    回调结果上传至人脸识别服务器进行识别。根据返回结果处理相应的业务逻辑。

    注意:Demo中为了方便演示逻辑,直接请求的百度服务器,实际场景可将图片发送给自己的服务器,再由服务器发起识别请求,或者,把ak,sk放置在服务器上。客户端调用接口获取accessToken。保证账户信息安全。

    identify方法比较简单,将UIImage转化为base64字符串,post到服务器接口。

    常见问题

    Q:SDK license和ak/sk?
    A:license是用于本地人脸检测,申请联系商务。ak/sk用调用百度云服务人脸注册和人脸识别 。

    Q:Android申请时需要填入打包签名的MD5,该MD5如何得来?
    A:创建工程时生成签名文件keystore.jks(该文件会用于最终发布是打包,请认真对待),在命令行工具中使用keytool -list -v -keystore keystore.jks 得到md5,删除冒号。 具体可以参考开发者论坛。关于安卓包名、MD5值的一些讲解https://ai.baidu.com/forum/topic/show/492039

    Q:闸机场景选择多大分辨率?
    A:对于闸机场景,分辨率没有必要特别高,通常640*480即可满足。分辨率越小,人脸检测的速度就越快。

    Q:检测距离太近怎么办?
    A:1、可以修改最小检测人脸(可调节范围80-100),在相同的分辨率下,最小检测人脸越小,就能在更远的距离检测到人脸。当然最小检测人脸越小,越耗性能。

    Q:怎么样更快检测到人脸?
    A:mFaceTracker.set_detection_frame_interval(10); 设置该参数,参数越小,就会人脸进入屏幕时更快的检测到人脸,单位ms

    上一篇
    手机刷脸登录
    下一篇
    人脸考勤