前言:
今天各位老铁们对“人脸识别编程中选取文件的功能块是什么”可能比较讲究,各位老铁们都想要分析一些“人脸识别编程中选取文件的功能块是什么”的相关知识。那么小编同时在网上收集了一些有关“人脸识别编程中选取文件的功能块是什么””的相关内容,希望大家能喜欢,大家快快来了解一下吧!原创: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),而像MIMXRT106FDVL6A 和 MIMXRT106FDVL6B这样的商用级处理器的运行频率为600MHz。
除了支持多种外部存储器接口外,i.MX RT106F处理器还包括1兆字节 (Mb) 的片上随机存取存储器(RAM),其中512千字节 (Kb) 配置为通用RAM,512Kb既可配置为通用RAM,也可配置为用于指令 (I-TCM) 或数据 (D-TCM) 的紧耦合存储器 (TCM)。除了片上电源管理,这些处理器还提供了一系列广泛的集成功能,用于图形、安全、系统控制,以及支持消费设备、工业人机界面 (HMI) 和电机控制一般需要的模拟和数字接口(图1)。
图1:NXP Semiconductor的i.MX RT106F处理器结合了支持消费、工业和安全产品人脸识别所需的全套功能块。
虽然与其他i.MX RT1060家族成员类似,但i.MX RT106F处理器捆绑了NXP的Oasis Lite人脸识别软件运行时许可。Oasis Lite运行时环境旨在加快这一类处理器的推理速度,它使用在推理引擎和MiniCV(开源OpenCV计算机视觉库的简化版)上运行的神经网络 (NN) 推理模型执行人脸检测、识别,甚至是有限的情感分类。该推理引擎构建在NXP NN库和Arm Cortex微控制器系统接口标准NN (CMSIS-NN) 库的基础上(图2)。
图2:NXP Oasis Lite运行时库包括一个使用MiniCV的Oasis Lite内核
和一个基于NXP和Arm神经网络库构建的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)。
图3:NXP SLN-VIZNAS-IOT套件包括一个连接模块,提供了一个运行身份验证软件所需的强大联网系统平台。
该套件的连接模块板结合了NXP MIMXRT106FDVL6A i.MX RT106F处理器、NXP A71CH安全元件和两个连接选择:NXP的 MKW41Z512VHT4 Kinetis KW41Z低功耗蓝牙 (BLE) 片上系统 (SoC) 和 Murata Electronics的 LBEE5KL1DX-883 Wi-Fi/蓝牙模块。
为了补充处理器片上存储器的不足,连接模块增加了Winbond Electronics的W9825G6JB 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)。
图4:在NXP SLN-VIZNAS-IOT套件中,连接模块(左)连接到视觉应用板上,为人脸识别提供硬件基础。
除了这个系统平台,人脸识别系统设计显然还需要一个合适的摄像头传感器来捕捉用户的面部图像。然而,如前所述,对呈现攻击的担忧需要额外的成像能力。
化解呈现攻击
多年来,研究人员一直在探索不同的呈现攻击检测 (PAD) 方法,旨在化解诸如使用隐藏指纹或人脸图像来欺骗基于生物识别的身份验证系统的企图。虽然细节远远超出了本文的范围,但一般来说,PAD方法使用的是对采集的生物识别数据的质量和特征的深度分析,以及旨在确定生物识别数据是否从活人身上采集而来的“活体”检测方法。在许多不同方法的基础上,深度神经网络 (DNN) 模型不仅在人脸识别中发挥了重要作用,而且在识别欺骗系统的企图方面也发挥了重要作用。尽管如此,用于捕捉用户面部的成像系统是可以提供额外活体检测支持的。
对于SLN-VIZNAS-IOT套件,NXP包括了摄像头模块,内含一对On Semiconductor MT9M114图像传感器。在这里,一个摄像头装有红绿蓝 (RGB) 滤镜,另一个摄像头装有红外 (IR) 滤镜。RGB摄像头通过摄像头接口连接到视觉应用板上,可生成正常的可见光图像,而红外摄像头捕捉到的图像对于活人来说是不同的。利用这种活体检测方法及其内部的人脸识别能力,SLN-VIZNAS-IOT套件在尺寸约为30×40毫米 (mm) 的封装中实现了离线、防欺骗的人脸识别能力(图5)。
图5:NXP SLN-VIZNAS-IOT硬件套件将用于活体检测(上)和视觉应用板(下)的双摄像头系统与连接模块集成在一起,提供了一个具有防欺骗能力的即插即用型离线人脸识别解决方案。
SLN-VIZNAS-IOT套件使用入门
NXP SLN-VIZNAS-IOT套件内置人脸识别模型,可随时使用。开发人员插入USB电缆,触摸套件上的按钮,使用预装的 "elock" 应用程序和配套的移动APP进行简单的手动人脸注册(图6,左)。注册后,在套件对注册的人脸进行身份验证时,移动APP会显示“welcome home”消息和“unlocked”标签(图6,右)。
图 6:NXP SLN-VIZNAS-IOT 硬件套件开箱即用,利用配套 APP 注册人脸(左)并识别注册的人脸(右)。
该套件的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)。
图7:NXP提供了一个全面的软件环境,可在FreeRTOS操作系统上执行NXP Oasis Lite运行时库和实用程序中间件。
该软件包中包含了操作环境的完整源代码,以及前面提到的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 的专用处理器和软件库提供了一种替代方法,可以在没有云端连接的情况下,在不到一秒的时间内准确地执行离线人脸识别,同时化解了欺骗企图。
最后,如果你喜欢这篇文章,快分享给更多的小伙伴吧! 切记点个赞哦!
标签: #人脸识别编程中选取文件的功能块是什么