前言
首先来看看官方和网络上关于这个套件的介绍:“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家的开发板,都是十分简洁的包装,本次套件也一样,从包装就可以看出板卡的主要功能。
使用黑色海绵保护板子,板卡标配了type-c数据线,开箱即用,十分方便。从图中可以看出,这款套件十分精密,板卡正面都是密密麻麻的电子元件。
正面是双目摄像头,红外、白光补光灯,PIR人体探测传感器等。
打开海绵,取下板卡,反面效果如下,可以看到有一根天线和调试接口。
板卡采用核心板+底板形式,通过板对板连接器连接,如下所示:
主角 i.MX RT106F交叉MCU特写:
之前听说过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和配置工具提供支持
更详细的特性可以查阅它的数据手册,套件官方主页
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
在测试之前,先看看板卡上面主要组件的作用:
板卡上的4颗按钮可以实现人脸识别应用需要的人脸注册、删除等功能,首先,使用USB-type-C线连接板卡和电脑,连接后,绿色LED(D1)会亮起,表示套件已接通电源,效果如下图所示:
然后在设备管理器可以看到虚拟出了串口和USB视频摄像头:
我的电脑是Windows系统,打开相机软件:
打开摄像头应用后,将在摄像头窗口显示套件摄像头采集的视频,效果如下所示,由于摄像头像素高,只有200万,所以画面不是根清晰:
在进行人脸识别实验时首先需要注册人脸,按按钮SW4后,屏幕顶部将弹出一条消息,显示正在注册:
注册人脸过程需要调整角度使得脸部周围的框从红色变为绿色,注册成功后会有提示信息,且新注册的人脸会被分配一个通用用户名,实测发现:注册不成功的时候需要调整红外补光、白光补光灯PWM到合适的值,例如晚上注册就调高红外补光和白光补光,白天注册就调低。
注册后,进行人脸识别时将提示“ Welcome Home(欢迎回家)”消息,表明该工具包已检测到可识别的面部,效果如下:
套件支持活体检测和防欺诈,可以区分人的真脸和照片。
为了方便调试和查看信息,板卡支持串口终端命令,使用终端软件putty通过串口(115200波特率)登陆板卡,可以看到输入提示符SHELL>>,输入命令help打印所有支持的命令及其含义,效果如下:
这些命令的详细含义如下所示:
[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秒摄像头未检测到任何活动,板卡将以超低功耗进入睡眠/休眠状态,串口终端功能被关闭,效果如下:
在睡眠模式期间可通过SW3按钮唤醒。
下面是调整红外补光PWM值和白光补光PWM值的命令使用示例:
板卡支持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前需要先开启wifi,等待wifi连接路由器:
手机app如下:
实测无法正常使用,可能国内无法使用:
到此基本的测试完毕,总之得益于官方教程的详细,板卡使用起来毫无障碍,十分顺利的完成了测试。
三、代码展示&总结&客观评价
如果想在板卡基础上完成一些自己需要的功能,就需要先熟悉下板卡的硬件结构了,板卡硬件结构框图如下:
软件架构如下:
可见板卡的软件结构还是十分复杂的,使用了大量中间件,底层使用了应用十分广泛的FreeRTOS。如果要研究SDK,就需要安装官方的集成开发环境了,NXP自家的MCUXpresso IDE,当前版本是MCUXpresso IDE v11.4.0_6224,首先需要在官网注册账号才能够下载,安装过程如下:
安装完毕主界面如下:
这是一款基于eclipse的IDE,如果有用过其它大厂的IDE,想必使用MCUXpresso IDE会十分熟悉。安装好了IDE接下来就要安装板卡的SDK了,安装SDK首先需要自己去官网生成,裁剪掉不需要的部分:
也可以在IDE内部在线下载安装,这种方式容易出错:
官方建议自己生成sdk然后导入到IDE中去:
最后导入工程:
可以看到这个工程使用到了许多的开源组件,如FreeRTOS、fatfs、lwip、cjson等。
mian.c内容如下:
- /*
- * Copyright (c) 2019-2020 NXP
- * All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #include "fsl_device_registers.h"
- #include "fsl_debug_console.h"
- #include "fsl_dcp.h"
- #include "app.h"
- #include "board.h"
- #include "pin_mux.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "camera.h"
- #include "database_api.h"
- #include "display.h"
- #include "oasis.h"
- #include "switch.h"
- #include "pxp.h"
- #if WIFI_ENABLE
- #include "sln_connection.h"
- #include "sln_tcp_connection.h"
- #endif
- #include "sln_lpm.h"
- #include "sln_api_init.h"
- #include "sln_pcal.h"
- #include "sln_shell.h"
- #include "sln_flash.h"
- #include "sln_flash_mgmt.h"
- #include "sln_file_table.h"
- #include "sln_system_state.h"
- #include "sln_dev_cfg.h"
- #include "sln_usb_composite.h"
- #include "sln_wdog.h"
- #include "sln_audio.h"
- /*******************************************************************************
- * Definitions
- ******************************************************************************/
- /*******************************************************************************
- * Prototypes
- ******************************************************************************/
- static void FileSystem_Init();
- /*******************************************************************************
- * Code
- ******************************************************************************/
- static void FileSystem_Init()
- {
- /* Initialize DCP to enable CRC generation */
- dcp_config_t dcpConfig;
- DCP_GetDefaultConfig(&dcpConfig);
- DCP_Init(DCP, &dcpConfig);
- /* Initialize Flash to allow writing */
- SLN_Flash_Init();
- /* Initialize flash management */
- SLN_FLASH_MGMT_Init((sln_flash_entry_t *)g_fileTable, false);
- /* Initialize the user application config data */
- Cfg_AppDataInit();
- }
- /*!
- * @brief Main function
- */
- int main(void)
- {
- #if defined(RELOCATE_VECTOR_TABLE) && RELOCATE_VECTOR_TABLE
- BOARD_RelocateVectorTableToRam();
- #endif
- /* Init board hardware. */
- BOARD_InitHardware();
- FileSystem_Init();
- SysState_Init();
- uart_shell_init();
- USB_CompositeInit();
- #if WIFI_ENABLE
- SLN_Connections_Init();
- TCP_Connection_Start();
- #endif
- DB_Init();
- Camera_Start();
- APP_PXP_Start();
- Display_Start();
- Oasis_Start();
- Switch_Start();
- #if VOICE_PROMPT
- Audio_Start();
- #endif
- LPM_Start();
- vizn_api_init();
- #if defined(WDOG_ENABLE) && WDOG_ENABLE
- SLN_WatchdogEnable(SLN_WDOG_TIMEOUT_SEC, SLN_WDOG_REFRESH_SEC);
- #endif
- /* Run RTOS */
- vTaskStartScheduler();
- /* Should not reach this statement */
- while (1)
- {
- }
- }
本次测评参考的一些官方手册如下:
参考文件SDK说明文档
https://www.nxp.com.cn/document/guide/get-started-with-the-sln-viznas-iot:GS-SLN-VIZNAS-IOT?tab=Design_Tools_Tab
这里说的方法:要将SDK导入MCUXpresso IDE中,请将在上一步中下载的SDK zip拖动到MCUXpresso IDE中的Installed SDK(已安装SDK) 窗口中。(我是没成功)
我是在线安装成功的。
还行