所有关于电路
行业的文章

如何实现数字识别与TensorFlow Lite使用i.MX RT1060交叉MCU

2020年9月22日通过大卫·皮斯库拉,NXP半导体公司

本文以MNIST eIQ为例介绍数字检测和识别,它由几个部分组成——数字识别由TensorFlow Lite模型执行,使用GUI提高i.MX RT1060设备的可用性。

i.MX RT1060交叉MCU同样适用于高性价比的工业应用和需要显示功能的高性能和数据密集型消费产品。本文通过说明如何实现一个可以检测和分类用户手写输入的嵌入式机器学习应用程序来演示基于Arm®Cortex®- m7单片机的功能。

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

查看mist数据集和模型

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

图1所示。MNIST数据集的例子

这些样本来自美国的高中生和人口普查局员工。因此,数据集主要包含在北美编写的数字示例。例如,对于欧式的数字,必须使用不同的数据集。在这个数据集上使用卷积神经网络通常能得到最好的结果,即使是简单的网络也能达到很高的精度。因此,TensorFlow Lite是这个任务的合适选择。

本文选择的MNIST模型实现可以在GitHub上作为官方TensorFlow模型之一使用,它是用Python编写的。该脚本使用Keras库和tf。数据,tf.estimator. estimator,和tf。层API,构建了一个能够对测试样本实现高精度的卷积神经网络:

图2。使用模型的可视化。

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

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

什么是TensorFlow Lite,在这个例子中它是如何使用的?

TensorFlow是一个著名的深度学习框架,被大公司广泛应用于生产。它是一个由谷歌开发和维护的开源、跨平台的深度学习库。低级Python API对于有经验的开发人员和高级库(如本例中使用的类库)很有用。此外,TensorFlow由一个大型社区和优秀的在线文档、学习资源、指南和来自谷歌的示例支持。

为了让计算受限的机器(如移动设备和嵌入式解决方案)能够运行TensorFlow应用程序,谷歌开发了TensorFlow Lite框架,它不支持TensorFlow框架的全部操作。它允许这些设备在预先训练的TensorFlow模型上运行推断,这些模型被转换为TensorFlow Lite。作为回报,这些转换后的模型不能被进一步训练,但可以通过量化和剪枝等技术进行优化。

将模型转换为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 =占位符

——output_array = Softmax

——inference_type =浮动

——input_data_type =浮动

——post_training_quantize

——target_ops TFLITE_BUILTINS

最后,使用xdd工具将TensorFlow Lite模型转换为一个二进制数组,以便应用程序加载:

xxd -我converted_model。tflite > converted_model.h

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

快速介绍嵌入式向导工作室

为了利用MIMXRT1060-EVK的图形功能,这个项目中包含了一个GUI。为此,我们使用了嵌入式向导工作室(Embedded Wizard Studio),这是一个IDE,用于为将在嵌入式设备上运行的应用程序开发gui。虽然有一个免费的IDE评估版本可用,但这个版本限制了图形用户界面的最大复杂性,而且还在GUI上添加了水印。

嵌入式Wizard Studio的优势之一是它能够基于XNP的SDK生成MCUXpresso和IAR项目,这意味着在IDE中创建用户界面后,开发人员可以立即在他们的设备上测试它。

IDE提供了对象和工具,如按钮、触摸敏感区域、形状等,这些都放在画布上。然后,它们的属性被设置为符合开发商的需求和期望。所有这些都以直观和用户友好的方式工作,并且极大地加快了GUI开发过程。

然而,有几个转换步骤必须将GUI项目与现有的eIQ应用程序项目合并,因为生成的GUI项目是用C语言编写的,而qIQ示例是用C/ c++编写的。因此,有些头文件的内容必须包含以下内容:

# ifdef __cplusplus

外来的“C”{

# endif

/* C代码*/

# ifdef __cplusplus

}

# endif

此外,大部分源文件和头文件被移动到SDK的中间件文件夹中的一个新文件夹中,并添加了新的包含路径以反映这些更改。最后,对一些特定于设备的配置文件进行了比较和适当的合并。

完成的应用及其特点

应用程序的图形界面显示在触摸屏上。它包含一个用于书写数字的输入区和一个用于显示分类结果的输入区。run推断按钮执行推断,clear按钮清除输入和输出字段。应用程序将预测的结果和置信度输出到标准输出。

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

TensorFlow Lite模型精度

如前所述,该模型对美式手写数字进行分类时,可以对训练和测试数据实现较高的准确性。然而,在本应用程序中却不是这样,这主要是因为用手指在LCD上写的数字与用钢笔在纸上写的数字是不一样的。这突出了对生产模型进行真实生产数据培训的重要性。

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

实现细节

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

clear按钮的位置设置每个像素的颜色在这两个领域的背景颜色,并运行推理按钮保存引用输入区,底层的位图,区域的宽度和高度,然后将它们传递给本机C程序流程。

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

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

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

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

TensorFlow Lite:一个可行的解决方案

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

i.MX RT crossover MCU系列可以实现到各种嵌入式应用程序中,如本文提供的示例。恩智浦在i.MX RT跨界MCU系列上有充足的信息,可以帮助弥合性能和可用性之间的差距。

有关i.MX RT交叉mcu的更多信息,请访问i.MX RT产品页面

行业文章是一种内容形式,它允许行业合作伙伴以编辑内容不太适合的方式与All About Circuits阅读器共享有用的新闻、消息和技术。所有的行业文章都受到严格的编辑指导,目的是为读者提供有用的新闻,技术专长,或故事。在行业文章中所表达的观点和意见是合作伙伴的观点,而不一定是所有关于电路或其作者的观点和意见。