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文章
329浏览量
60499 -
TensorFlow Lite
+关注
关注
0文章
26浏览量
602
发布评论请先 登录
相关推荐
评论