恩智浦标志

NXP AN14263 在 Framewor 上实现 LVGL GUI 人脸识别

NXP-AN14263-在框架产品上实现 LVGL-GUI 人脸识别

产品信息

规格

  • 产品名称: LVGL GUI 人脸识别框架
  • 文档修订: 1 年 19 月 2024 日至 XNUMX 日
  • 关键字: 人脸识别、LVGL GUI、框架

产品使用说明

  1. 超过view
    该产品在一个框架上启用用于人脸识别的AI&ML视觉算法模型,通过简单的LVGL GUI ex实现人脸识别功能ampSLN-TLHMI-IOT 板上的文件。
  2. 框架结束view
    该解决方案软件是围绕框架架构设计的,其中包括负责管理设备的设备管理器、抽象底层细节的 HAL 设备以及用于不同设备之间通信的事件。
  3. 特征
    该产品可以通过摄像头实现人脸识别功能view GUI 屏幕上带有触发人脸注册、识别和删除的按钮。注册的人脸数据通过a存储在Flash上 file 系统。
  4. 应用笔记内容
    该应用说明介绍了带有摄像头预置功能的 LVGL GUI 屏幕view 以及与面部相关的操作的按钮。它帮助开发人员了解框架以及如何使用提供的ex来实现人脸识别amp勒。

超过view

恩智浦推出了一款名为SLN-TLHMI-IOT的解决方案开发套件,专注于智能HMI应用。它支持在 NXP i.MX RT117H MCU 上实现的智能 HMI,并具有 ML 视觉、语音和图形 UI。解决方案软件基于SDK构建在一个称为框架的设计上,支持视觉和语音功能的灵活设计和定制。为了帮助用户更好地使用软件平台,提供了一些基础文档,例如ample,软件开发用户指南。该指南介绍了应用程序的基本软件设计和架构,涵盖了解决方案的所有组件,包括帮助开发人员更轻松、高效地使用 SLN-TLHMI-IOT 实施其应用程序的框架。
了解更多解决方案及相关文档,请访问 web 基于 i.MX RT117H 的 NXP EdgeReady 智能 HMI 解决方案页面,具有 ML 视觉、语音和图形 UI。然而,对于开发者来说,参考这些基本指南来实现他们的智能HMI应用程序仍然不是那么容易。计划推出一系列应用笔记来帮助逐步研究该框架的开发。本应用笔记基于实现 LVGL GUI Camera Preview 框架(文档 AN14147)。本应用笔记介绍了如何在框架上启用人脸识别的AI&ML视觉算法模型,通过摄像头预置实现人脸识别功能。view 在 GUI 屏幕上使用简单的 LVGL GUI exampSLN-TLHMI-IOT 板上的文件。在应用说明中,前ample 展示了带有摄像头预置的 LVGL GUI 屏幕view 以及一些触发人脸注册、识别和删除的按钮。注册的人脸数据通过一点点存储在Flash中 file 系统。

概括地说,该应用笔记包含以下内容:

  • 在框架上启用人脸识别功能。
  • 通过在框架上添加人脸数据库支持 file 闪存上的系统。
  • 实施 LVGL GUI 应用程序。通过以上介绍,本文档帮助开发者:
  • 更深入地了解框架和智能HMI解决方案软件。
  • 使用 LVGL GUI 应用程序在框架上开发 AI 和 ML 人脸识别。

框架结束view
该解决方案软件主要是围绕框架架构的使用而设计的,该框架架构由几个不同的部分组成:

  • 设备管理器——核心部分
  • 硬件抽象层 (HAL) 设备
  • 消息/事件

如图1所示,以上view 该框架的机制是:

设备管理器负责管理系统使用的设备。每种设备类型(输入、输出等)都有其自己的特定于类型的设备管理器。设备管理器在设备注册后启动,在初始化和启动注册设备后,它等待并检查消息以将数据传输到设备和其他管理器。 HAL 设备是在较低级别的驱动程序代码之上编写的,通过抽象许多底层细节来帮助提高代码的可理解性。

事件是通过其管理器在不同设备之间传递信息的一种方式。当事件被触发时,首先接收到该事件的设备将该事件传送给其管理器,然后依次通知指定接收该事件的其他管理器。

NXP-AN14263-在 Framewor-fig 上实现 LVGL-GUI 人脸识别- (1)

该框架的架构设计围绕三个主要目标:

  1. 易于使用
  2. 灵活性/便携性
  3. 表现

该框架的设计目标是加快视觉和其他机器学习应用程序的上市时间。为了确保快速上市,软件本身易于理解和修改至关重要。牢记这一目标,框架的架构很容易修改,不受限制,并且不会以性能为代价。
有关该框架的更多详细信息,请参阅智能 HMI 软件开发用户指南(文档 MCU-SMHMI-SDUG)。

轻巧且多功能的图形库 (LVGL)
LVGL(轻型多功能图形库)是一个免费的开源图形库,提供创建嵌入式 GUI 所需的一切,具有易于使用的图形元素、美观的视觉效果和低内存占用。

图形用户界面向导
GUI Guider 是 NXP 推出的一款用户友好的图形用户界面开发工具,可利用开源 LVGL 图形库快速开发高质量显示器。 GUI Guider 的拖放编辑器使您可以轻松使用 LVGL 的许多功能(例如小部件、动画和样式)来创建 GUI,只需最少的编码或根本无需编码。

只需单击按钮,您就可以在模拟环境中运行应用程序或将其导出到目标项目。 GUI Guider 生成的代码可以轻松添加到您的项目中,从而加速开发过程,并允许您将嵌入式用户界面无缝添加到您的应用程序中。 GUI Guider 可免费与 NXP 的通用和跨界 MCU 配合使用,并包含适用于多个受支持平台的内置项目模板。要了解有关 GUI Guider 上的 LVGL 和 GUI 开发的更多信息,请查看 Light and Versatile Graphics Library 和 GUI Guider。

开发环境

一、准备并搭建实施扩展的软硬件环境ample关于框架。

硬件环境
硬件环境搭建用于验证examp乐:

  • 基于NXP i.MX RT117H的智能HMI开发套件(SLN_TLHMI_IOT套件)
  • SEGGER J-Link 带有 9 针 Cortex-M 适配器和 V7.84a 或更新版本的驱动程序

软件环境
软件环境是为开发ex而搭建的amp乐:

  • MCUXpresso IDE V11.7.0
  • GUI引导器V1.6.1-GA
  • lvgl_gui_camera_preview_cm7 – 前amp第二个应用笔记的文件代码作为开发的基础软件。详细信息请参见 https://mcuxpresso.nxp.com/appcodehub.
  • RT1170 SDK V2.13.0 – 作为开发的代码资源。
  • SLN-TLHMI-IOT软件V1.1.2 – 智能HMI源代码发布在NXP GitHub存储库上,作为开发的代码资源。有关详细信息,请参阅:GitHub – NXP/mcu-smhmi v1.1.2

软件环境的获取和设置请参见:SLN-TLHMI-IOT入门。

框架上的视觉架构

该框架上的视觉架构如图2所示。视觉算法HAL(OASIS_HAL)有以下流程:

  • 接收到输出UI HAL的相关事件后,通过AI&ML视觉算法模型进行人脸注册和识别。将算法模型的推理结果通知给输出UI HAL。
  • 基于小数据访问(添加、删除……)人脸特征数据库 file 系统在接收到来自输出 UI HAL 的相关事件后,调用 FaceDB HAL 的 API。
  • 进行人脸注册和识别时,向相机HAL请求相机视频帧。

NXP-AN14263-在 Framewor-fig 上实现 LVGL-GUI 人脸识别- (3)

在框架上实现人脸识别

LVGL GUI人脸识别扩展amp乐(前ample稍后提供)上的框架是基于ex实现的amp实现 LVGL GUI Camera Pre 的文件代码view 框架(文档 AN14147)。

用于演示前场中的人脸识别amp在该文件中,GUI 应用程序的基本功能(参见图 3 中的主屏幕)设计如下:

  • 单击“注册”或“识别”按钮时,GUI 应用程序会触发输出 UI HAL 的人脸注册或识别事件。并且输出UI HAL通知人脸注册成功后将用户添加到视觉算法HAL的事件。
  • 当识别到用户的脸部后单击“删除用户”按钮时,GUI 应用程序会触发删除用户的事件到输出 UI HAL。
  • 当单击按钮和图像之外的屏幕时,GUI 应用程序会触发停止 oasis 算法运行到输出 UI HAL 的事件。

NXP-AN14263-在 Framewor-fig 上实现 LVGL-GUI 人脸识别- (10)

准备实施ex的软件包amp勒。

  • 克隆基础软件lvgl_gui_camera_preview_cm7。更改项目名称和主目录 file命名为lvgl_gui_face_rec_cm7。
  • 由于框架核心的源代码从1.1.2版本开始在GitHub上公开,因此需要在软件中更新框架。
  • 将框架文件夹替换为来自 GitHub 的 V1.1.2 副本,除了 fileinc\ 下的 fwk_log.h 和 fwk_common.h,因为它们已针对应用笔记系列进行了修改。操作如图4所示:NXP-AN14263-在 Framewor-fig 上实现 LVGL-GUI 人脸识别- (11)
  • 删除libs组下的framework_cm7文件夹,并删除Project > Properties > C/C++ Build > settings > Tool Settings > MCU C++ Linker > Libraries中配置的库framework_cm7及其搜索路径,因为提供了核心的源代码。

在框架上启用人脸识别功能
人脸识别功能建立在以静态库形式提供的 ML 视觉算法模型之上——NXP 的 oasis lite 运行时库。该库是一个微型、高效、定制、优化的AI库。该模型包括人脸检测、人脸识别、玻璃检测和活体检测。主要提供API OASISLT_run_extend()来运行人脸识别管道,同时通过事件回调将结果更新给调用者,并在指定源帧信息、回调和内存后通过人脸数据库回调在数据库中添加/更新/删除人脸库通过在初始化时调用另一个 API OASISLT_init() 来使用池。 API的调用和回调函数在框架的视觉算法HAL中实现。

添加视觉算法模型库

  1. 复制包含库和相关标头的文件夹 oasis file 从 smart HMI\coffee_machine\cm7\libs\ 进入 ex 的文件夹 libsamp勒西南。
  2. 添加header的搜索路径 file 在项目 > 属性 > C/C++ 构建 > 设置 > 工具设置 > MCU C 编译器 > 包含和 MCU C++ 编译器 > 包含:“${workspace_loc:/${ProjName}/libs/oasis/include}”
  3. 在项目 > 属性 > C/C++ 构建 > 设置 > MCU C++ 链接器 > 库中添加库及其搜索路径:liboasis_lite2D_DEFAULT_117f_ae.a“${workspace_loc:/${ProjName}/libs/oasis}”和宏定义以在项目 > 属性 > C/C++ 构建 > 设置 > 工具设置 > MCU C 编译器 > 预处理器和 MCU C++ 编译器 > 预处理器中启用该功能:SMART_TLHMI_2D

启用视觉算法 HAL
视觉算法HAL驱动视觉算法模型工作,并在收到来自UI输出HAL的事件后将结果响应到UI输出HAL。

要启用它,请克隆现有的类似 HAL 驱动程序 file 其中实现了以下功能:

  • 实现人脸数据库操作和事件处理的回调。
  • 通过调用 oasis 库的 API 来驱动视觉算法工作。
  • 访问人脸数据库和应用程序数据库(ex中不需要)ample)。
  • 从输出 UI HAL 接收事件并将结果发送到输出 UI HAL。

为前实施 HAL 的主要工作amp是:

  • 克隆现有的类似HAL驱动程序 file 并更改相关名称。
  • 删除与app数据操作相关的代码。
  • 根据 ex 更新用于处理来自输出 UI HAL 的事件的定义和函数amp设计。
  • 添加oasis初始化所需的配置。

具体步骤如下:

  1. 克隆 hal_vision_algo_oasis_coffeemachine.c。改变 file命名为 hal_vision_algo_oasis_guifacerec.c。并将所有字符串 CoffeeMachine 替换为 GUIFaceRec file.
  2. 删除包含与应用程序数据库相关的字符串coffeedb(不区分大小写)的代码,例如ample,#include hal_sln_cofffeedb.h。
  3. 修改函数 HAL_VisionAlgoDev_OasisGUIFaceRec_InputNotify() 以处理来自输出 UI HAL 的事件。
    • 将事件定义 kEventFaceRecId_RegisterCoffeeSelection 更改为 kEventFaceRecId_RegisterUserFace,并将结构字符串 regCoffeeSelection 更改为 regGUIFaceRec,以便事件处理将新的人脸特征数据添加到数据库。
    • 展示人脸识别动作的标准流程amp文件中,使用状态定义修改 kEventFaceRecID_OasisSetState 情况下的处理:
      • kOASISLiteState
      • 注册 kOASISLiteState
      • 识别 kOASISLiteState
      • 已停止
  4. 添加和修改上一步中提到的事件的定义。
    • 复制标题 file smart_tlhmi_event_descriptor.h 从 smart HMI\coffee_machine \cm7\source\event_handlers\ 进入 ex 的文件夹源amp勒西南。更新 file 如下:
    • 将枚举类型 _event_smart_tlhmi_id 中的事件定义 kEventFaceRecId_RegisterCoffeeSelection 更改为 kEventFaceRecId_RegisterUserFace,将结构体字符串 regCoffeeSelection 更改为 struct _event_smart_tlhmi 中的 regGUIFaceRec。因此,将 regCoffeeSelection 的结构体 register_coffee_selection_event_t 更改为 register_gui_facerec_event_t。
    • 删除用于咖啡机应用程序的其他内容,例如ample,有关语音的代码行:#include“hal_event_descriptor_voice.h”。
    • 将类型 kOASISLiteState_Stopped 和 kOASISLiteState_Running 添加到项目中 Framework>hal>vision 下 hal_vision_algo.h 中的枚举类型 oasis_lite_state_t 中,如下所示:
      typedef 枚举_oasis_lite_state {
      • kOASISLiteState
      • 正在运行,kOASISLiteState
      • 已停止,kOASISLiteState
      • 认出,
      • kOASISLiteState
      • 注册,kOASISLiteState
      • 注销,kOASISLiteState
      • 远程注册、kOASISLiteState
      • 数数
    • 使用上面更新的struct oasis_lite_state_t来细化项目中framework>hal>vision下hal_event_descriptor_face_rec.h中的struct oasis_state_event_t,如下所示: oasis_state_event_t;
  5. 将所有 kEventInfo_Remote 更改为 kEventInfo_Local,以便将事件从视觉算法 HAL 发送到在同一内核上运行的其他 HAL,因为在 ex 中使用单核而不是双核amp勒。
  6. 在 OASISLT_init() 中添加并修改以下 oasis 初始化配置:
    • 在board_define.h中添加视频帧的宏定义和内存部分:#define OASIS_RGB_FRAME_WIDTH 800
      • #定义OASIS_RGB_FRAME_HEIGHT 600
      • #define OASIS_RGB_FRAME_SRC_FORMAT kPixelFormat_YUV1P444_RGB
      • #define OASIS_RGB_FRAME_BYTE_PER_PIXEL 3
      • #define AT_FB_SHMEM_SECTION_ALIGN(var,alignbytes)\
      • __attribute__((section(“.bss.$fb_sh_mem,\”aw\”,%nobits @”))) var
      • __attribute__((对齐(alignbytes)))
    • 在 Project > Properties > C/C++ Build > MCU Settings 上将内存分配配置为上述内存部分 fb_sh_mem,如图 5 所示:NXP-AN14263-在 Framewor-fig 上实现 LVGL-GUI 人脸识别- (12)
    • 在 lvgl_gui_face_rec_cm7.cpp 中声明全局变量 g_DTCOPBuf:AT_NONCACHEABLE_SECTION_ALIGN_DTC (uint8_t g_DTCOPBuf[DTC_OPTIMIZE_BUFFER_SIZE], 4);
    • 继续添加上面变量中使用的定义:
    • 在board_define.h中定义上述部分:
      • #define AT_NONCACHEABLE_SECTION_ALIGN_DTC(var,alignbytes)\
      • attribute__((section(“.bss.$SRAM_DTC_cm7,\”aw\”,%nobits @”))) var
      • 属性__((对齐(alignbytes)))
    • 包括标题 file hal_vision_algo.h 包含lvgl_gui_face_rec_cm7.cpp 中app_config.h 中的宏定义DTC_OPTIMIZE_BUFFER_SIZE。
  7. 将变量 s_debugOption 设置为 true 以显示人脸识别的进度状态。
  8. 添加header的搜索路径 file项目 > 属性 > C/C++ 构建 > 设置 > 工具设置 > MCU C 编译器 > 包含和 MCU C++ 编译器 > 包含:“${workspace_loc:/${ProjName}/framework/hal/vision}”
  9. 在 board_define.h 中添加以下定义以启用视觉算法 HAL:#define ENABLE_VISIONALGO_DEV_Oasis_GUIFaceRec

启用输出 UI HAL
输出 UI HAL 将事件通知给视觉算法 HAL,并响应视觉算法 HAL 的推理结果。对于 GUI 应用程序,事件通常由应用程序触发,结果显示在应用程序上。

要启用它,请克隆现有的类似 HAL 驱动程序 file 通常实现以下功能:

  • 通知人脸识别和数据库访问的事件。
  • 实现 GUI 应用程序的回调以触发事件。
  • 处理视觉算法模块的推理结果。
  • 通过计时器和面部引导矩形控制的进度条在 UI 上显示事件处理的过程和结果。

为前实施 HAL 的主要工作amp本文档中使用的文件是:

  • 克隆现有的类似HAL驱动程序 file 并更改相关名称。
  • 删除与应用程序相关的代码。
  • 根据前例更新事件通知和结果响应的功能amp设计。
  • 添加 GUI 应用程序的回调以触发事件。

具体步骤如下:

  1. 克隆 hal_output_ui_coffee_machine.c。改变 file命名为hal_output_ui_guifacerec.c。
  2. 将中的所有字符串 CoffeeMachine 替换为 GUIFaceRec file.
  3. 删除与应用程序-咖啡机相关的代码。
    • 删除函数WakeUp()和_StandBy()以及相关代码(可以在字符串wake_up和standby中搜索它们)。
    • 删除预view HAL_OutputDev_UiGUIFaceRec_Input Notify()中处理mode事件相关代码。
    • 删除函数 UI_xxx_Callback() 以及包含与咖啡机 GUI 相关的字符串 gui_ 和 screen 的代码,除了预定义的 gui_set_virtual_face() 之外view 模式功能。
    • 删除与咖啡机应用程序相关的变量 s_IsWaitingAnotherSelection 和 s_IsWaitingRegisterSelection 涉及的所有代码。
    • 删除与语音、音频和语言相关的代码。对于前amp乐:
      • #include“hal_voice_algo_asr_local.h”,
      • #include“hal_event_descriptor_voice.h”
  4. 对于各种事件通知,请在删除之前参考函数 _StopFaceRec()、_RegisterCoffeeSelection() 和 DeregisterCoffeeSelection() 实现新函数 _OutputManagerNotify()、_SetFaceRec()、_RegisterGUIFaceRec() 和 DeregisterGUIFaceRec()。
    • _OutputManagerNotify() 实现基本事件输出函数,将事件发送到视觉算法 HAL。以下函数调用它来发送自己的事件。
    • _SetFaceRec() 发送事件 kEventFaceRecID_OasisSetState 来触发视觉算法进行人脸注册、识别并停止算法。
    • 注册成功后,_RegisterGUIFaceRec() 会发送 smart_tlhmi_event_descriptor.h 中定义的事件 kEventFaceRecId_RegisterGUIFaceRec,将人脸特征数据添加到数据库中。
    • DeregisterGUIFaceRec()在人脸识别通过时,发送事件kEventFaceRecID_DelUser从数据库中删除人脸特征数据。
  5. 更新代码以采取相应的操作,包括通过从 LVGL GUI 应用程序调用 API 来刷新 GUI,以获取函数 _InferComplete_Vision() 中人脸注册和识别的推理结果。amp乐的设计。对于前ample,当人脸注册成功后,
    • 通过调用 _FaceRecProcess_Stop() 停止显示进度;
    • 通过调用 _SetFaceRec(kOASISLiteState_Stopped) 停止人脸注册;
    • 在 GUI 上显示成功结果: gui_show_face_rec_result(kFaceRecResult_OK, s_UserId);
    • 将人脸数据注册到数据库:_RegisterUserFace(s_UserId);
  6. 添加UI回调函数来处理事件:preview、人脸注册、识别和删除用户从GUI触发。对于前ample,人脸注册回调: void UI_Registration_Callback(){ _SetFaceRec(kOASISLiteState_Registration); _FaceRecProcess_Start(); }
    • 并添加函数 _FaceRecProcess_Start() 和 _FaceRecProcess_Stop() 以显示不同事件和结果的进度和状态。
    • 更新定时器 ISR 回调函数 _SessionTimer_Callback() 以处理超时情况,方法是调用: gui_show_face_rec_result(kFaceRecResult_TimeOut, s_UserId);
  7. 在 board_define.h 中添加以下定义以启用 UI 输出 HAL: #define ENABLE_OUTPUT_DEV_UiGUIFaceRec

注意:
为了更好地呈现人脸识别功能,在输出 UI HAL 中保留显示人脸识别过程和结果的功能。功能描述如下

  • 人脸引导矩形显示蓝色,进度条显示开始人脸注册或识别的进度。
  • 人脸注册成功后,人脸引导矩形显示红色。
  • 人脸识别成功后,人脸引导矩形显示绿色。
  • 当定时器超时后操作不成功时,面部引导矩形保持蓝色,进度条显示完整进度。此时,停止人脸注册或识别。

进度条和面部引导矩形显示为内置于资源二进制文件中的图标 file 被编程到Flash中。指向 SDRAM 上图标数据的指针在输出 UI HAL 中的输出 UI HAL 设备初始化时调用的函数 LoadIcons(APP_ICONS_BASE) 中设置。它必须实现该功能的图标支持。

实现图标支持

  1. 将图标与 LVGL GUI 应用程序中使用的图像相结合来构建资源:
    • 克隆四个图标标题 file智能 HMI 中的 process_bar_240x14.h、virtual_face_blue_420x426.h、virtual_face_green_420x426.h 和 virtual_face_red_420x426.h
      \coffee machine\resource\icons\ 到ex资源文件夹下新建文件夹iconsamp勒西南。
    • 添加四个图标的搜索路径 files 在camera_pre中view_资源.txt file 在资源文件夹中,例如ample:图标../resource/icons/process_bar_240x14.h
    • 执行camera_preview_resource_build.bat 构建图像和图标资源以生成 bin file camera_preview_resource.bin 和信息 file resources_information_table.txt(参见图 6)。NXP-AN14263-在 Framewor-fig 上实现 LVGL-GUI 人脸识别- (13)
  2. 在app_config.h中定义SDRAM上的起始地址和图标的大小。该地址从 GUI 应用程序图像旁边开始。尺寸是在信息中生成的 file。 #define APP_ICONS_BASE (APP_RES_SHMEM_BASE + APP_LVGL_IMGS_SIZE) #define APP_ICONS_SIZE 0x107c40
  3. 通过在 app_config.h 中重新定义名为 res_sh_mem 的内存部分的分配大小,将其更新为 0x200000: #define RES_SHMEM_TOTAL_SIZE 0x200000 以及 Project > Properties > C/C++ Build > MCU settings 中的相应设置。
  4. 在main中的函数APP_LoadResource()中将图标大小添加到从Flash加载到SDRAM的资源总大小中 file lvgl_gui_face_rec_cm7.cpp: memcpy((void *)APP_LVGL_IMGS_BASE, pLvglImages, APP_LVGL_IMGS_SIZE + APP_ICONS_SIZE);

注意:要完成人脸识别功能,需要LVGL GUI应用程序支持。输出 UI HAL 中的 UI 回调函数由 LVGL GUI 应用程序调用,用于处理来自 UI 屏幕的事件。另一方面,输出 UI HAL 调用 LVGL GUI 应用程序中的 API 来更新 UI 以显示结果和状态。 LVGL GUI应用程序的开发相对独立,在4.3节中介绍。

4.1.5 启动人脸识别的HAL设备和管理器
启用的视觉算法 HAL 和 UI 输出 HAL 及其管理器在主程序中启动 file
lvgl_gui_face_rec_cm7.cpp在框架上开发后的转换如下:

  1. 包括标题 file 通过添加代码行与两个 HAL 管理器相关:
    • #include“fwk_output_manager.h”
    • #include“fwk_vision_algo_manager.h”
  2. 声明 HAL 设备:
    • HAL_VALGO_DEV_DECLARE(OasisGUIFaceRec);
    • HAL_OUTPUT_DEV_DECLARE(UiGUIFaceRec);
  3. 注册 HAL 设备:
    • HAL_VALGO_DEV_REGISTER(OasisGUIFaceRec, ret);
    • HAL_OUTPUT_DEV_REGISTER(UiGUIFaceRec, ret);
  4. 初始化管理器:
    • FWK_MANAGER_INIT(VisionAlgoManager, ret);
    • FWK_MANAGER_INIT(OutputManager, ret);
  5. 启动管理器:
    • FWK_MANAGER_START(VisionAlgoManager, VISION_ALGO_MANAGER_TASK_PRIORITY, ret);
    • FWK_MANAGER_START(OutputManager, OUTPUT_MANAGER_TASK_PRIORITY, ret);
  6. 定义经理任务的优先级:
    • #define VISION_ALGO_MANAGER_TASK_PRIORITY 3
    • #define OUTPUT_MANAGER_TASK_PRIORITY 1

框架添加人脸数据库支持
通过一点点访问存储在Flash上​​的人脸数据库中注册的人脸特征数据 file 系统。添加人脸数据库支持的步骤如下所述。

添加闪存驱动程序
复制Flash接口FlexSPI驱动程序 filefsl_flexspi.c 和 fsl_flexspi.h,以及数据加密驱动程序 files fsl_caam.c 和 fsl_caam.h 从路径 SDK_2_13_0_MIMXRT1170-EVK\devices \MIMRX1176\drivers\ 到 ex 的 drivers 文件夹amp勒西南。

添加板级支持

  1. 在board.h中添加用于板载Flash设备的FlexSPI的定义:
    • #定义 BOARD_FLEXSPI FLEXSPI1
    • #define BOARD_FLEXSPI_CLOCK kCLOCK_FlexSpi1
    • #define BOARD_FLEXSPI_AMBA_BASE FlexSPI1_AMBA_BASE
  2. 复制运算符和配置 file将 Flash 设备的 flexspi_nor_flash_ops.c、flexspi_nor_flash_ops.h、sln_flash_config.c、sln_flash_config_w25q256jvs.h、sln_flash_ops.h 放在 smart HMI\coffee_machine\cm7\source\flash_config\ 路径下的文件夹 board 下amp勒西南。
    • 右键单击“C/C++ 构建 > 设置”中取消选中“从构建中排除资源” files 的名称并打开属性以使它们能够内置到项目中。
  3. 更改包含的标题 file将 sln_flash_config.c 和 flexspi_nor_flash_ops.h 中的 sln_flash_config.h 命名为 sln_flash_config_w25q256jvs.h。
  4. 设置FlexSPI1时钟源 file Clock_config.c 指的是咖啡机应用程序。

添加适配器和中层支持

  1. 复制 filesln_flash.c、sln_flash.h、sln_encrypt.c 和 sln_encrypt.h 作为适配器驱动程序 file system和app从smart HMI\coffee_machine\cm7\source\路径下到ex的文件夹source下amp勒。更新新的 files:
    • 取消选中“从构建中排除资源”以进行构建。
    • 更改所有包含的标头 file 将 sln_flash_config.h 命名为 sln_flash_config_w25q256jvs.h。
  2. 复制文件夹 file包含适用于小型应用程序的 API 的系统 file系统和HAL驱动程序从智能HMI\coffee_machine\cm7\source\到examp勒西南。并更新新文件夹:
    • 取消选中“从构建中排除资源”以进行构建。
    • 在项目设置中添加它的包含路径:“${workspace_loc:/${ProjName}/file系统}”
    • 更改包含的标题 file 将 sln_flash_config.h 命名为 sln_flash_config_w25q256jvs.h,将 fica_definition.h 命名为 app_config.h file sln_flash_littlefs.h。
  3. 复制包含中间件的文件夹littlefs – Little file系统从路径 SDK_2_13_0_ MIMXRT1170-EVK\middleware\ 到 examp勒西南。并更新新文件夹:
    • 取消选中“从构建中排除资源”以进行构建。
    • 在项目设置中添加它的包含路径:“${workspace_loc:/${ProjName}/littlefs}”

添加 HAL 驱动程序 

  • 有两个 HAL 设备 – file 系统和人脸数据库HAL支持数据库访问功能,并且它们已经在框架中实现,没有任何改变。通过在 board_define.h 中添加以下定义来启用它们:
    • #define ENABLE_FLASH_DEV_Littlefs
    • #定义ENABLE_FACEDB

并将人脸数据库名称更改为example: #define OASIS_FACE_DB_DIR “oasis_gui_face_rec”

添加应用程序级支持

  1. 更新主要内容 file lvgl_gui_face_rec_cm7.cpp:
    • 包括标题 file 与闪存相关 file 系统 HAL 管理器,添加代码行:#include “fwk_flash.h”
    • 申报并登记 file 系统HAL设备:
      • HAL_FLASH_DEV_DECLARE(Littlefs);
      • HAL_FLASH_DEV_REGISTER(Littlefs, ret);
        笔记: 这 file 在函数 APP_InitFramework() 中初始化所有设备管理器之前,必须注册系统 HAL 设备。
    • 调用APP_BoardInit()中的函数BOARD_ConfigMPU()来配置MPU。
  2. 设置 file Flash 中的系统分配 file app_config.h中通过定义使用的宏定义 file sln_flash_littlefs.h:
    • #定义FICA_IMG_FILE_SYS_ADDR(FLASH_IMG_SIZE + RES_SHMEM_TOTAL_SIZE)
    • #定义FICA_FILE_SYS_大小(0x280000)

配置
一些与Flash相关的代码在SRAM ITC区域中执行以获得足够的性能。将包含链接器配置的文件夹 linkscripts 从路径 smart HMI\coffee_machine\cm7\ 复制到 examp勒西南。

实现 LVGL GUI 应用程序
基于框架的LVGL GUI应用程序的开发调用输出UI HAL的API,并提供输出UI HAL的API(输出UI HAL的实现参见4.1.3节)。

但是,LVGL GUI 应用程序的详细实现取决于应用程序的要求和设计。本例中的 GUI 应用程序amp文件的设计如第 4 节开头所述。

下面是实现介绍:

  1. 定制的代码在GUI Guider给出的custom.c和custom.h中实现,作为GUI Guider项目和嵌入式系统项目之间的接口。
    •  在custom.c中添加新函数gui_xxx(),实现以下功能:
      • 用于输出 UI HAL 和 GUI 应用程序来更新 UI。
      • GUI 应用程序通过从输出 UI HAL 调用 UI 回调函数来触发事件。
        例如amp在文件中,新函数 gui_event_face_rec_action() 调用 UI 回调函数来处理单击相关按钮时从 GUI 应用程序触发的人脸注册、人脸识别和删除用户事件之一。
        注意:在输出 UI HAL 中调用函数 gui_set_virtual_face() 进行预渲染view mode需要在custom.c中实现:
    •  从 smart HMI\coffee_machine\cm4\custom \custom.c 克隆函数 gui_set_virtual_face()。
    •  更改小部件的名称 home_img_cameraPreview 到 screen_img_camera_preview 在函数中。
    •  在custom.c中的宏定义#ifndef RT_PLATFORM的控制下,对输出UI HAL中的所有UI回调函数实现具有相同原型的UI回调函数,以兼容GUI Guider项目,因为输出UI HAL中的这些函数依赖于嵌入式平台。在custom.c中,它们依赖于GUI引导器上的模拟器,并且独立于嵌入式平台。对于前amp在 GUI Guider 模拟器运行时,人脸注册回调的实现如下: #ifndef RT_PLATFORM void UI_Registration_Callback() { gui_hide_del_user_btn(true); s_InAction = false;返回; }
      笔记:参考6节第4.1.3步介绍的函数相同原型
      宏定义 RT_PLATFORM 在 MCUXpresso 的项目设置中设置,如图 7 所示:NXP-AN14263-在 Framewor-fig 上实现 LVGL-GUI 人脸识别- (14)
    • 在custom.h中声明所有名为UI_xxx_Callback()和gui_xxx()的函数,并添加smart_tlhmi_event_descriptor.h中包含的custom.h以将GUI API共享到UI输出HAL。
  2. 在 GUI Guider 上开发 GUI:
    • 克隆文件夹camera preview 基础软件包lvgl_gui_camera_pre中的gui_guider文件夹中包含GUI Guider项目软件view_cm7。更改相关名称camera_preview 到新前任的face_recamp勒。
    • 复制上面更新的custom.c和custom.c。 h 到新的 GUI Guider 项目软件。
    •  在 GUI Guider 上打开新的face_rec 项目。更新如下:
      • 添加标记为“删除用户”的新按钮。添加隐藏标志,以便在 GUI 应用程序启动时隐藏该按钮。
      • 在所有按钮注册、识别、删除用户的事件设置中的“释放”触发器上添加调用不同事件ID参数的接口gui_event_face_rec_action()的代码行,用于触发人脸注册、人脸识别、删除用户事件。图8显示了按钮注册事件的代码:NXP-AN14263-在 Framewor-fig 上实现 LVGL-GUI 人脸识别- (15)
  3. 将生成的代码从 GUI Guider 更新到 MCUXpresso 项目。
    • 将 MCUXpresso 项目软件生成的文件夹中除文件夹图像之外的内容替换为 GUI Guider 项目软件生成的文件夹中的相应内容。

笔记:有关上述修改的更多详细信息,请查看 examp勒软件位于 https://mcuxpresso.nxp.com/appcodehub.

与前任核实amp项目

为了得到前任amp包含本应用说明的资源和工具的软件包,请访问: https://mcuxpresso.nxp.com/appcodehub。打开前任ampMCUXpresso IDE 上的项目。构建并编程 .axf file 到地址0x30000000并对资源库进行编程 file camera_preview_resource.bin 到地址 0x30800000。

LVGL GUI人脸识别扩展ample 正常工作如下:

  • 预view:通电后,摄像机拍摄的视频流显示在摄像机预置的特定区域。view 在 GUI 屏幕上。状态标签显示“Preview……”。有关详细信息,请参见图 3。“删除用户”按钮被隐藏。单击按钮和图像之外的区域时,会显示预view 人脸注册或识别动作结束后,如上所述。
  • 登记:
    • 塔图普:单击注册按钮时,开始面部注册。状态标签变为显示“注册...”,面部引导矩形显示蓝色,进度条开始显示进度。确保用户的脸部显示在蓝色脸部引导矩形中以进行注册。
    • 成功:状态标签显示“注册…确定”和已注册的用户 ID 号,如果在进度条上显示完整之前人脸注册成功,则人脸引导矩形变为红色。
    • 失败->超时:当进度条显示已满时,如果人脸注册仍然失败,状态标签显示“注册…超时”。
    • 失败->复制:状态标签显示“注册…失败”,如果在进度条上显示完整之前注册的人脸被识别,则人脸引导矩形变为绿色。
  • 认识:
    • 启动:点击“识别”按钮,即开始人脸识别。状态标签变为显示“识别...”,面部引导矩形显示蓝色,进度条开始显示进度。确保用户的脸部显示在蓝色脸部引导矩形中以进行注册。
    • 成功:状态标签显示“识别…确定”和已识别的用户 ID 号,进度条显示满之前,如果人脸识别成功,人脸引导矩形变为绿色。此时,将出现“删除用户”按钮。意思是只有识别出该用户才允许删除。
    • 失败:当进度条显示已满时,如果人脸识别仍然失败,状态标签会显示“识别…超时”。
  • 删除用户:点击“删除用户”按钮,人脸识别成功后,状态标签变为显示“删除用户…确定”,人脸引导矩形变为蓝色,进度条上显示满。删除用户按钮再次隐藏。识别出的面孔/用户将从数据库中删除。这意味着该人脸/用户必须再次注册才能被识别。

注意文档中的源代码
Examp本文档中显示的文件代码具有以下版权和 BSD-3-Clause 许可证:

版权所有 2024 NXP 在满足以下条件的情况下,允许以源代码和二进制形式重新分发和使用(无论是否经过修改):

  1. 源代码的重新分发必须保留上述版权声明、本条件列表和以下免责声明。
  2. 以二进制形式重新分发必须在分发时提供文档和/或其他材料中的上述版权声明、条件列表和以下免责声明。
  3. 未经事先书面许可,版权所有者及其贡献者的姓名均不得用于认可或推广源自本软件的产品

本软件由版权所有者和贡献者“按原样”提供,不作任何明示或暗示的保证,包括但不限于适销性和针对特定用途的适用性的暗示保证。在任何情况下,版权所有者或贡献者均不对任何直接、间接、偶然、特殊、惩戒性或后果性损害(包括但不限于采购替代货物或服务;使用、数据或利润的损失;或业务中断)承担责任,无论该损害是如何造成的,也不论是基于何种责任理论,无论是合同、严格责任还是侵权(包括疏忽或其他方式)因使用本软件而引起,即使已被告知有此类损害的可能性。

修订历史

NXP-AN14263-在 Framewor-fig 上实现 LVGL-GUI 人脸识别- (16)

法律信息

定义
草稿——文档的草稿状态表示内容仍在内部审核中view 并须经正式批准,否则可能会有修改或补充。恩智浦半导体不对文档草稿版本中包含的信息的准确性或完整性做出任何陈述或保证,并且对使用此类信息的后果不承担任何责任。

免责声明

  • 有限保修和责任 — 本文件中的信息被认为是准确和可靠的。 但是,NXP Semiconductors 不对此类信息的准确性或完整性做出任何明示或暗示的陈述或保证,并且不对使用此类信息的后果承担任何责任。 如果本文档中的内容由 NXP Semiconductors 以外的信息源提供,NXP Semiconductors 不承担任何责任。
    在任何情况下,恩智浦半导体均不对任何间接、偶然、惩罚性、特殊或后果性损害(包括但不限于利润损失、储蓄损失、业务中断、与任何产品的拆除或更换相关的成本或返工费用)承担责任,无论此类损害是否基于侵权(包括疏忽)、保证、违约或任何其他法律理论。
    尽管客户可能因任何原因遭受任何损害,恩智浦半导体对本文所述产品的客户的总和累积责任应根据恩智浦半导体的商业销售条款和条件进行限制。
  • 作出更改的权利 — NXP Semiconductors 保留随时更改本文档中发布的信息的权利,包括但不限于规格和产品描述,恕不另行通知。 本文档取代并替换在此发布之前提供的所有信息。
  • 适用性 — NXP Semiconductors 产品的设计、授权或保证不适用于生命支持、生命关键或安全关键系统或设备,也不适用于可合理预期 NXP Semiconductors 产品故障或故障会导致人身伤害、死亡或严重的财产或环境损害。 NXP Semiconductors 及其供应商对在此类设备或应用中包含和/或使用 NXP Semiconductors 产品不承担任何责任,因此此类包含和/或使用的风险由客户自行承担。
  • 应用 — 此处描述的任何这些产品的应用仅用于说明目的。 NXP Semiconductors 不声明或保证此类应用无需进一步测试或修改即可适用于指定用途。
    客户负责使用恩智浦半导体产品设计和操作其应用程序和产品,恩智浦半导体对应用程序或客户产品设计方面的任何帮助不承担任何责任。 客户自行负责确定恩智浦半导体产品是否适合客户的应用和计划产品,以及客户的第三方客户的计划应用和使用。 客户应提供适当的设计和操作保障措施,以尽量减少与其应用和产品相关的风险。 恩智浦半导体不承担因客户的应用程序或产品、或客户的第三方客户的应用程序或使用中的任何缺陷或缺陷而导致的任何违约、损害、成本或问题相关的任何责任。 客户负责使用恩智浦半导体产品对客户的应用程序和产品进行所有必要的测试,以避免应用程序和产品或客户的第三方客户的应用程序或使用出现故障。 恩智浦不承担这方面的任何责任。
  • 商业销售条款和条件 — 恩智浦半导体产品的销售须遵守 https://www.nxp.com/pro 上发布的一般商业销售条款和条件file/条款,除非在有效的书面个人协议中另有约定。 如果签订单独的协议,则仅适用相应协议的条款和条件。 NXP Semiconductors 特此明确反对在客户购买 NXP Semiconductors 产品时应用客户的一般条款和条件。
  • 出口管制 — 本文件以及此处描述的项目可能受出口管制法规的约束。 出口可能需要主管当局的事先授权。
  • 适用于非汽车合格产品 — 除非本文件明确声明该特定恩智浦半导体产品符合汽车标准,否则该产品不适合汽车使用。 它既不符合汽车测试或应用要求,也不经过测试。 恩智浦半导体对于在汽车设备或应用中包含和/或使用非汽车合格产品不承担任何责任。
    如果客户根据汽车规格和标准将产品用于汽车应用的设计和使用,客户 (a) 应在没有 NXP Semiconductors 对此类汽车应用、用途和规格的产品保证的情况下使用该产品,以及 ( b) 每当客户将产品用于超出 NXP Semiconductors 规范的汽车应用时,此类使用的风险应完全由客户自行承担,并且 (c) 对于因客户设计和使用该产品适用于超出 NXP Semiconductors 标准保修和 NXP Semiconductors 产品规格的汽车应用。
  • 翻译 — 文件的非英文(翻译)版本,包括该文件中的法律信息,仅供参考。 如果翻译版本与英文版本之间存在任何差异,则以英文版本为准。
  • 安全 — 客户了解所有 NXP 产品都可能存在未识别的漏洞,或者可能支持具有已知限制的既定安全标准或规范。 客户负责其应用程序和产品整个生命周期的设计和操作,以减少这些漏洞对客户应用程序和产品的影响。 客户的责任还延伸至恩智浦产品支持的用于客户应用的其他开放和/或专有技术。 恩智浦对任何漏洞不承担任何责任。 客户应定期检查 NXP 的安全更新并适当跟进。 客恩智浦可能提供的任何信息或支持。

恩智浦有一个产品安全事件响应小组 (PSIRT)(可通过 PSIRT@nxp.com 联系)负责管理针对恩智浦产品安全漏洞的调查、报告和解决方案发布。
NXP BV — NXP BV 不是一家运营公司,也不分销或销售产品。

商标
注意:所有引用的品牌、产品名称、服务名称和商标均为其各自所有者的财产。

恩智浦半导体 — 字标和徽标是 NXP BV 的商标

AMBA、Arm、Arm7、Arm7TDMI、Arm9、Arm11、Artisan、big.LITTLE、Cordio、CoreLink、CoreSight、Cortex、DesignStart、DynamIQ、Jazelle、Keil、Mali、Mbed、Mbed Enabled、NEON、POP、RealView、SecurCore、Socrates、Thumb、TrustZone、ULINK、ULINK2、ULINK-ME、ULINK-PLUS、ULINKpro、μVision、Versatile — 是 Arm Limited(或其子公司或附属公司)在美国和/或别处。 相关技术可能受到任何或所有专利、版权、设计和商业秘密的保护。 版权所有。

  • i.MX— 是 NXP BV 的商标
  • J链接 — 是 SEGGER Microcontroller GmbH 的商标。

Microsoft、Azure 和 ThreadX — 是 Microsoft 集团公司的商标。

请注意,“法律信息”部分包含了有关本文件及其所述产品的重要声明。

© 2024 恩智浦半导体
更多信息请访问: https://www.nxp.com

  • 发布日期: 19 年 2024 月 XNUMX 日
  • 文件标识符:AN14263

常问问题

问:这个产品的主要用途是什么?
答:主要目的是使用 AI&ML 视觉算法模型和简单的 LVGL GUI ex 来实现人脸识别功能ampSLN-TLHMI-IOT 板上的文件。

问:开发人员如何从本应用说明中受益?
A:开发者可以使用提供的ex逐步学习如何在框架上实现人脸识别amp文件并了解所涉及的设备管理器、HAL 设备和事件机制。

文件/资源

NXP AN14263 在 Framewor 上实现 LVGL GUI 人脸识别 [pdf] 用户指南
AN14263 在 Framewor 上实现 LVGL GUI 人脸识别, AN14263, 在 Framewor 上实现 LVGL GUI 人脸识别, 在 Framewor 上实现 LVGL GUI 人脸识别, 在 Framewor 上实现人脸识别, 在 Framewor 上识别, Framewor

参考

发表评论

您的电子邮件地址不会被公开。 必填字段已标记 *