Raspberry Pi探索雾计算

news/2024/5/19 14:45:22 标签: raspberry pi, Tensorflow lite, 边缘计算, 雾计算

在Raspberry Pi上使用Tensorflow Lite进行图像识别,对象和姿势检测。

雾(边缘)计算

Gartner将边缘计算定义为:“分布式计算拓扑的一部分,其中信息处理位于边缘附近-事物和人产生或消费该信息的地方。”

换句话说,边缘计算使计算(和一些数据存储)更靠近正在生成或使用其数据(特别是实时)的设备,而不是依赖于遥远的基于云的中央系统。 使用这种方法,数据不会出现延迟问题,从而减少了传输和处理的成本。 从某种意义上讲,这是一种“回到最近的过去”,其中所有计算工作都在桌面上而不是在云中本地完成。

边缘计算的开发是由于连接到互联网以从云接收信息或将数据传递回云的物联网设备的指数级增长。 许多物联网(IoT)设备在其运行期间会生成大量数据。

边缘计算为物联网应用提供了新的可能性,尤其是对于那些依靠机器学习(ML)完成诸如对象和姿态检测,图像(和面部)识别,语言处理以及避障等任务的应用。 图像数据是IoT的绝佳补充,同时也是重要的资源消耗者(如电源,内存和处理)。 运行经典AI的“边缘”图像处理

Tensorflow Lite –机器学习(ML)在最前沿

机器学习可以分为两个独立的过程:训练和推理

  • 训练:训练是指创建机器学习算法的过程。 训练涉及使用深度学习框架(例如TensorFlow)和训练数据集(请参见上图的左侧)。 物联网数据提供了训练数据的来源,数据科学家和工程师可以使用该数据来训练从故障检测到消费者智能的各种情况下的机器学习模型。
  • 推论:推论是指使用经过训练的机器学习算法进行预测的过程。 IoT数据可以用作训练有素的机器学习模型的输入,从而启用可以指导设备,边缘网关或IoT系统中其他位置的决策逻辑的预测(请参见上图的右侧)。

TensorFlow Lite是一个开源深度学习框架,可实现低延迟和小二进制大小的设备上机器学习推理。 它旨在简化在“网络边缘”的设备上执行机器学习的过程,而不是从服务器来回发送数据。

在设备上执行机器学习可以帮助改善:

  • 延迟:没有往返服务器的往返时间
  • 隐私权:无需任何数据即可离开设备
  • 连接性:不需要互联网连接
  • 功耗:网络连接耗电

TensorFlow Lite(TFLite)包含两个主要组件:

  • TFLite转换器将TensorFlow模型转换为供解释器使用的有效形式,并可以引入优化以改善二元大小和性能。
  • TFLite解释器在许多不同的硬件类型上运行了经过特别优化的模型,包括手机,嵌入式Linux设备和微控制器。

TensorFlow Lite-model在边缘设备上部署模型

总之,可以在TFLite FlatBuffer(例如model.tflite)中使用TFLite Converter转换经过训练并保存的TensorFlow模型(例如model.h5),该工具将由边缘设备(如Raspberry Pi)内部的TF Lite Interpreter使用, 对新数据进行推断。

例如,我从零开始在Mac中训练了一个简单的CNN图像分类模型(上图中的“服务器”)。 最终模型使用CIFAR10数据集:60,000张图像(形状:32、32、3)作为输入,具有225,610个要训练的参数。 经过训练的模型(cifar10_model.h5)的大小为2.7Mb。 使用TFLite Converter,在Raspberry Pi(model_cifar10.tflite)上使用的模型变为905Kb(大约原始尺寸的1/3)。用两种模型(Mac上的.h5和RPi上的.tflite)进行推论都得出相同的结果。

TFLite安装

也可以在Raspberry Pi上从头开始训练模型,为此,需要完整的TensorFlow软件包。但是一旦我们要做的只是推理部分,我们将只安装TensorFlow Lite解释器。

仅限解释器的软件包仅是完整TensorFlow软件包的一小部分,并且包括使用TensorFlow Lite进行推理所需的最少代码。 它仅包含用于执行.tflite模型的tf.lite.InterpreterPython类。

让我们在Raspberry Pi上打开终端并安装您的特定系统配置所需的Python wheel。 可在以下链接上找到这些选项:Python快速入门。 例如,就我的情况,我正在运行Linux ARM32(Raspbian Buster — Python 3.7),因此命令行为:

如果要仔细检查Raspberry Pi中的操作系统版本,请运行以下命令:

如下图所示,如果您获得……arm7l……,则操作系统为32位Linux。

要使TFLite解释器在Raspberry Pi中工作,安装Python wheel是唯一的要求。 如下所示,可以在终端上调用TFLite解释器来仔细检查安装是否正常。 如果没有错误出现,那么我们很好。

图像分类

这个项目是更现代的架构(MobileNet),使用相同的ImageNet数据集对数百万张图像进行了预训练,产生了1,000个不同的类。 这样预先训练和量化的模型就这样被转换成.tflite并在这里使用。

首先,让我们在Raspberry Pi上移至工作目录(例如Image_Recognition)。接下来,必须创建两个子目录,一个用于模型,另一个用于图像:

进入模型目录后,让我们下载经过预先训练的模型(在此链接中,可以下载几种不同的模型)。 我们将使用量化的Mobilenet V1模型,该模型预先训练有224×224像素的图像。 可以使用wget从TensorFlow Lite图像分类下载zip文件:

接下来,解压缩文件:

OpenCV和Jupyter Notebook安装

OpenCV(开源计算机视觉库)是一个开源计算机视觉和机器学习软件库。 在处理图像时作为支持很有用。 如果在Mac或PC上安装它非常简单,那么在Raspberry Pi上安装它有点“技巧”,但是我建议使用它。

请按照Q-Engineering的出色教程在Raspberry Pi上安装OpenCV:在Raspberry Pi 4上安装OpenCV 4.4.0。尽管是为Raspberry Pi 4编写的,但该指南也可用于Raspberry 3或2,而无需进行任何更改。

接下来,安装Jupiter Notebook。这将是我们的开发平台。

$ sudo pip3 install jupyter
$ jupyter notebook

另外,在OpenCV安装过程中,应该立即安装NumPy,如果不这么做,可与MatPlotLib相同方式安装。

$ sudo pip3 install numpy
$ sudo apt-get install python3-matplotlib

完成了!我们拥有一切准备就绪,可以开始我们的AI边缘之旅!

图像分类推断

使用相机进行物体检测

姿势估计

AI的一个更令人激动和关键的领域之一是估计一个人的实时姿势,使机器能够了解人们在图像和视频中正在做什么。 在我的文章中使用TensorFlow2.x进行了实时多人2D姿势估计,对姿势估计进行了深入探讨,但是在Edge上,借助Raspberry Pi和TensorFlow Lite的帮助,可以轻松地复制几乎与以前相同的姿势。

我们将在此项目中使用的模型是PoseNet。 我们将以与图像分类和对象检测相同的方式进行推理,其中图像通过预先训练的模型进行馈送。 PoseNet带有一些模型的不同版本,对应于MobileNet v1架构和ResNet50架构的差异。 在此项目中,预培训的版本是MobileNet V1,它比ResNet较小,更快,但准确性较低。 此外,还有用于单人和多人姿势检测的单独模型。 我们将探索为一个人训练的模型。

获取输入和输出张量:

input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

与我们之前所做的一样,查看input_details,可以看到用于姿势估计的图像应该是(1,257,257,3),这意味着必须将图像重塑为257×257像素。

让我们以一个简单的人物作为输入,这将有助于我们对其进行分析:

第一步是预处理图像。此特定模型未量化,这意味着dtype为float32。此信息对于预处理输入图像至关重要,如以下代码所示

对图像进行预处理后,现在该执行推理了,向张量提供图像并调用解释器:

  • 热图大小为(9,9,17)的3D张量,对应于图像特定部分(9,9)中17个关键点(身体关节)中每个出现的概率。用于定位关节的大致位置。
  • 偏移向量:大小为(9,9,34)的3D张量,称为偏移向量。 用于更精确地计算关键点的位置。 三维的第一个17对应于x坐标,第二个17对应于y坐标。

让我们创建一个函数,该函数将根据热图和偏移量返回一个包含所有17个关键点(或人的关节)的数组。

使用上面的函数和从输出张量提取的热图和偏移矢量,即图像推断的结果,我们得到:

结果数组显示有关关节在257 x 257像素的图像上的位置的所有17个坐标(y,x)。 使用下面的代码。 可以在调整大小后的图像上绘制每个关节。 作为参考,对数组索引进行了注释,因此很容易识别每个关节:

结果,我们得到了如下图:

完美,现在该创建一个通用功能来绘制“骨骼”了,这是关节的连接。 骨骼将绘制为线,即关键点5到16之间的连接,如上图所示。 独立的圆圈将用于与头部相关的关键点0到4:

调用该函数,我们可以在图像中获得人体的估计姿势:

join_point(img, keypts_array, bone_size=2)
plt.figure(figsize=(10,10))
plt.imshow(img);

最后但并非最不重要的一点,我们创建一个通用函数来估算以图像路径作为起点的姿势:

此时,仅需一行代码,就可以检测图像上的姿势:

keypts_array, max_prob, img  = get_plot_pose(image_path, size, bone_size=3)

结论

TensorFlow Lite是在边缘上实施人工智能(更准确地说是机器学习)的绝佳框架。 在这里,我们探索了在Raspberry Pi上运行的机器学习模型,但是TFLite现在越来越多地被称为TinyML的小型微控制器用于“边缘的边缘”。

详情参阅 - 亚图跨际


http://www.niftyadmin.cn/n/1226316.html

相关文章

java自行车起源_现代自行车的起源和它的发展历程

自行车,又称单车,脚踏车。英文名:bike、bicycle、拉丁文为Bicyoletta,是“快”和“步行人”的意思, 是一种以人力驱动的便携交通工具。它的发明和改进经历了漫长而复杂的历史过程。自行车的起源自行车的发展日新月异,从…

Python数值线性方程组

介绍 代数方程组的形式为 A11x1A12x2⋯A1nxnb1A21x1A22x2⋯A2nxnb2⋮An1x1An2x2⋯Annxnbn,(1)\begin{array}{c}A_{11} x_{1}A_{12} x_{2}\cdotsA_{1 n} x_{n}b_{1} \\A_{21} x_{1}A_{22} x_{2}\cdotsA_{2 n} x_{n}b_{2} \\\vdots \\A_{n 1} x_{1}A_{n 2} x_{2}\cdotsA_{n n} x…

java中的gridy_Java中GirdBagLayout布局管理器使用

构造函数:GirdBagLayout()建立一个新的GridBagLayout管理器。GridBagConstraints()建立一个新的GridBagConstraints对象。GridBagConstraints(int gridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty,int anchor,int fill, Insets insets…

java快排思想_Java快排

package quickSort;/*** 快速排序* author root**/public class QuickSort {static int[] data {0,2,4,5,3,1,7,6};public static void main(String[] args) {// TODO Auto-generated method stubsort(data, 0, data.length-1);print(data);}//快速排序public static void sor…

Python数值插值和曲线拟合

通常参与技术计算。 数据来源可以是实验观察或数值计算。 插值和曲线拟合之间是有区别的。 在插值中,我们通过数据点构造一条曲线。 这样做时,我们隐含了一个假设,即数据点是准确且不同的。 相反,曲线拟合应用于通常由测量误差引起…

JAVA不同类型数组重载_Java重载构造原理与用法详解

本文实例讲述了Java重载构造原理与用法。分享给大家供大家参考,具体如下:带参数方法【1】无参数,无返回值void 方法名(){方法体;}【2】无参数,有返回值int 方法名(){方法体;}【3】有参数,无返回…

Python数值方程根

工程分析中遇到的一个常见问题如下:给定函数f(x)f(x)f(x),确定f(x)0f(x)0f(x)0的xxx的值。解(xxx的值)被称为方程f(x)0f(x)0f(x)0的根。 在继续进行之前,回顾一下函数的概念可能会有所帮助。 等式 yf(x)yf(x)yf(x) 包…

java map获取泛型_java - map、collections常见方法、泛型上下界

Map接口概述: map集合是不可以直接迭代的将键映射到值得对象一个映射不能包含重复的键每个键最多只能映射到一个值Map接口和Collection接口的不同Map是双列的,Collection是单列Map的键是唯一的, Collection的子体系Set是唯一的Map集合的数据…