# 使用外部函数运行 AI 算法

LF Edge eKuiper (opens new window) 是一款边缘轻量级物联网数据分析/流软件,可在各种资源受限的物联网设备上运行。

TensorFlow Lite (opens new window) 是一组帮助开发人员在移动端、嵌入式和物联网设备上运行 TensorFlow 模型的工具,它使得设备上的机器学习预测具有低延迟和较小的二进制容量。

通过集成 eKuiper 和 TensorFlow Lite,用户可以使用预建的 TensorFlow 模型通过 AI 分析流中的数据。 在本教程中,我们将通过预先训练的图像识别 TensorFlow 模型, 来带您构建一个 eKuiper 外部函数插件来标记边缘生成的图片。 通过使用外部函数,eKuiper和外部函数可以运行在完全不同的进程或主机中,这意味着 eKuiper 和外部函数可以有不同的生命周期,更重要的是,外部函数 可以为除 eKuiper 以外的其他系统程序提供服务。

# 先决条件

外部功能插件将是一个 gRPC 服务器,因此用户应该了解 gRPC。本教程将给出设置 gRPC 服务器的示例代码。 用户可以在这里 (opens new window)下载示例代码。

用户还需要具备 Docker 的基本知识。

# 开发外部函数

在示例代码中,gRPC 服务器提供了 label 方法,用户只需要编写一个接口描述文件,注册到 eKuiper 中即可。然后 eKuiper 就可以调用 gRPC 方法, 就像内置函数一样。 label 方法由 tflite_runtime 图像分类提供支持,有关更多详细信息,请查看示例代码中的 label.py 文件。

这是提供服务的外部功能的 proto 文件描述。label 方法的参数应该是 base64 编码的图像。

syntax = "proto3";

package sample;

// The algorithms service definition.
service Algorithms {
  rpc label(LabelRequest) returns(LabelReply) {}
}

// The request message containing the base64 encoded image.
message LabelRequest {
  string base64_img = 1;
}

message LabelResult {
  float  confidence = 1;
  string label = 2;
}

// The response message containing the greetings
message LabelReply {
  repeated LabelResult results = 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 构建和运行 gRPC Server

我们提供 Dockerfile 来构建 gRPC 服务器,进入示例代码 (opens new window) pythonGRPC.zip 的根路径,运行以下命令来构建 gRPC docker 镜像

 docker build  -t test:1.1.1 -f deploy/Dockerfile-slim-python .
1

然后通过以下命令来启动服务

 docker run -d  -p 50051:50051 --name rpc-test test:1.1.1
1

现在,gRPC 服务器在 50051 端口上提供服务。

# 打包并注册外部函数

# 打包

将 gRPC Server 中服务的 json 描述文件和 proto 文件打包成 zip。 zip 文件中的文件结构应如下所示:

  • schemas

    • sample.proto
  • sample.json

  • 有关文件格式和内容的更多详细信息,请参阅这里

您可以在示例代码 (opens new window)的文件夹 kuiper_package 中获取示例 zip 文件。

# 注册外部函数

将 sample.zip 文件放到 eKuiper 同一台机器的 /tmp 目录下,通过 cli 注册

# bin/kuiper create service sample '{"name": "sample","file": "file:///tmp/sample.zip"}'
1

# 使用外部函数

一旦注册了外部函数,我们就可以在我们的规则中使用它。我们将创建一个规则来从 mqtt 主题接收图像数据,并通过 tflite 模型标记图像。

# 创建流

通过 eKuiper Cli 创建流。我们创建一个名为 demo 的 mqtt 流,它订阅主题 “tfdemo”。

#/bin/kuiper create stream demo '() with (DATASOURCE="tfdemo")'
1

# 创建规则

通过 eKuiper cli 创建规则。我们将创建一个查询。我们从 demo 流中读取 base64 编码的图像,并针对它进行自定义函数 label 运算, 其结果将是 AI 识别的图像标签。

#/bin/kuiper query

Connecting to 127.0.0.1:20498...
kuiper >  select label(image) from demo

1
2
3
4
5

# 测试数据

用户需要像这样以 json 格式发送数据

{"image": "base64 encoded data"}
1

用户可以从 images/example.json 文件中的示例代码中获取真实数据,只需通过 MQTT 客户端将其发送到 MQTT Broker 即可。

# 查询结果

发布 base64 编码的图像后,您可以得到结果。

kuiper > [{"label":{"results":[{"confidence":0.5789139866828918,"label":"tailed frog"},{"confidence":0.3095814287662506,"label":"bullfrog"},{"confidence":0.040725912898778915,"label":"whiptail"},{"confidence":0.03226377069950104,"label":"frilled lizard"},{"confidence":0.01566782221198082,"label":"agama"}]}}]
1

# 总结

在本教程中,我们将引导您构建外部函数以利用预训练的 TensorFlowLite 模型。如果您需要使用其他 gRPC 服务,只需按照创建自定义函数的步骤操作即可。在边缘设备中享受 AI吧。