本帖最后由 bigfanofloT 于 2021-9-21 17:39 编辑

前言
首先来看看官方和网络上关于这个套件的介绍:“NXP Semiconductors sln - viznasiot人脸识别解决方案是一款基于i.MX RT106F交叉处理器的安全人脸识别的edgerady开发工具包。SLN-VIZNAS-IOT旨在使开发人员能够快速、轻松地将人脸识别和活性检测添加到他们的产品中。活体检测可以防止照片的欺骗,通过低成本的红外和RGB相机实现,而不需要昂贵的3D相机。SLN-VIZNAS-IOT具有完全集成的交钥匙软件,可快速开箱即用,最大限度地缩短上市时间、降低风险和开发工作量。人脸识别完全在网络边缘完成,解决了许多消费者对隐私的担忧。本地人脸识别解决方案,NXP MCU级别的人脸识别解决方案可以将人脸识别功能更快捷地添加到IoT产品中。该方案以突出优势提供硬件参考设计、软件集成服务,便于快速评估与验证开发,满足各类行业领域的人脸识别应用需求。i.MX RT106F是i.MX RT1060系列的成员,将于2020年4月份正式量产,主要针对低成本人脸识别应用,基于Arm Coretx-M7内核,主频高达600MHz的高性能实时处理器,除了人脸识别功能外,i.MX RT106F 还有大量可用外设,可以作为多种应用的主芯片。此款人脸识别方案使用双目IR + RGB摄像头,支持表情识别、活体检测与反欺诈。系统可完全脱机工作, 这消除了基于云的实施方案中成本和复杂性增加的问题,比如首次看到一个未知新用户,可在不访问云端的情况下,在不到一秒钟的时间内识别出。
在人们最为关心的安全性方面,该方案采用多重推理引擎加强安全特性,方案引入恩智浦自研的反欺诈引擎可精确辨识活体、图片、屏幕和蜡像等并作出相应反馈。表情识别引擎可针对不同的面目表情做出系统反馈,多模式软件配置,简易笑脸识别率达92%以上,加入更多生气和惊喜表情后识别率可达81%以上。另外算法支持眼镜的推理与识别,可让用户在有不同配饰的情况下进行准确安全的识别。
同时方案支持远程注册, 图形化的用户系统界面支持点击式注册,方便客户通过手机APP、自助终端机等设备快速进行远程人脸注册。NXP MCU级别的人脸识别解决方案可以将人脸识别功能更快捷地添加到IoT产品中。该方案以突出优势提供硬件参考设计、软件集成服务,便于快速评估与验证开发,满足各类行业领域的人脸识别应用需求。
NXP MCU级别的人脸识别解决方案利用i.MX RT106F来实现,使开发者轻松便捷地将人脸识别功能添加到他们基于MCU的IoT产品中,这个超小尺寸,集成软件算法和硬件的方案,可以方便开发者进行快速的评估和概念验证开发。SLN-VIZN-IOT开发套件可以离线创建自己的面部模型,而无需进行云连接,从而降低了总体成本和设计复杂性。
这个解决方案最大程度上缩短了上市时间,降低了风险并减少了开发工作,可以使众多OEM厂家更方便地添加人脸识别功能,为智能家居,智能家电,智能玩具和智能工业提供高级用户界面和访问控制功能,而无需Wi- Fi和云连接,解决了许多消费者的隐私问题。
i.MX RT106F已经获得许可,可以运行NXP OASIS 运行库进行人脸识别,其中包括:摄像头驱动;图像捕获和预处理;人脸检测;人脸跟踪;人脸对比;人脸识别;防欺骗;人脸配置;置信度;人脸识别认证结果;情绪识别;内置安全bootloader,应用程序验证;连接性:MQTT;1W1p,TLS搜索与注册;所有驱动(包含wifi和蓝牙);RTOS OTW客户端:OTW签名脚本,OTW rollback,图像冗余;更新;自动校验脚本;支持 MCU Xpresso SDK,IDE 和配置工具。
下面就一步一步体验这款离线人脸识别套件。
一、产品开箱
以前用过几款nxp家的开发板,都是十分简洁的包装,本次套件也一样,从包装就可以看出板卡的主要功能。
IMG_20210921_135556.jpg
使用黑色海绵保护板子,板卡标配了type-c数据线,开箱即用,十分方便。从图中可以看出,这款套件十分精密,板卡正面都是密密麻麻的电子元件。
IMG_20210921_135649.jpg
正面是双目摄像头,红外、白光补光灯,PIR人体探测传感器等。
IMG_20210921_135702.jpg

打开海绵,取下板卡,反面效果如下,可以看到有一根天线和调试接口。

板卡采用核心板+底板形式,通过板对板连接器连接,如下所示:
IMG_20210921_135820.jpg

主角 i.MX RT106F交叉MCU特写:
IMG_20210921_135835.jpg
之前听说过NXP超高主频的跨界MCU, 这款MCU官方称之为交叉MCU,前者兼具MCU与MPU优点。i.MX RT106F是i.MX RT1060系列处理器面向EdgeReady解决方案的特定版本,主要针对低成本人脸识别应用,i.MX RT106F采用Cortex-M7内核,运行速度高达600MHz,可提供卓越的CPU性能和最佳实时响应。除了人脸识别功能外,i.MX RT106F 还有大量可用外设,可以作为多种应用的主芯片。这颗MCU主要特性如下:
高性能Arm Cortex-M7
3020 CoreMark/1284 DMIPS (600MHz)
1MB片上SRAM - 最高512KB可配置为紧耦合存储器 (TCM)
实时、低延迟响应,低至20ns
较低的动态功耗,带集成直流-直流转换器
低功耗运行模式下运行频率为24MHz
用于GUI和增强型HMI的高级多媒体
2D图形加速引擎
并行相机传感器接口
LCD显示控制器(最高可达WXGA 1366x768)
3 x I2S,用于高性能多声道音频
丰富的外部存储接口选项
NAND、eMMC、QuadSPI NOR闪存和并行NOR闪存
无线连接
Wi-Fi®、蓝牙®、蓝牙低功耗、ZigBee®和Thread™
由MCUXpresso SDK、IDE和配置工具提供支持
更详细的特性可以查阅它的数据手册,套件官方主页
11.PNG
22.PNG
33.PNG
44.gif
55.PNG

https://www.nxp.com.cn/design/designs/nxp-edgeready-mcu-based-solution-for-face-recognition-with-liveness-detection:SLN-VIZNAS-IOT
nxp为这款套件提供了详细的软硬件资料和入门、开发指南,降低了使用门槛。

二、应用思路 & 操作方法 & 功能体验
拿到套件第一件事就是跟着官方提供的资料,体验一下demo,nxp官方提供了入门指南https://www.nxp.com.cn/document/guide/get-started-with-the-sln-viznas-iot:GS-SLN-VIZNAS-IOT
在测试之前,先看看板卡上面主要组件的作用:
按键说明.jpg
板卡上的4颗按钮可以实现人脸识别应用需要的人脸注册、删除等功能,首先,使用USB-type-C线连接板卡和电脑,连接后,绿色LED(D1)会亮起,表示套件已接通电源,效果如下图所示:
IMG_20210921_143152.jpg
然后在设备管理器可以看到虚拟出了串口和USB视频摄像头:
无标题.png
我的电脑是Windows系统,打开相机软件:
aa.png
打开摄像头应用后,将在摄像头窗口显示套件摄像头采集的视频,效果如下所示,由于摄像头像素高,只有200万,所以画面不是根清晰:
相机效果.gif
在进行人脸识别实验时首先需要注册人脸,按按钮SW4后,屏幕顶部将弹出一条消息,显示正在注册:
注册成功.PNG
注册人脸过程需要调整角度使得脸部周围的框从红色变为绿色,注册成功后会有提示信息,且新注册的人脸会被分配一个通用用户名,实测发现:注册不成功的时候需要调整红外补光、白光补光灯PWM到合适的值,例如晚上注册就调高红外补光和白光补光,白天注册就调低。
注册后,进行人脸识别时将提示“ Welcome Home(欢迎回家)”消息,表明该工具包已检测到可识别的面部,效果如下:
识别成功.PNG
套件支持活体检测和防欺诈,可以区分人的真脸和照片。
为了方便调试和查看信息,板卡支持串口终端命令,使用终端软件putty通过串口(115200波特率)登陆板卡,可以看到输入提示符SHELL>>,输入命令help打印所有支持的命令及其含义,效果如下:
串口登陆.gif
这些命令的详细含义如下所示:
[td]
命令
参数
描述
help
-
显示所有可用的串行命令列表,带功能简述
exit
-
退出程序;关闭串行终端直到复位
list
-
列出所有注册用户
add
USERNAME
添加指定用户名的新用户
add
-s
停止尝试添加新用户
del
USERNAME
删除指定的用户
del
-a
删除所有注册用户
rename
Old new
将与旧名称关联的人脸重命名为新 名称
verbose
< 0 | 1 | 2 | 3 >
使用指定的详细程度来配置verbose模式调试日志记录
camera ir_pwm
< 0 – 100 >
配置摄像头适配器的IR LED,可使用指定的强度
camera white_pwm
< 0 – 100 >
配置摄像头适配器的白色LED灯,可使用指定的强度
version
-
显示有关推理引擎的版本信息
save

将人脸数据库保存在闪存中
updateotw
-
重启板并设置OTW固件更新模式
reset
-
重置MCU
emotion
< 0 | 2 | 4 | 7 >
配置情绪识别,以使用指定的模式(0、2、4或7种情绪识别模式)
liveness
< on| off >
启用或禁用活体检测
detection resolution
< qvga | vga >
配置检测分辨率,以使用指定的分辨率并重置板
display output_mode
< rgb | ir >
配置是否显示来自RGB摄像头或红外摄像头的输出
display output_device
< usb | riverdi >
配置显示输出设备,以使用USB视频或Riverdi显示器。(需要Riverdi显示器)
display interface
< loopback | infobar >
配置是否显示信息栏/GUI
wifi
< on|off >
打开或关闭Wi-Fi连接
wifi reset
-
重置Wi-Fi以重新建立连接
wifi credentials
-
获取当前Wi-Fi凭证(SSID和密码)
wifi credentials
[SSID] [PASSWORD]
设置wifi凭证
wifi ip
-
返回当前的IP地址。
wifi erase
-
从闪存中擦除Wi-Fi凭证
app_type
< 0 | 1 | 2 | 3 >
0-Elock(轻型)
1-Elock(重型)
2-Door access(轻型)
3-Door access(重型)
确定要使用的推理引擎模型。有关这些模型的说明,请参见
低功耗
< on| off>
启用或禁用低功耗模式

板卡支持调试日志级别控制,输入不同的命令将屏蔽一些信息,如果要打印所有调试信息,输入Verbose 3即可。日志级别信息如下:
[td]
消息类型
重要性
" Verbose 0"
"Verbose 1"
"Verbose 2"
"Verbose 3"
重要
-
x
x
x
详情
中等
-
-
x
x
Misc.
-
-
-
x
屏幕上的调试信息
N/A
-
-
-
x

调试信息中包含的关于人脸识别过程的一些参数如下:
[td]
缩写
定义
Dt
检测人脸所需的时间
Rt
识别人脸所需的时间
Sim
人脸识别的预测准确性/置信度值
Face_id
内部人脸数据库标识符

板卡支持低功耗功能,通过使用串行命令可以启用或禁用低功耗模式功能,使用命令“low_power on”或“low_power off” 启用或禁用低功耗模式功能。
启用低功耗模式后,如果未进行注册/取消注册并且约20秒摄像头未检测到任何活动,板卡将以超低功耗进入睡眠/休眠状态,串口终端功能被关闭,效果如下:
低功耗.gif
在睡眠模式期间可通过SW3按钮唤醒。
下面是调整红外补光PWM值和白光补光PWM值的命令使用示例:
常见命令效果.PNG
板卡支持wifi,可以连接路由器,从而可以通过手机app进行人脸识别的管理,安卓手机app下载地址如下:
https://www.nxp.com/design/designs/nxp-edgeready-mcu-based-solution-for-face-recognition-with-liveness-detection:SLN-VIZNAS-IOT?tid=vanMCU-VISION2
手机app下载.PNG
在使用手机app前需要先开启wifi,等待wifi连接路由器:
wifi功能.PNG
手机app如下:
手机app1.jpg
实测无法正常使用,可能国内无法使用:
手机app2.jpg
手机app3.jpg
手机app4.jpg

到此基本的测试完毕,总之得益于官方教程的详细,板卡使用起来毫无障碍,十分顺利的完成了测试。
三、代码展示&总结&客观评价
如果想在板卡基础上完成一些自己需要的功能,就需要先熟悉下板卡的硬件结构了,板卡硬件结构框图如下:
硬件框图.PNG
软件架构如下:
软件架构.PNG

可见板卡的软件结构还是十分复杂的,使用了大量中间件,底层使用了应用十分广泛的FreeRTOS。如果要研究SDK,就需要安装官方的集成开发环境了,NXP自家的MCUXpresso IDE,当前版本是MCUXpresso IDE v11.4.0_6224,首先需要在官网注册账号才能够下载,安装过程如下:

ide安装1.PNG
ide安装2.PNG
ide安装3.PNG
ide安装4.PNG
ide安装5.PNG
ide安装6.PNG
ide安装7.PNG
ide安装8.PNG
ide安装9.PNG
ide安装10.PNG
ide安装11.PNG
ide安装12.PNG
ide安装13.PNG
ide安装14.PNG

安装完毕主界面如下:
ide安装16.PNG
ide安装15.PNG

这是一款基于eclipse的IDE,如果有用过其它大厂的IDE,想必使用MCUXpresso IDE会十分熟悉。安装好了IDE接下来就要安装板卡的SDK了,安装SDK首先需要自己去官网生成,裁剪掉不需要的部分:
构建sdk.PNG
构建sdk2.PNG
构建sdk3.PNG

也可以在IDE内部在线下载安装,这种方式容易出错:
安装sdk.PNG
安装sdk2.PNG
官方建议自己生成sdk然后导入到IDE中去:
安装sdk3.PNG

最后导入工程:
工程实例.PNG
可以看到这个工程使用到了许多的开源组件,如FreeRTOS、fatfs、lwip、cjson等。
主函数.PNG
mian.c内容如下:
  1. /*
  2. * Copyright (c) 2019-2020 NXP
  3. * All rights reserved.
  4. *
  5. * SPDX-License-Identifier: BSD-3-Clause
  6. */
  7. #include "fsl_device_registers.h"
  8. #include "fsl_debug_console.h"
  9. #include "fsl_dcp.h"
  10. #include "app.h"
  11. #include "board.h"
  12. #include "pin_mux.h"
  13. #include "FreeRTOS.h"
  14. #include "task.h"
  15. #include "camera.h"
  16. #include "database_api.h"
  17. #include "display.h"
  18. #include "oasis.h"
  19. #include "switch.h"
  20. #include "pxp.h"
  21. #if WIFI_ENABLE
  22. #include "sln_connection.h"
  23. #include "sln_tcp_connection.h"
  24. #endif
  25. #include "sln_lpm.h"
  26. #include "sln_api_init.h"
  27. #include "sln_pcal.h"
  28. #include "sln_shell.h"
  29. #include "sln_flash.h"
  30. #include "sln_flash_mgmt.h"
  31. #include "sln_file_table.h"
  32. #include "sln_system_state.h"
  33. #include "sln_dev_cfg.h"
  34. #include "sln_usb_composite.h"
  35. #include "sln_wdog.h"
  36. #include "sln_audio.h"
  37. /*******************************************************************************
  38. * Definitions
  39. ******************************************************************************/
  40. /*******************************************************************************
  41. * Prototypes
  42. ******************************************************************************/
  43. static void FileSystem_Init();
  44. /*******************************************************************************
  45. * Code
  46. ******************************************************************************/
  47. static void FileSystem_Init()
  48. {
  49.     /* Initialize DCP to enable CRC generation */
  50.     dcp_config_t dcpConfig;
  51.     DCP_GetDefaultConfig(&dcpConfig);
  52.     DCP_Init(DCP, &dcpConfig);
  53.     /* Initialize Flash to allow writing */
  54.     SLN_Flash_Init();
  55.     /* Initialize flash management */
  56.     SLN_FLASH_MGMT_Init((sln_flash_entry_t *)g_fileTable, false);
  57.     /* Initialize the user application config data */
  58.     Cfg_AppDataInit();
  59. }
  60. /*!
  61. * @brief Main function
  62. */
  63. int main(void)
  64. {
  65. #if defined(RELOCATE_VECTOR_TABLE) && RELOCATE_VECTOR_TABLE
  66.     BOARD_RelocateVectorTableToRam();
  67. #endif
  68.     /* Init board hardware. */
  69.     BOARD_InitHardware();
  70.     FileSystem_Init();
  71.     SysState_Init();
  72.     uart_shell_init();
  73.     USB_CompositeInit();
  74. #if WIFI_ENABLE
  75.     SLN_Connections_Init();
  76.     TCP_Connection_Start();
  77. #endif
  78.     DB_Init();
  79.     Camera_Start();
  80.     APP_PXP_Start();
  81.     Display_Start();
  82.     Oasis_Start();
  83.     Switch_Start();
  84. #if VOICE_PROMPT
  85.     Audio_Start();
  86. #endif
  87.     LPM_Start();
  88.     vizn_api_init();
  89. #if defined(WDOG_ENABLE) && WDOG_ENABLE
  90.     SLN_WatchdogEnable(SLN_WDOG_TIMEOUT_SEC, SLN_WDOG_REFRESH_SEC);
  91. #endif
  92.     /* Run RTOS */
  93.     vTaskStartScheduler();
  94.     /* Should not reach this statement */
  95.     while (1)
  96.     {
  97.     }
  98. }
首先是板卡外设的初始化,文件系统初始化、系统状态初始化(时钟、PIT模块、中断)、串口命令终端初始化、USB功能、数据库初始化、摄像机初始化等,这几个模块基本都是消息队列+任务的形式。 限于时间因素和工程代码量,后续有时间就逐个分析各个模块的实现原理和工作流程。
本次测评参考的一些官方手册如下: