快速实现无云连接的防欺骗人脸识别

作者:Stephen Evanczuk

投稿人:DigiKey 北美编辑

人脸识别在验证智能手机访问权方面已经得到了广泛认可,但在其他领域还没有得到更广泛地应用,尽管这项技术极具效率且易于使用。在实现可靠的低成本机器学习解决方案方面,除了存在技术挑战,开发人员还必须解决用户对传统人脸识别方法的可靠性和隐私性的担忧,因为这些方法依赖易受欺骗的云连接。

本文先就安全身份验证困难之处展开了讨论,然后介绍了 NXP Semiconductors 能够解决这些问题的软硬件解决方案。最后说明以前没有机器学习方法经验的开发人员该如何使用该解决方案,在智能产品中快速实现离线式防欺骗人脸识别。

智能产品安全身份验证的挑战

在解决人们对智能产品日益增长的安全性问题的担忧时,开发人员发现自己几乎没有什么可持续使用的选择,来可靠地进行用户身份验证,从而实现快速、安全的访问。传统方法依赖于多因素身份验证方法,这种方式依赖经典的三个身份验证因素的某种组合:“你所知道的东西”,如密码;“你所拥有的东西”,如实物钥匙或钥匙卡;以及“你所是的东西”,通常是指纹或虹膜等生物识别因素。使用这种方式,强身份验证门锁可能需要用户输入密码,使用钥匙卡,并进一步提供指纹来解锁。实际上,这种严格的要求对于需要频繁、方便地用智能手机或其他常用设备的消费者来说,这种重复验证自己身份的方式很麻烦,或者说根本不实用。

人脸识别的使用大大简化了智能手机用户的身份验证,但智能手机拥有的一些优势可能并不是每种设备都能具备的。除了高端智能手机拥有强大的处理能力外,连接始终在线是给用户提供所期望的一系列复杂服务的基本要求。

对于许多需要安全身份验证的产品来说,底层操作平台通常会提供较为适度的计算资源和较为有限的连接性。头部云服务提供商提供的人脸识别服务会将处理负载转移到云端,但需要可靠的连接以确保最小的响应延迟,而这个要求可能会超出平台能力范围。同样或用户更多关注的是,在公共网络上传输他们的照片进行处理,并可能将其存储在云端,这会引起重大的隐私问题。

使用 NXP Semiconductors 的 i.MX RT106F 处理器和相关软件,开发人员现在可以实现离线人脸识别,直接解决了这些顾虑。

用于防欺骗离线人脸识别的硬件和软件

作为 NXP i.MX RT1060 跨界微控制器 (MCU) 家族的一员,NXP i.MX RT106F系列专门用于支持将离线人脸识别轻松集成到智能家居设备、消费电器、安全设备和工业设备中。它基于 Arm® Cortex®-M7 处理器内核。这种工业级 MIMXRT106FCVL5B 处理器运行频率为 528 兆赫兹 (MHz),而像 MIMXRT106FDVL6AMIMXRT106FDVL6B 这样的商用级处理器的运行频率为 600MHz。

除了支持多种外部存储器接口外,i.MX RT106F 处理器还包括 1 兆字节 (Mb) 的片上随机存取存储器 (RAM),其中 512 千字节 (Kb) 配置为通用 RAM,512 Kb 既可配置为通用 RAM,也可配置为用于指令 (I-TCM) 或数据 (D-TCM) 的紧耦合存储器 (TCM)。除了片上电源管理,这些处理器还提供了一系列广泛的集成功能,用于图形、安全、系统控制,以及支持消费设备、工业人机界面 (HMI) 和电机控制一般需要的模拟和数字接口(图 1)。

NXP Semiconductor 的 i.MX RT106F 处理器原理图(点击放大)图 1:NXP Semiconductor 的 i.MX RT106F 处理器结合了支持消费、工业和安全产品人脸识别所需的全套功能块。(图片来源:NXP)

虽然与其他 i.MX RT1060 家族成员类似,但 i.MX RT106F 处理器捆绑了 NXP 的 Oasis Lite 人脸识别软件运行时许可。Oasis Lite 运行时环境旨在加快这一类处理器的推理速度,它使用在推理引擎和 MiniCV(开源 OpenCV 计算机视觉库的简化版)上运行的神经网络 (NN) 推理模型执行人脸检测、识别,甚至是有限的情感分类。该推理引擎构建在 NXP NN 库和 Arm Cortex 微控制器系统接口标准 NN (CMSIS-NN) 库的基础上(图 2)。

NXP Oasis Lite 运行时库示意图图 2:NXP Oasis Lite 运行时库包括一个使用 MiniCV 的 Oasis Lite 内核和一个基于 NXP 和 Arm 神经网络库构建的 NXP 推理引擎。(图片来源:NXP)

推理模型驻留在 i.MX RT106F 平台上,因此人脸检测和识别在本地执行,不像其他解决方案依赖云端资源来运行机器学习算法。由于采用了离线人脸识别功能,智能产品的设计者就可以在低带宽或不稳定互联网连接中确保实现私密、安全的身份验证。此外,采用这种软硬件结合的方式,身份验证的执行速度很快,处理器从低功耗待机状态唤醒到完成人脸识别所需的时间不到 800 毫秒 (ms)。

Oasis Lite 运行时与 i.MX RT106F 处理器一起使用,简化了智能产品离线人脸识别的实现,当然处理器和运行时环境只是所需的系统解决方案的一部分。除了需要一套较为完整的系统组件外,有效的身份验证解决方案还需要具备成像能力,以减轻一种称为呈现攻击的安全威胁。这些攻击试图通过使用照片来欺骗人脸识别身份验证。对于希望在自己的产品中快速部署基于人脸的身份验证的开发人员来说,NXP SLN-VIZNAS-IOT 开发套件和相关软件为离线防欺骗人脸识别的评估、原型设计和开发提供了一个随时可用的平台。

完整的人脸识别安全系统解决方案

与大多数先进的处理器一样,i.MX RT106F 处理器只需要一些额外的组件就可以提供一个有效的计算平台。NXP SLN-VIZNAS-IOT 套件通过将 i.MX RT106F 与其他设备集成在一起来完成设计,是一个完整的硬件平台(图 3)。

NXP SLN-VIZNAS-IOT 套件原理图(点击放大)图 3:NXP SLN-VIZNAS-IOT 套件包括一个连接模块,提供了一个运行身份验证软件所需的强大联网系统平台。(图片来源:NXP)

该套件的连接模块板结合了 NXP MIMXRT106FDVL6A i.MX RT106F 处理器、NXP A71CH 安全元件和两个连接选择:NXP 的 MKW41Z512VHT4 Kinetis KW41Z 低功耗蓝牙 (BLE) 片上系统 (SoC) 和 Murata ElectronicsLBEE5KL1DX-883 Wi-Fi/蓝牙模块。

为了补充处理器片上存储器的不足,连接模块增加了 Winbond ElectronicsW9825G6JB 256 兆位 (Mb) 同步动态 RAM (SDRAM)、Integrated Silicon Solution. Inc. (ISSI) 的 IS26KL256S-DABLI00 256 Mb NOR 闪存以及 ISSI 的 IS25LP256D 256 Mb 四通道串行外设接口 (SPI) 器件。

最后,该模块增加了一个 Torex Semiconductor XCL214B333DR 降压转换器,以补充 i.MX RT106F 处理器的内部电源管理功能,用于连接模块板上的其它设备。

连接模块转而安装在视觉应用板上,后者则结合了 Murata Electronics IRA-S210ST01被动红外 (PIR) 传感器、运动传感器、电池充电器、音频支持、发光二极管 (LED)、按钮和接口连接器(图 4)。

NXP SLN-VIZNAS-IOT 套件图片(点击放大)图 4:在 NXP SLN-VIZNAS-IOT 套件中,连接模块(左)连接到视觉应用板上,为人脸识别提供硬件基础。(图片来源:NXP)

除了这个系统平台,人脸识别系统设计显然还需要一个合适的摄像头传感器来捕捉用户的面部图像。然而,如前所述,对呈现攻击的担忧需要额外的成像能力。

化解呈现攻击

多年来,研究人员一直在探索不同的呈现攻击检测 (PAD) 方法,旨在化解诸如使用隐藏指纹或人脸图像来欺骗基于生物识别的身份验证系统的企图。虽然细节远远超出了本文的范围,但一般来说,PAD 方法使用的是对采集的生物识别数据的质量和特征的深度分析,以及旨在确定生物识别数据是否从活人身上采集而来的“活体”检测方法。在许多不同方法的基础上,深度神经网络 (DNN) 模型不仅在人脸识别中发挥了重要作用,而且在识别欺骗系统的企图方面也发挥了重要作用。尽管如此,用于捕捉用户面部的成像系统是可以提供额外活体检测支持的。

对于 SLN-VIZNAS-IOT 套件,NXP 包括了摄像头模块,内含一对 On Semiconductor MT9M114 图像传感器。在这里,一个摄像头装有红绿蓝 (RGB) 滤镜,另一个摄像头装有红外 (IR) 滤镜。RGB 摄像头通过摄像头接口连接到视觉应用板上,可生成正常的可见光图像,而红外摄像头捕捉到的图像对于活人来说是不同的。利用这种活体检测方法及其内部的人脸识别能力,SLN-VIZNAS-IOT 套件在尺寸约为30×40 毫米 (mm) 的封装中实现了离线、防欺骗的人脸识别能力(图 5)。

NXP SLN-VIZNAS-IOT 硬件套件图片图 5:NXP SLN-VIZNAS-IOT 硬件套件将用于活体检测(上)和视觉应用板(下)的双摄像头系统与连接模块集成在一起,提供了一个具有防欺骗能力的即插即用型离线人脸识别解决方案。(图片来源:NXP)

SLN-VIZNAS-IOT 套件使用入门

NXP SLN-VIZNAS-IOT 套件内置人脸识别模型,可随时使用。开发人员插入 USB 电缆,触摸套件上的按钮,使用预装的 "elock" 应用程序和配套的移动 APP 进行简单的手动人脸注册(图 6,左)。注册后,在套件对注册的人脸进行身份验证时,移动 APP 会显示“welcome home”消息和“unlocked”标签(图 6,右)。

NXP SLN-VIZNAS-IOT 硬件套件开箱即用图片图 6:NXP SLN-VIZNAS-IOT 硬件套件开箱即用,利用配套 APP 注册人脸(左)并识别注册的人脸(右)。(图片来源:NXP)

该套件的 Oasis Lite 人脸识别软件可从其数据库处理多达 3000 张 RGB 人脸模型,识别准确率高达 99.6%,红外人脸最多 100 张,防欺骗准确率高达 96.5%。如前所述,NXP 的硬件/软件解决方案只需要不到一秒的时间,就能完成 0.2 米到 1.0米范围内的人脸检测、图像对齐、质量检查、活体检测和识别。事实上,该系统支持一个备用的”光“推理模型,能够在不到 0.5 秒的时间内执行这个相同的序列,但支持的最大数据库量较小,即 1000 个 RGB 人脸和 50 个红外人脸。

构建定制人脸识别应用

NXP SLN-VIZNAS-IOT 套件只需按原样使用,即可让开发人员快速对人脸识别应用进行评估、原型设计和开发。在创建定制硬件解决方案时,该套件可作为一个完整的参考设计使用,并提供完整的原理图和详细的物料清单 (BOM)。在软件开发方面,程序员可以使用带有 FreeRTOS 支持和配置工具的 NXP MCUXpresso 集成开发环境 (IDE)。对于人脸识别应用,开发人员只需使用 NXP 的在线 MCUXpresso SDK Builder 并通过 NXP 的 VIZNAS SDK 即可完成软件开发环境配置,后者包括了 NXP Oasis Lite 机器学习视觉引擎(图 7)。

NXP 提供了一个全面的软件环境原理图图 7:NXP 提供了一个全面的软件环境,可在 FreeRTOS 操作系统上执行 NXP Oasis Lite 运行时库和实用程序中间件。(图片来源:NXP)

该软件包中包含了操作环境的完整源代码,以及前面提到的 elock 示例应用程序。NXP 不针对其专有 Oasis Lite 引擎或模型提供源代码。取而代之的是,开发人员可通过提供的应用编程接口 (API) 来使用 Oasis Lite 运行时库。该 API 包括一组直观的函数调用,以执行支持的操作。此外,开发人员可使用提供的一组 C 定义和结构来指定各种参数,具体包括图像大小、内存分配、回调和系统在启动 Oasis Lite 运行时环境时使用的启用函数(清单 1)。

副本
typedef struct {
    //max input image height, width and channel, min_face: minimum face can be detected
    int height;
    int width;
  
    //only valid for RGB images; for IR image, always GREY888 format
    OASISLTImageFormat_t img_format;
    OASISLTImageType_t img_type;
  
    //min_face should not smaller than 40
    int min_face;
  
    /*memory pool pointer, this memory pool should only be used by OASIS LIB*/
    char* mem_pool;
  
    /*memory pool size*/
    int size;
  
    /*output parameter,indicate authenticated or not*/
    int auth;
  
    /*callback functions provided by caller*/
    InfCallbacks_t cbs;
  
    /*what functions should be enabled in OASIS LIB*/
    uint8_t enable_flags;
  
    /*only valid when OASIS_ENABLE_EMO is activated*/
    OASISLTEmoMode_t emo_mode;
  
    /*false accept rate*/
    OASISLTFar_t false_accept_rate;
  
    /*model class */
    OASISLTModelClass_t mod_class;
  
} OASISLTInitPara_t;

清单 1:开发人员可以通过修改结构的内容来修改软件执行参数,如上所示为用于 Oasis Lite 运行时初始化的代码。(代码来源:NXP)

elock 示例应用代码展示了用于以下操作的关键设计模式:作为 FreeRTOS 下运行任务启动 Oasis,初始化环境,以及进入正常运行阶段。在运行阶段,运行时环境对图像的每一帧进行操作,执行提供的与环境中定义的每个事件相关的回调函数(清单 2)。

副本
typedef enum {
    /*indicate the start of face detection, user can update frame data if it is needed.
     * all parameter in callback parameter is invalid.*/
    OASISLT_EVT_DET_START,
  
    /*The end of face detection.
     *if a face is found, pfaceBox(OASISLTCbPara_t) indicated the rect(left,top,right,bottom point value)
     *info and landmark value of the face.
     *if no face is found,pfaceBox is NULL, following event will not be triggered for current frame.
     *other parameter in callback parameter is invalid */
    OASISLT_EVT_DET_COMPLETE,
  
    /*Face quality check is done before face recognition*/
    OASISLT_EVT_QUALITY_CHK_START,
    OASISLT_EVT_QUALITY_CHK_COMPLETE,
  
    /*Start of face recognition*/
    OASISLT_EVT_REC_START,
  
    /*The end of face recognition.
     * when face feature in current frame is gotten, GetRegisteredFaces callback will be called to get all
     * faces feature registered and OASIS lib will try to search this face in registered faces, if this face
     * is matched, a valid face ID will be set in callback parameter faceID and corresponding simularity(indicate
     * how confidence for the match) also will be set.
     * if no face match, a invalid(INVALID_FACE_ID) will be set.*/
    OASISLT_EVT_REC_COMPLETE,
  
    /*start of emotion recognition*/
    OASISLT_EVT_EMO_REC_START,
  
    /*End of emotion recognition, emoID indicate which emotion current face is.*/
    OASISLT_EVT_EMO_REC_COMPLETE,
  
    /*if user set a registration flag in a call of OASISLT_run and a face is detected, this two events will be notified
     * for auto registration mode, only new face(not recognized) is added(call AddNewFace callback function)
     * for manu registration mode, face will be added forcely.
     * for both cases, face ID of new added face will be set in callback function */
    OASISLT_EVT_REG_START,
    /*when registration start, for each valid frame is handled,this event will be triggered and indicate
     * registration process is going forward a little.
     * */
    OASISLT_EVT_REG_IN_PROGRESS,
    OASISLT_EVT_REG_COMPLETE,
    OASISLT_EVT_NUM
  
} OASISLTEvt_t;

清单 2:Oasis Lite 运行时识别一系列事件,并在 Oasis Lite 运行时头文件中记录为一个枚举集。(代码来源:NXP)

该示例应用程序可以为开发人员提供一步步的调试消息,描述与事件句柄 (EvtHandler) 所处理的每个事件相关的结果。例如,在质量检查完成后 (OASISLT_EVT_QUALITY_CHK_COMPLETE),系统会打印出描述结果的调试信息,在人脸识别完成后 (OASISLT_EVT_REC_COMPLETE),系统会从其数据库调出识别到的人脸的用户 ID 和姓名,并打印出这些信息(清单 3)。

副本
static void EvtHandler(ImageFrame_t *frames[], OASISLTEvt_t evt, OASISLTCbPara_t *para, void *user_data)
{
[code redacted for simplification]
        case OASISLT_EVT_QUALITY_CHK_COMPLETE:
        {
            UsbShell_Printf("[OASIS]:quality chk res:%d\r\n", para->qualityResult);
  
            pQMsg->msg.info.irLive  = para->reserved[5];
            pQMsg->msg.info.front   = para->reserved[1];
            pQMsg->msg.info.blur    = para->reserved[3];
            pQMsg->msg.info.rgbLive = para->reserved[8];
  
            if (para->qualityResult == OASIS_QUALITY_RESULT_FACE_OK_WITHOUT_GLASSES ||
                para->qualityResult == OASIS_QUALITY_RESULT_FACE_OK_WITH_GLASSES)
            {
                UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]:ok!\r\n");
            }
            else if (OASIS_QUALITY_RESULT_FACE_SIDE_FACE == para->qualityResult)
            {
                UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]:side face!\r\n");
            }
            else if (para->qualityResult == OASIS_QUALITY_RESULT_FACE_TOO_SMALL)
            {
                UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]:Small Face!\r\n");
            }
            else if (para->qualityResult == OASIS_QUALITY_RESULT_FACE_BLUR)
            {
                UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]: Blurry Face!\r\n");
            }
            else if (para->qualityResult == OASIS_QUALITY_RESULT_FAIL_LIVENESS_IR)
            {
                UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]: IR Fake Face!\r\n");
            }
            else if (para->qualityResult == OASIS_QUALITY_RESULT_FAIL_LIVENESS_RGB)
            {
                UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]: RGB Fake Face!\r\n");
            }
        }
        break;
[code redacted for simplification]
        case OASISLT_EVT_REC_COMPLETE:
        {
            int diff;
            unsigned id                     = para->faceID;
            OASISLTRecognizeRes_t recResult = para->recResult;
  
            timeState->rec_comp = Time_Now();
            pQMsg->msg.info.rt  = timeState->rec_start - timeState->rec_comp;
            face_info.rt        = pQMsg->msg.info.rt;
#ifdef SHOW_FPS
            /*pit timer unit is us*/
            timeState->rec_fps++;
            diff = abs(timeState->rec_fps_start - timeState->rec_comp);
            if (diff > 1000000 / PIT_TIMER_UNIT)
            {
                // update fps
                pQMsg->msg.info.recognize_fps = timeState->rec_fps * 1000.0f / diff;
                timeState->rec_fps            = 0;
                timeState->rec_fps_start      = timeState->rec_comp;
            }
#endif
            memset(pQMsg->msg.info.name, 0x0, sizeof(pQMsg->msg.info.name));
  
            if (recResult == OASIS_REC_RESULT_KNOWN_FACE)
            {
                std::string name;
                UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[OASIS]:face id:%d\r\n", id);
                DB_GetName(id, name);
                memcpy(pQMsg->msg.info.name, name.c_str(), name.size());
                face_info.recognize = true;
                face_info.name      = std::string(name);
                UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[OASIS]:face id:%d name:%s\r\n", id, pQMsg->msg.info.name);
            }
            else
            {
                // face is not recognized, do nothing
                UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[OASIS]:face unrecognized\r\n");
                face_info.recognize = false;
            }
  
            VIZN_RecognizeEvent(gApiHandle, face_info);
        }
        break;

清单 3:如 NXP 软件包中提供的一个示例应用程序的片段所示,一个事件处理程序句柄可处理在人脸识别序列中遇到的事件。(代码来源:NXP)

除了支持人脸识别处理需求外,NXP SLN-VIZNAS-IOT 软件还对操作环境进行了保护。为了确保运行时的安全性,系统被设计成使用存储在 SLN-VIZNAS-IOT 套件文件系统中的证书来验证加载到系统中的每个签名图像的完整性和真实性。由于这个验证序列是从存储在只读存储器 (ROM) 中的可信引导程序开始的,因此这个过程为运行应用固件提供了一个信任链。另外,由于代码签名和验证会减慢开发速度,所以在软件设计和调试过程中,这个验证过程被设计成绕过。事实上,SLN-VIZNAS-IOT 套件预装了已签名图像,但默认绕过了代码签名验证。开发者可以轻松地设置选项,以实现用于生产的完整代码签名验证。

除了运行时环境和相关的应用示例代码,NXP 还为 Android 移动 APP 提供了完整的 java 源代码。其中一个名为 VIZNAS FaceRec Manager 的 APP 提供了一个简单的界面,用于注册人脸和管理用户。另一个 VIZNAS Companion APP 则允许用户使用现有的 Wi-Fi 或 BLE 连接为套件提供 Wi-Fi 凭证。

结语

人脸识别为智能产品的身份验证访问提供了一种有效的方法,但实现它通常需要在本地进行高性能计算,或提供始终在线的高带宽连接进行快速响应。这种技术也一直是被欺骗的目标,存在让人担忧的用户隐私问题。

如本文所述,NXP Semiconductors 的专用处理器和软件库提供了一种替代方法,可以在没有云端连接的情况下,在不到一秒的时间内准确地执行离线人脸识别,同时化解了欺骗企图。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Stephen Evanczuk

Stephen Evanczuk 拥有 20 多年的电子行业编辑经验,主题涉猎广泛,涵盖硬件、软件、系统以及包括物联网在内的各种应用。他拥有神经网络领域的神经科学博士学位,曾经从事航空航天领域大规模分布式安全系统和算法加速方法方面的工作。目前,他不是在撰写技术和工程文章,就是在研究深度学习在识别和推荐系统方面的应用。

关于此出版商

DigiKey 北美编辑