i.MX RT1170

电气化革命正在如火如荼地进行,为汽车行业的各个领域带来了翻天覆地的变化,包括两轮车,以及各种级别和价位的摩托车、代步车和电动自行车。虽然传统内燃机 (ICE) 驱动的摩托车和代步车占主流,但燃油价格高涨和消费者对经济实用的追求,让电动汽车 (EV) 车型日益走俏。

1.jpg

电动两轮车是内燃机驱动的摩托车和代步车的替代产品,它们更安全、易于驾驶、更智能、更环保、更简单。它们方便驱动,可轻松连接智能系统,能够提升骑行者的安全和舒适。低成本的基础两轮车能够满足全球发展中地区的日常通勤需求,而高端电动摩托车和代步车则可以满足发达市场骑行者对更高速度、更长续航里程和冒险的渴望。

电动汽车公司正在积极开发增值数字功能,如联网数字仪表盘,以鼓励更多的驾驶员转向电动汽车。两轮车制造商紧跟汽车业的变革潮流,把数字仪表盘融入到他们的新款车型里。实时清晰地显示重要信息和车辆参数,行驶速度、每分钟转数、位置、导航、环境温度和续航里程等无一遗漏,让骑行者专注于路况,享受骑行的乐趣。

新参考平台助力两轮车数字仪表盘开发

为了帮助加快两轮车全彩薄膜晶体管(TFT)显示屏的开发,恩智浦搭建了一个组合式数字仪表盘和连接参考平台,专为大众市场两轮车打造,包括摩托车、电动代步车和通勤电动自行车。该参考平台支持高性能图形和丰富的连接用例,例如免提通话、智能手机投影无线配对、蓝牙音频/视频、OTA更新、云连接、车队管理、安全汽车门禁和车辆定位。

2.jpg

两轮车互联数字仪表盘参考设计

为了提供一个经济高效的系统,增强两轮车的用户体验,该参考平台结合了以下恩智浦组件:

  • 高性能i.MX RT1170跨界微控制器 (MCU)

  • 高度集成的AW611单芯片Wi-Fi 6和蓝牙/BLE音频连接解决方案

  • 安全的远程KW45无线MCU,具有符合BLE 5.3的无线单元

3.jpg

采用i.MX RT1170跨界MCU构建的两轮车仪表盘

全包式参考平台:实现更快、更轻松的开发

恩智浦的互联数字仪表盘参考平台使车辆制造商能够为两轮车提供基本的仪表盘功能,同时还支持各种连接用例,提升骑行者体验。重要的功能包括:

  • 智能手机、数字仪表盘和耳机之间的三向蓝牙配对

  • 骑行者和后座乘客音乐共享

  • 定位功能,例如在停车场“查找我的两轮车”

  • 手机导航和电动车充电统计

免提通话和蓝牙音频

蓝牙有助于将骑行者的手机连接到两轮车数字仪表盘。配对后,通话记录和联系人信息可以共享并显示在智能仪表盘上,从而实现免提通话。消息提醒和来电也可以显示在屏幕上。当两轮车停下或停车时,骑行者可以通过触摸智能仪表盘和使用手机路由呼叫来拨打呼出电话;还可以使用显示屏来接听或挂断来电。

实现蓝牙音频使骑行者和高端车型的后座乘客都能享受音乐流。从仪表盘到头盔的连接进一步增强了骑行者的体验。当交通堵塞或等待两轮车电池充电时,骑行者也可以享受便捷的音频播放功能。

实现安全的两轮车门禁

恩智浦的KW45 MCU具有低能耗蓝牙、CAN和集成安全区域,为安全的两轮车位置跟踪和门禁提供了低成本的连接选项。在两轮车设计中,一个KW45 MCU与仪表盘中的RT1170 MCU配合使用,另一个KW45则内置在骑行者的钥匙扣中。两轮车中的KW45 MCU可以与钥匙扣配对,甚至可以与智能手机配对,但需要距离很近,大约3米。骑行者侧通过i.MX RT1170 MCU进行声光指示,可以在停车场轻松发现自己的两轮车。

当两轮车数字仪表盘中的KW45 MCU在主流搜索应用中注册后,骑行者可以使用智能手机在地图上跟踪两轮车的位置,并在距离较近时手动触发声音/灯光指示。此外,还能实现更先进的用例,例如使用全球智能手机网络实现BLE智能标签跟踪功能,以查找丢失或被盗的两轮车。

丰富的两轮车连接功能

恩智浦新一代两轮车数字仪表盘参考平台还丰富了两轮车基于连接的功能,包括:

  • 接收实时车辆信息,包括电池电量、路线、速度和行驶距离

  • 找到最近的充电站、公共停车区和其他地点

  • 共享支持两轮车维修计划的更新和警报

  • 两轮车远程上锁和解锁

  • 与交通管理和执法部门分享安全问题和恶劣路况

  • 通过云进行车队管理

i.MX RT1170:为两轮车带来先进的技术

虽然恩智浦i.MX应用处理器已在汽车市场广泛采用多年,但i.MX RT1170跨界MCU在低端汽车和两轮车中部署的互联数字显示屏和仪表盘中日益走俏。i.MX RT1170跨界MCU为车载显示屏提供了两全其美的功能:既具有微处理器的高性能和高集成度,还提供MCU的低成本、易用性和实时功能。

i.MX RT1170跨界MCU是首款车规级i.MX RT产品,温度范围为-40至+125°C。功能丰富的MCU具有两个高能效的Arm Cortex-M CPU核和卓越的多媒体功能,包括支持矢量图形的2D GPU和OpenVG™库。除了RGB显示器和并行CMOS传感器摄像头接口外,i.MX RT1170还支持MIPI CSI和DSI,为开发人员提供了更多选择。i.MX RT1170提供具有人工智能 (AI) 和机器学习 (ML) 功能的各种连接选项。作为质量管理 (QM) 级器件,i.MX RT1170 MCU可以使用额外的硬件支持ASIL-B汽车安全解决方案。

恩恩智浦及其生态系统合作伙伴提供全面的支持,帮助开发人员快速开始设计,并迅速过渡到完整的产品开发和大规模生产。MCUXpresso软件和工具套件使恩智浦i.MX产品组合能够提供一致的体验。

4.png

i.MX RT1170跨界MCU框图

AW611:为两轮车的音频连接赋能

AW611音频连接解决方案是一款高度集成的2.4/5GHz双频1x1 Wi-Fi 6 (802.11ax)和蓝牙/BLE 5.2单芯片解决方案,专为汽车市场优化,达到了AEC-Q100 3级标准。这种高集成度有助于降低系统成本和外部BOM,同时实现内部和4G LTE等外部射频之间的有效共存。

AW611包含搭载恩智浦802.11ax (Wi-Fi 6) 技术的全功能Wi-Fi子系统,与上一代产品相比,其吞吐量更高、网络效率更高、延迟更低、范围更广。AW611还集成了一个独立的Bluetooth 5.2子系统,支持蓝牙和BLE。该器件支持蓝牙配置文件,如免提功能 (HFP)、音频流的高级音频分发配置文件 (A2DP) 以及双宽带语音 (WBS) 等附加配置文件。

5.jpg

AW611内部框图

KW45:为两轮车带来高性价比的蓝牙连接

该参考平台还包括KW45 BLE无线MCU,提供安全的车辆门禁和车辆定位服务。KW45的三核架构集成了96MHz Arm Cortex-M33应用内核、专用的Cortex-M3无线模块内核和隔离的EdgeLock安全区域。它还集成了符合BLE 5.3标准的无线单元,可同时支持多达24个安全连接。

6.png

KW45架构框图


实现安全、可靠、经济高效的两轮车设计

两轮车开发人员现在可以利用恩智浦在汽车娱乐中控、TFT显示技术和安全连接方面的深厚专业知识,以及恩智浦广泛的车规级处理器、无线器件、音频解决方案和开发工具组合。

恩智浦的互联数字仪表盘参考平台提供了先进的技术,为下一代安全、可靠、经济高效的两轮车设计奠定了基础。

如需了解有关该参考平台的更多信息,请访问恩智浦两轮车互联数字仪表盘方案页面>>

本文作者

1698976347934710.jpg

Shweta Latawa,恩智浦半导体边缘处理汽车事业部经理。Shweta现居德克萨斯州奥斯汀,目前负责汽车领域营销及i.MX 93应用处理器、i.MX RT1170跨界MCU等恩智浦产品的采用。她还成功领导了恩智浦数字网络产品中最复杂产品的端到端执行,处理研发运营和治理、公司战略和业务转型,以及恩智浦 (以及之前的飞思卡尔和摩托罗拉) 的设计工程。她拥有德克萨斯大学奥斯汀分校的工商管理硕士学位和印度塔帕尔研究所的工程学士学位。

来源:NXP客栈(作者:Shweta Latawa)

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 25

物联网设备的数量稳步增长,已经超过了人口数量,并且预计还会继续增长。当今工业物联网 (IIoT) 系统中,互联电子设备的数量也在激增。工业物联网不断数字化、覆盖面积不断增长,各行各业对技术的使用,促进了数据处理的效率,且降低了成本,但却增加了潜在威胁。网络攻击可能会威胁我们的环境,危及工作人员安全,并影响组织机构的财务状况。

现代工业系统极其复杂,至少可以说,确定特定产品的安全需求可能会令人望而生畏。为了帮助简化确定安全需求的任务,恩智浦采用结构化的简化框架确定了一套全面的安全定义。我们称之为“安全原语 (Security Primitive)”,可基于用例及高级安全需求查找合适的产品或相关安全标准。

参见以下示例,了解使用方法。假设您正为智能商业楼宇设计门禁系统。系统将生成、存储和传输有关居住者及其进出的敏感数据,并需要微控制器来保护其使用的各个阶段所处理的数据。此外,软件系统需防止黑客攻击。

“▲
▲ 工业环境中互联设备的数量日益增长,确定合适的安全需求至关重要

使用安全原语,可快速确定第一个需求:在存储或处理微控制器上的数据时,需要保护长期数据存储和短期存储器。“安全(加密)存储”原语涵盖了这一点。

防止黑客攻击软件的第二个要求是系统软件的完整性和真实性,可与“信任根”原语相关联。安全属性信任根与制造过程中在平台上建立的初始信任根有关,也是设备调试的基础。我们可以通过在可信设施内制造IIoT设备来实现,或者如果可用,也可在零信任环境中使用预先配置的安全元件来实现。

安全原语是工业和物联网安全要求的通用词汇,了解更多信息,请下载相关资料>>

将这些安全需求的高层概述转换为相应的安全原语,是确定具备满足客户的必要安全功能的恩智浦产品的第一步。这种安全映射使恩智浦能够快速确定哪些平台和产品最适合此用例:例如,选择i.MX RT1170跨界MCU系列可作为该客户的潜在解决方案。

具体来说,对于安全存储,i.MX RT1170具有安全的非易失性存储,包括篡改保护。此外,它还支持安全内存。i.MX RT1170上的信任根通过高保证启动来启用。通过此安全启动过程,启动镜像将得到验证,i.MX RT1170可以证明安全可靠的状态:换句话说,它可以检测对软件所做的任何修改。

恩智浦的安全定义是收集特定用例的安全功能要求和流程要求的入口点。因此,安全原语是一个很好的起点,能以结构化的方式将安全需求映射到产品,以便找到满足需求的安全解决方案。

本文作者

本文作者是Aylin Buyruk和Joppe Bos。Sara Aylin Buyruk是恩智浦半导体公司CTO机构的密码与安全能力中心 (CCC&S) 的成员。她现居荷兰,拥有埃因霍温理工大学 (Eindhoven University of Technology) 网络安全硕士学位,从事工业和物联网安全部门工作。

Joppe W. Bos是恩智浦半导体公司CTO办公室密码与安全能力中心的密码研究员。他还担任国际密码学研究协会 (IACR) 秘书。他的研究重点是计算数论和公钥密码中使用的高性能算法。

来源:NXP客栈
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 16

在前一篇文章 《i.MX RT1060/1010上串行NOR Flash冗余程序启动设计》里,我详细介绍了i.MX RT10xx上的冗余程序启动设计,本质上这就是个双备份程序启动, NORFlash里存两份一样的image,物理地址靠前的image 0启动失效就继续启动后面的image 1,多一层保障。

i.MX RT1170是区别于i.MX RT10xx的第二代架构,性能/功能更加强大,其在继承 i.MX RT10xx冗余程序启动的基础上,新增了双程序可交替启动设计,今天我们就来聊聊这个话题:

一、初识双程序可交替启动

与i.MX RT10xx一样,这里要聊的还是在一片挂载在FlexSPI上的串行NOR Flash里做冗余/双程序设计,就是下图中的image L和image H,不涉及LPSPI接口Flash B里的image 2。

“i.MX

先说跟i.MX RT10xx上一样的冗余程序启动流程,i.MX RT1170上电先启动物理地址靠前的image L,如果image L被破坏了,则继续启动image H。

什么是双程序可交替启动呢?简单说就是物理地址靠前的image L并不总是上电首先启动的image,在i.MX RT1170上新增了如下原型的image version启动头(在固定偏移 0x600 处),芯片上电 BootROM 会尝试判断两个 image L/H 里的 version 头版本,高版本的 image 优先被启动。这种设计方便了 OTA 升级。

Note: 当image L/H中均不含有效version启动头时(img_ver 等于 0xFFFFFFFF,或者高低16bit不符合取反关系),双程序可交替启动特性就不生效,此时等效于冗余程序启动,image L 永远被优先启动。

typedef struct
{
    uint16_t version;     // 版本值
    uint16_t inversion;   // version值的取反(~version)
} img_ver_t;

“i.MX

二、回顾冗余程序启动

在测试双程序可交替启动新特性之前,还是先过一下冗余程序启动。按照文章《i.MX RT1060/1010上串行NOR Flash冗余程序启动设计》第2节里一模一样的方法,在恩智浦官方MIMXRT1170-EVK开发板上做测试,这个板子FlexSPI1上挂了两片Flash,默认连接的16MB QuadSPI Flash,还有一片 64MB OctalFlash(需要做板子改动才能使能)。

在 i.MX RT1170 fuse 里关于冗余程序启动的使能位定义与i.MX RT10xx上差不多,只不过 fuse 地址从 0x6E0 换到了0xC80。还是跟之前测试一样借助MCUBootUtility工具将 FLEXSPI_NOR_SEC_IMAGE_OFFSET 烧录为 0x10,xSPI_FLASH_IMAGE_SIZE 保持默认 0,即第二份 image 偏移地址在 Flash 0x400000(4MB)处,最大 image 长度也是4MB。

“i.MX

继续用\SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\led_blinky\cm7\iar\flexspi_nor_debug例程生成两个稍微不一样的 image,闪灯间隔时间一个是200ms(image L - iled_blinky_cm7_delay200ms.bin),另一个是 2s(image H - iled_blinky_cm7_delay2s.bin)。在 MCUBootUtility 工具主界面下使用 All-In-One 操作将 image L 下载进 Flash(baseaddress 设为 0x30000400),使用通用编程器界面 Write 操作将 image H 也下载进 Flash(Start 设为0x400400)。

现在Flash 里有了两份 image,当第一份 image 启动失败后,i.MX RT1170 BootROM 不是立刻去执行下一份 image ,还是那个取巧的方法,在一个软复位不置位的寄存器里(SRC_GPR10)标记当前状态,然后调用 NVIC_SystemReset() 重新进入 BootROM 执行。不过此时标记位从 GPR10[30] 换到了 GPR10[27:26],虽然是 2bit 状态,但设值 1/2/3 等效于设值 1,因为对于串行 NOR Flash 最多就是两份 image。这时候如果你想挂 J-Link 改写 SRC_GPR10 去做快速验证恐怕无法如愿,原因请看 《i.MX RT1170上用J-Link连接复位后PC总是停在0x223104》

“i.MX

所以在i.MX RT1170上只能老老实实做破坏 image 完整性的动作来验证冗余程序启动,经实测其效果与i.MX RT10xx 是完全一致的。

三、实测双程序可交替启动

现在我们开始实测双程序可交替启动,主要的工作量就是为 image L 和 image H 添加 version 启动头,并且将它们分别下载进 Flash。因为我们想验证物理地址靠后的 image H 比 image L 优先启动(冗余程序启动做不到这点),所以需要将 image H 的 version 头版本设高一点。

3.1 为 image 添加version 启动头

还是在\SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\led_blinky\cm7\iar\flexspi_nor_debug例程基础上,首先在工程链接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 添加如下语句,指定 .img_ver 段的位置。

define symbol m_boot_img_ver_start           = 0x30000600;

place at address mem: m_boot_img_ver_start { section .img_ver };

然后在工程随便一个源文件里添加如下常量 s_bt_img_l_ver 定义,这个 image 闪灯间隔时间是 200ms(image L -iled_blinky_cm7_delay200ms_ver0.bin),版本是 0x0000(注意编译链接工程时为防止 s_bt_img_l_ver 被优化,可以在工程选项 Linker / Input /Keep symbols 里将其添加进去)。

const img_ver_t s_bt_img_l_ver @ ".img_ver" = {
    .version = 0x0000,
    .inversion = ~0x0000,
};

同样的工程,再生成另一个闪灯间隔时间为 2s(image H -iled_blinky_cm7_delay2s_ver1.bin) 的 image 时使用如下常量s_bt_img_h_ver 定义,版本是 0x0001。

const img_ver_t s_bt_img_h_ver @ ".img_ver" = {
    .version = 0x0001,
    .inversion = ~0x0001,
};

当然如果你嫌上述方法繁琐,也可以直接在最终 image binary 文件上做修改(注意 offset 位置一定要找对,i.MX RT1170 SDK XIP binary 文件起始数据对应 Flash 偏移是 0x400,因此文件中 0x200 处才对应 Flash 偏移 0x600):

“i.MX

3.2 下载含 version 头的image 进 Flash

现在需要借助 MCUBootUtility 工具的通用编程器功能分别将两个含 version 头的 image L/H 下载进 Flash。这里需要注意的是此时 image L 无法再通过主界面 All-In-One 操作来下载了,因为工具 v3.4 版本及以下没有对 version 启动头做识别处理,因此会丢掉 version 头数据(这个考虑会在 v4.0 之后加入支持)。

“i.MX

“i.MX

两个 image下载完成,一切工作就结束了,这时候你调整芯片启动模式到 2'b10 - Flash boot,给板卡重新上电,应该可以看到 image H 正在执行。

3.3 BootROM中判断version的逻辑

BootROM中关于 version 启动头是否有效以及版本高低判断逻辑其实是有一点复杂的,这里把具体代码分享给大家,方便大家为 image 设置有效的 version 头以及正确使能这个双程序可交替启动特性。

判断逻辑代码主要意思是仅当 image L 的版本不是 0xFFFFFFFF 且 image H 的版本是有效的(img_ver 高低16bit符合取反关系)情况下,如果 image L 版本无效或者 image L 版本有效但比 image H 版本低,则物理地址靠后的 image H 优先启动。除此以外其余情况,一律是物理地址靠前的 image L 优先启动。

uint32_t image_l_base = FlexSPIx_AMBA_BASE
uint32_t image_h_base = FlexSPIx_AMBA_BASE + FLEXSPI_NOR_SEC_IMAGE_OFFSET

uint32_t get_image_index(void)
{
    uint32_t redundant_boot = ((SRC->GPR[9] & 0x0C000000) >> 26);

    static uint32_t image_index[] = { 0, 0 };
    img_ver_t image_l_version = *(img_ver_t *)(image_l_base + 0x600);
    img_ver_t image_h_version = *(img_ver_t *)(image_h_base + 0x600);
    if ((image_l_version.version != 0xFFFFu || image_l_version.inversion != 0xFFFFu) &&
        ((0xFFFFu & image_h_version.version) == (0xFFFFu ^ image_h_version.inversion)) &&
        ((0xFFFFu & image_l_version.version) != (0xFFFFu ^ image_l_version.inversion) || (image_l_version.version < image_h_version.version)))
    {
        image_index[0] = 1;
    }
    else
    {
        image_index[1] = 1;
    }

    return image_index[redundant_boot];
}

痞子衡在MIMXRT1170-EVK 开发板上对image 版本设置情况也做了比较全面的实测,测试结果如下:

“i.MX

四、一些关于image的注意事项

1)虽然文中所有的测试均是针对 XIP image,但这个冗余程序/双程序可交替启动特性对于 Non-XIP image 也同样适用。

2)如果是 XIP image,其链接地址不一定要固定在偏移 0x2000 处,因为 IVT 的存在,其是可以链接在偏移 0x2000 之后的任意位置的。

3)如果是 Non-XIP image,在 SDK 包里无法直接生成含启动头的 Non-XIP image binary,这时候可以先使用 MCUBootUtility 主界面的 All-In-One 操作下载一次 image,再通过通用编程器界面 Read 操作读回来便是含启动头的 Non-XIP image binary。

相关阅读
《i.MX RT1060/1010上串行NOR Flash冗余程序启动设计》

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 152

恩智浦的i.MX RT系列跨界处理器,为在设备端实现智能运算提供了更高性价比的方案,解锁了在嵌入式应用中部署人工智能算法的新途径。

恩智浦的工程师们从多种角度,做了很多有创新的尝试和工作,为客户提供了丰富的选项,也很好地展示了i.MX RT产品的高性能和高扩展适应性。

本文及随后的一些小文将分别介绍这些精彩的成果。

“基于i.MX

引 言

多目标检测是机器学习重要的研究领域之一,可以广泛应用于机器人,安防和工业监控等领域。

针对多目标检测任务,目前比较流行的是基于卷积神经网络(Conventional Neural Network,CNN)的算法,例如Yolo,SSD和RetinaNet等。

然而,目前已有CNN方法均不适用于嵌入式平台的部署,这是因为目标检测是一个比较繁重的任务,而现有的检测模型过于复杂,对平台的算力和内存的需求很高,因此无法将其部署在嵌入式平台。

本文基于开源算法,提出了一种轻量化的目标检测网络,大量运用深度可分离卷积以及全新的尺度变换结构,使得模型计算复杂度和结构得到极大简化,进而使多目标检测在MCU上的实现成为可能。

提出的检测算法在NXP微控制器i.MX RT1170上的部署实验结果表明:该算法极大降低了对于ROM和RAM的消耗,运行时间得到大幅度优化,检测速度最高可达10FPS,并且模型精度可以媲美开源的YoloV3-tiny,YoloV4-tiny等模型。

实时多人体检测算法

1. 网络结构设计

本文采用的网络结构设计主要分为两部分,第一部分为网络主体结构,用来逐层提取样本的有效特征。该主体结构借鉴了MobileNetV2的轻量特性,并充分考虑了模型在部署方面对于ROM和RAM的优化。

网络主要特点概括如下:

(1)大量运用深度可分离卷积来减少参数量,进而减少ROM的消耗。深度可分离卷积相对于传统的卷积可以大大较少参数规模。例如对于一个输入有8个通道,输出有16个通道的传统3*3卷积, 其参数量为16*8*3*3=1152;而深度可分离卷积参数量仅有8*3*3+1*1*8*16=200。

(2)模型结构设计上遵循的是加大网络模型深度,缩小每层的宽度,这样带来的好处是减少每层推理所需要的内存占用。这是因为在嵌入式设备中,运行内存极为紧张,而优化过的模型可以减少RAM的使用。

(3)考虑到模型部署需要用到8位整型量化,这里我们采用Relu激活函数。这是因为目前还没有任何研究表明哪种激活函数具有更高的精度,但对于量化来说,显然Relu会比pRelu(图1),leakyRelu或者sigmoid等函数具有更快的推理时间和更低的量化损失。

“图1
图1 Relu和pRelu激活示意图

(4)网络设计中尺度变换结构采用了1*1,3*3和5*5三种卷积核尺寸,进而同时兼顾不同大小目标的定位精度;同时,我们提出的尺度预测结构更为简单,减少了网络模型部署的难度。

2. 网络模型融合压缩与量化

对于训练后的网络模型,可以通过网络模型的融合压缩以及量化技术,加快其在嵌入式设备上的推理时间。

因为本文设计网络中为了使每层数据分布更加均匀(有助于减少整型量化中的损失),采用了Batchnorm对数据进行约束。此外,Batchnorm还可以将输入分布更多的分散在非饱和区,进而减小梯度弥散,加快收敛过程。模型训练结束后,Batchnorm中参数就固化了,可以将其参数融合进卷积层中,最终避免Batchnorm层在实际模型推理中的时间消耗。

模型量化的目的是为了加快模型在MCU上的推理时间,这是因为大多数MCU内核采用Arm Cortex-M 架构,其对定点乘法运算的速度要比浮点运算快得多。此外,模型量化还可以节省模型对于ROM和RAM的需求。

本文采用全8位整型量化的方式对模型进行推理加速。

3. 实验结果分析

本文提出的模型针对目前较为流行的开源公版模型YoloV3-Tiny和YoloV4-Tiny进行对比,实验结果如下:

“基于i.MX

“基于i.MX

“图2
图2 模型对比实验图

如图2所示,该模型极大地降低了ROM和RAM的占用,这对于内存大小较为紧张的嵌入式设备来说意义重大。

而在推理时间上,本文提出的模型具有更为突出的优势。作者在NXP微控制器i.MX RT1170(ARM Cortex-M7,1GHz)上的实验结果表明,相比开源模型动辄几秒钟的推理时间,我们提出的网络模型将时间消耗控制在200ms以内,使其部署在微控制器上更加高效。

注意,图2中的时间消耗对比是假设YoloV3-Tiny和YoloV4-Tiny均进行8位整型量化,并且直接使用未经修改的开源算法得到的推理时间。实际上,直接使用开源的、未经修改的YoloV3-Tiny和YoloV4-Tiny等网络结构,由于其复杂结构,部署难度较高。而本文提出网络模型在结构上进行了极大优化,可以利用现有开源工具进行量化部署。

对于模型预测精度,作者进行了如图3的测试对比实验。在多个样本集上,本文提出模型的预测精度可以媲美开源的YoloV3-Tiny和YoloV4-Tiny等模型。

“图3
图3 模型预测效果对比图

基于i.MX RT1170的实时多人体检测系统

神经网络模型在边缘设备上的部署,是深度学习技术落地的一大关键部分。本文以多人体检测模型为例,分享如何将现有的神经网络模型,部署到NXP的微控制器i.MX RT1170EVK开发板上,并实现实时多人体检测系统。

部署流程如图4所示,首先需要将训练的模型进行模型框架转换,这是因为开源的量化工具仅支持少量的模型框架。

第二步需要对模型进行融合优化,然后利用量化工具将模型进行量化,并转换为MCU可以执行的代码;最后对模型的预处理和后处理进行编程实现,这样摄像头抓取的图像数据就可以进行预处理后送入量化模型,然后根据模型输出特征图进行后处理,提取出有效的候选框作为预测框。

“图4
图4 神经网络边缘设备部署流程图

本文采用NXP i.MX RT1170EVK开发板进行多人体检测系统的实现。

i.MX RT1170是NXP的一款跨界MCU,采用主频达1GHz的Cortex®-M7内核和主频达400MHz的Cortex-M4,这里我们仅使用M7内核。

此外,RT1170EVK上搭载了MIPI接口的OV5640摄像头,分辨率达到720*1280,同时配有5.5寸高清显示屏,分辨率同样达到720*1280。

这里我们采用FreeRTOS系统进行摄像头的实时读取和LCD的实时显示,摄像头和LCD的分辨率均设为最高的720*1280,刷新率均设为15FPS。

系统实现流程如图5所示,摄像头抓取的图像经过PXP转换,然后进行预处理送入模型,最后经过后处理将预测框显示在LCD上。

“图5
图5 人体检测系统实现流程

最终,基于i.MX RT1170的人体检测系统可以实现快速精准的多人体位置预测,测试视频如下。

“于i.MX

视频中算法检测速度接近5FPS,充分验证了提出模型的有效性和轻量性。

此外,本文算法的一大优势在于运行时间可控,并不会因为被检测人体数量的多少而改变。模型的速度决定了最远检测距离。以下测试结果分别是算法在10FPS,5FPS和3FPS速度下的最远检测距离。

“基于i.MX

“基于i.MX

“图6
图6 算法检测距离与速度

结束语

本文给出的多人体检测算法和系统,为在NXP的MCU上部署多目标检测任务带来了更多的可能性。

结合深度学习模型网络的优化,以及模型融合量化等技术,可以在保证模型精度的同时,实现在嵌入式平台上推理速度的最优化,进而才能将深度学习技术更好的落地。

来源: 恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 300

i.MX RT1170的CCM模块内置了一个时钟观测器,全称为Clock Observe。它就像示波器一样可以检测时钟的运行频率,在没有示波器的情况或者开发低功耗应用时非常有用。强大的特点,在于它几乎可以测量芯片内几乎所有的时钟源(Clock Source)和时钟根(Clock Root)。

可测量的时钟源高达22个,基本覆盖了RT1170所有的时钟源。可测量的时钟根高达83个,覆盖了绝大多数的外设时钟根。具体可以测量的时钟源和时钟根列表可以参考 fsl_clock.h的宏定义,搜索关键词Clock OBSERVE SIGNALS即可找到相关的列表。

“巧用i.MX

介绍完基本功能,我们来看一下如何使用这个时钟观测器,也就是如何获取想观测的时钟频率,非常简单,调用下面的API函数接口即可:

uint32_t CLOCK_GetFreqFromObs(uint32_tobsSigIndex, uint32_t obsIndex)

举个例子,用户想知道现在RT1170的主频,Bus总线的时钟频率,怎么办呢?凉拌!

CLOCK_GetFreqFromObs(CCM_OBS_M7_CLK_ROOT);
CLOCK_GetFreqFromObs(CCM_OBS_M4_CLK_ROOT);
CLOCK_GetFreqFromObs(CCM_OBS_BUS_CLK_ROOT);
CLOCK_GetFreqFromObs(CCM_OBS_BUS_LPSR_CLK_ROOT);

直接调用的话,看起来不太方便,通过串口把这些数值打印到终端上,看起来就方便很多了。

PRINTF("M7 CLK is %d MHz\r\n", CLOCK_GetFreqFromObs(CCM_OBS_M7_CLK_ROOT) / 1000000);
PRINTF("M4 CLK is %d MHz\r\n", CLOCK_GetFreqFromObs(CCM_OBS_M4_CLK_ROOT) / 1000000);
PRINTF("BUS CLK is %d MHz\r\n", CLOCK_GetFreqFromObs(CCM_OBS_BUS_CLK_ROOT) / 1000000);
PRINTF("BUS LPSR CLK is %d MHz\r\n", CLOCK_GetFreqFromObs(CCM_OBS_BUS_LPSR_CLK_ROOT) / 1000000);

下图为打印的结果,并不完全是上面代码真实的状态,只是看个意思,我们通过上面的函数即可测量出当前对应时钟根的工作频率。

“巧用i.MX

将函数中的参数进行变换,我们就可以测量自己感兴趣的时钟频率。那么这个观测器在实际中都有哪些作用呢?

1)测量时钟的工作频率

在运行不熟悉代码的时候,不知道别人时钟是怎么配置的时候,获取其工作频率。而不用一行一行翻代码进行工作频率解析。笔者自己经常观测的就是PLL的PFD时钟频率。

2)确定时钟源是否开启

如果把之前提到的函数进行细部探究,便会发现程序中有一行while(),等待测量结束非0的状态。这行代码的功能主要是等待测量结果更新,如果时钟源没开则会在这里一直等下去。
利用这个特性,就可以判断被测时钟源是否开启。当然这也是双刃剑,调试的时候要记得这个特性,不然程序运行到这里之后就会停下来,一直等下去。

“巧用i.MX

需要注意的点:

1)OBS的观测需要依靠外部的32K晶振时钟

2)OBS的功能仅限于调试目的,精度上肯定比不上示波器,但是看个大概还是问题不大的。再强调一遍哦,调试目的,精度不保证,就看个大概!

3)OBS应该在室温下工作,并且观测的频率不应该超过400MHz。关于400MHz这个限制,笔者在调试的过程中发现,其实大于这个数值也能测准,也能用。但是不负责,不保证,毕竟有这么大个NOTE在RM里写着呢。

“巧用i.MX

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 63
订阅 RSS - i.MX RT1170