0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用i.MX RT1060跨接MCU通过TensorFlow Lite实施数字识别

嵌入式星球 2020-09-29 11:45 次阅读

i.MX RT1060交叉MCU同样适用于经济高效的工业应用以及需要显示功能的高性能和数据密集型消费类产品本文通过解释如何实现一种嵌入式机器学习应用程序来演示该基于Arm®Cortex®-M7的MCU的功能,该应用程序可以检测和分类用户的手写输入。

为此,本文重点介绍流行的MNIST eIQ示例,该示例由几个部分组成-数字识别由TensorFlow Lite模型执行,并且GUI用于提高i.MX RT1060设备的可用性。

看一下MNIST数据集和模型


本文使用的数据集包括60,000个训练和10,000个手写数字居中灰度图像测试示例。每个样本的分辨率为28x28像素:

图1.MNIST数据集示例

样本是从美国的高中生和人口普查局员工那里收集的。因此,数据集主要包含在北美书写的数字示例。例如,对于欧洲风格的数字,必须使用其他数据集。与该数据集一起使用时,卷积神经网络通常会提供最佳结果,甚至简单的网络也可以实现高精度因此,TensorFlow Lite是适合此任务的选项。

本文选择的MNIST模型实现可在GitHub上作为正式的TensorFlow模型之一获得,并且使用Python编写。该脚本使用Keras库以及tf.data,tf.estimator.Estimator和tf.layers API,并构建了一个卷积神经网络,可以在测试样本上实现高精度:

图2.所用模型的可视化。

相应的模型定义如下图3所示。

图3.与模型可视化相对应的模型定义。

什么是TensorFlow Lite?在本示例中如何使用?


TensorFlow是一个著名的深度学习框架,已被大型公司广泛用于生产中。这是由Google开发和维护的开源,跨平台深度学习库。提供了一个低级Python API,它对经验丰富的开发人员非常有用,并且提供了高级库(例如本例中使用的库)。此外,TensorFlow得到了广大社区的支持,并获得了Google的出色在线文档,学习资源,指南和示例。

为了使受计算限制的机器(例如移动设备和嵌入式解决方案)能够运行TensorFlow应用程序,Google开发了TensorFlow Lite框架,该框架不支持TensorFlow框架的全部操作。它允许此类设备在已转换为TensorFlow Lite的预训练TensorFlow模型上进行推理。作为回报,这些经过转换的模型无法进行进一步的训练,但可以通过量化和修剪等技术进行优化。

将模型转换为TensorFlow Lite


上面讨论的经过训练的TensorFlow模型必须先转换为TensorFlow Lite,然后才能在i.MX RT1060 MCU上使用。为此,使用tflite_convert对其进行了转换,并且出于兼容性原因,使用TensorFlow的1.13.2版来训练和转换模型:

tflite_convert
--saved_model_dir=
--output_file=converted_model.tflite
--input_shape=1,28,28
--input_array=Placeholder
--output_array=Softmax
--inference_type=FLOAT
--input_data_type=FLOAT
--post_training_quantize
--target_opsTFLITE_BUILTINS

最后,使用xdd实用程序将TensorFlow Lite模型转换为二进制数组,以供应用程序加载:

xxd-iconverted_model.tflite>converted_model.h

xdd是一个十六进制转储实用程序,可用于将文件的二进制形式转换为相应的十六进制转储表示形式,反之亦然。在这种情况下,TensorFlow Lite二进制文件将转换为可添加到eIQ项目的C / C ++头文件。转换过程和tflite_convert实用程序在eIQ用户指南中进行了详细说明。该实用程序也在Google的官方文档中进行了描述。

嵌入式Wizard Studio快速入门

#ifdef__cplusplus
extern"C"{
#endif
/*Ccode*/
#ifdef__cplusplus
}
#endif


为了利用MIMXRT1060-EVK的图形功能,该项目中包含一个GUI。为此,使用了嵌入式向导Studio,这是一个IDE,用于为将在嵌入式设备上运行的应用程序开发GUI。尽管可以使用IDE的免费评估版,但该版本限制了图形用户界面的最大复杂性,并且还在GUI上添加了水印。

Embedded Wizard Studio的优点之一是能够基于XNP的SDK生成MCUXpresso和IAR项目,这意味着在IDE中创建用户界面后,开发人员可以立即在其设备上对其进行测试。

IDE提供了放置在画布上的对象和工具,例如按钮,触敏区域,形状等。然后将其属性设置为适合开发人员的需求和期望。所有这些工作都以直观和用户友好的方式进行,并且大大加快了GUI开发过程。

但是,由于生成的GUI项目在C中,而qIQ示例在C / C ++中,因此,几个转换步骤必须将GUI项目与现有的eIQ应用程序项目合并。因此,某些头文件的内容必须包含以下内容:

此外,大多数源文件和头文件已移至SDK的中间件文件夹中的新文件夹,并且添加了新的包含路径以反映这些更改。最后,比较并正确合并了一些特定于设备的配置文件。

完成的应用程序及其功能

该应用程序的GUI显示在触敏LCD上。它包含一个用于输入数字的输入区域和一个显示分类结果的区域。运行推断按钮执行推断,清除按钮清除输入和输出字段。应用程序将预测的结果和置信度输出到标准输出。

图4.示例应用程序的GUI包含一个输入字段,一个输出字段和两个按钮。结果和置信度也会打印到标准输出中。

TensorFlow Lite模型精度

如上所述,该模型在对美国风格的手写数字进行分类时可以在训练和测试数据上实现高精度。但是,在本应用程序中不是这种情况,主要是因为用手指在LCD上书写的数字与用笔在纸上书写的数字永远不会相同。这突出了在实际生产数据上训练生产模型的重要性。

为了获得更好的结果,必须收集一组新的数据。此外,方法必须相同。在这种情况下,必须使用触摸屏输入来采集样品以绘制数字。存在进一步的技术来增加预测的准确性。恩智浦社区网站包含使用迁移学习技术的演练。

实施细节

嵌入式向导使用插槽作为触发器来对GUI交互做出反应,例如,当用户在输入区域上拖动手指时。在这种情况下,插槽会在手指下方连续绘制一个像素宽的线。该行的颜色由主颜色常数定义。

清除按钮的插槽将两个字段中每个像素的颜色设置为背景色,运行推断按钮将保存对输入区域,基础位图以及该区域的宽度和高度的引用,然后将其传递给本机处理它们的C程序。

由于来自机器学习模型的位图只有28x28像素大,并且输入区域被创建为112x112正方形,以使应用程序使用起来更加舒适,因此在缩小图像时需要进行额外的预处理。否则,该过程会使图像失真太多。

首先,创建一个具有输入区域尺寸的8位整数数组,并用零填充。然后,对图像和数组进行迭代,并将图像中每个绘制的像素存储为数组中的0xFF。处理输入时,主要颜色的像素被认为是白色,其他所有像素都被认为是黑色。此外,每个像素都扩大为3x3正方形以加粗线条,这将使图像缩小更为安全。在将图像缩放到所需的28x28分辨率之前,将图形裁剪并居中以类似于MNIST图像:

图5.包含预处理输入数据的数组的可视化。

当应用程序启动时,将分配,加载和准备机器学习模型。对于每个推理请求,模型的输入张量都将带有预处理输入,并传递给模型。输入必须逐像素复制到张量中,并且在此过程中必须将整数值转换为浮点值。NXP应用笔记包含了代码的详细内存占用。

TensorFlow Lite:可行的解决方案


使用机器学习的手写数字识别可能给嵌入式系统带来问题,TensorFlow Lite提供了可行的解决方案。使用此解决方案,可以实现更复杂的用例,例如数字锁上的引脚输入字段。如本文所述,在实际生产数据上训练生产模型至关重要。本文中使用的培训数据由用笔写在纸上的数字组成。反过来,当用于检测触摸屏上绘制的数字时,这会降低模型的整体准确性。此外,必须考虑到地区差异。

i.MX RT跨接MCU系列可以实现到各种嵌入式应用程序中,例如本文提供的示例。恩智浦(NXP)拥有有关i.MX RT跨接MCU系列的大量信息,可帮助弥合性能与可用性之间的鸿沟。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • tensorflow
    +关注

    关注

    13

    文章

    313

    浏览量

    60241
  • TensorFlow Lite
    +关注

    关注

    0

    文章

    27

    浏览量

    541
收藏 人收藏

    评论

    相关推荐

    浅谈i.MX RT10xx系列MCU外接24MHz晶振的作用

    浅谈i.MX RT10xx系列MCU外接24MHz晶振的作用
    的头像 发表于 10-30 17:22 383次阅读
    浅谈<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>10xx系列<b class='flag-5'>MCU</b>外接24MHz晶振的作用

    i.MX RT的FlexRAM配置问题

    i.MX RT的FlexRAM配置问题
    的头像 发表于 10-24 15:46 273次阅读
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的FlexRAM配置问题

    恩智浦i.MX RT1060/1010上串行NOR Flash冗余程序启动设计

    恩智浦i.MX RT1060/1010上串行NOR Flash冗余程序启动设计
    的头像 发表于 09-26 16:53 399次阅读
    恩智浦<b class='flag-5'>i.MX</b> <b class='flag-5'>RT1060</b>/1010上串行NOR Flash冗余程序启动设计

    基于NXP i.MX RT1021跨界MCU实现一个简单的波形采集

    基于NXP i.MX RT1021跨界MCU实现一个简单的波形采集,使用了RT1021设计了一个简单的核心板,然后使用信号发生器产生波形
    发表于 09-13 17:25 484次阅读
    基于NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1021跨界<b class='flag-5'>MCU</b>实现一个简单的波形采集

    有人可以在MCUXpresso IDE上分享RT1064或RT1060RT1050的工作示例吗?

    基于外部 FlexSPI Flash。可以在 RT1064 上使用 Internal FlexSPI Flash 吗? 3) 有人可以在 MCUXpresso IDE 上分享 RT1064 或 RT1060
    发表于 06-08 06:10

    需要设计高精度和高效率的变频器

    解码。这 控制级包括 i.MX RT1060 提供高速连接 通过编程为交流驱动模拟和数字输入和输出的 GPIO 包括 USB C 型、以太网和 TSN 连接。
    的头像 发表于 05-25 09:21 308次阅读
    需要设计高精度和高效率的变频器

    RT1050/1060/1064在硬件层面可以互换吗?我需要改变什么?

    我正在为我们的控制器使用 K66 和 KV58。 1) 我被告知 NXP 将更新 i.MX RT 系列而不是 K 和 KV 系列。我想开始开发基于 i.MX RT 系列的控制器。 2
    发表于 05-19 12:43

    i.MX RT10xx使用FlexIO实现XY2-100振镜控制协议

    本文介绍了如何使用i.MX RT系列芯片上的FlexIO实现XY2-100激光振镜控制协议。FlexIO模块是NXP Kinetis和i.MX RT系列
    的头像 发表于 05-18 09:21 3893次阅读
    在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>10xx使用FlexIO实现XY2-100振镜控制协议

    i.MX RT系列(例如 RT1050/1060)有多少个PWM通道?

    i.MX RT 系列(例如 RT1050/1060)有多少个 PWM 通道? 我可以像在 KV58 MCU(两个 flexPWM 模块)上做
    发表于 05-18 07:07

    i.MX RT1170自定义引导加载程序,如何在i.MX RT处理器上完成?

    我将在我的自定义 i.MX RT1170 板上开发自定义引导加载程序。在我的例子中,闪存驱动程序将通过 USB 读取以更新主要应用程序。 我正在研究
    发表于 05-17 08:13

    i.MX RT系列上是否有8个PWM通道可用?

    我使用 MKV58 通过 8 个 PWM 通道驱动 3 个 BLDC 和 1 个直流电机。 现在,我正在检查 i.MX RT 系列,只发现有 4 个 PWM 通道可供使用。 谁能告诉我 i.M
    发表于 05-06 06:33

    AzureWave AW-AM510-uSD和i.MX RT1060 EVK一直收到SDIO驱动程序初始化失败怎么解决?

    我正在使用 AzureWave AW-AM510-uSD 和 i.MX RT1060 EVK 板来试用 evkmimxrt1060_wifi_cli SDK 示例项目。我已经转到“/source
    发表于 04-28 07:35

    如何使用sdphost的ROM引导加载程序中区分i.MX RT1062和i.MX RT 1064?

    有什么方法可以通过读取特定寄存器来确定微控制器类型,而不是系列或 UID?我想在使用 sdphost 的 ROM 引导加载程序中区分 i.MX RT1062 和 i.MX
    发表于 04-27 08:37

    RT1060以太网器的资料和ARQ可以提供吗?

    RT1060以太网器的资料和ARQ可以提供吗?
    发表于 04-23 08:36

    i.MX RT1060的flexIO是否支持QSPI从仿真?

    我们有一个用MCU模拟SPI Nor-flash的需求。所以我们需要在 MCU 上支持 Quad-SPI、Dual-SPI slave 模式。i.MX 系列的 FlexIO 是否支持此功能?有示例代码供参考吗?
    发表于 04-20 07:05