编辑注
这是alwaysAI的客座文章 - 一家为在边缘设备上部署计算机视觉模型构建工具的公司。
我们邀请 OpenCV 生态系统中的公司和个人撰写客座文章,目的是教育社区成员了解最新的框架、工具、算法和硬件。
在 alwaysAI,我们的唯一使命是使构建和部署计算机视觉应用程序到边缘设备的过程尽可能简单。这包括训练您的模型、构建您的应用程序以及将您的应用程序部署到边缘设备(如 Raspberry Pi、Jetson Nano 等)。alwaysAI 应用程序使用 Python 构建,可以在 Mac 和 Windows 上本地运行,并且在我们针对边缘设备中常用的不同架构(例如 32 位和 64 位 ARM 架构)优化的容器化边缘运行时环境中运行。
由于我们 alwaysAI 喜欢使用 OpenCV,因此我们已将其构建为我们边缘运行时环境的核心部分。这意味着在每个 alwaysAI 应用程序中,您可以添加 import cv2 并使用 OpenCV 在您的应用程序中。我们围绕 OpenCV 构建了一套工具,以使端到端流程无缝衔接,并帮助解决与边缘设备工作相关的某些常见痛点。免费注册 alwaysAI,我们有许多示例应用程序和预训练模型可以帮助您快速启动和运行。注册后,仪表板提供资源来帮助您运行第一个应用程序,您可以在应用程序开发指南和边缘IQ Python API 中找到文档。在接下来的部分中,我将逐步介绍 alwaysAI 如何帮助您更轻松地构建计算机视觉应用程序,在边缘设备上测试您的应用程序以获得所需的性能,以及最后如何部署和管理运行您的 alwaysAI 应用程序的边缘设备群。让我们开始吧!
为边缘构建您的应用程序
为边缘设备构建应用程序可以采用多种形式,具体取决于设备的功能和开发人员的偏好。就我个人而言,我更喜欢在我的笔记本电脑上进行开发,我的 IDE 按照我想要的方式设置,而且我不必担心打开太多 Stack Overflow 选项卡。某些设备(例如 Raspberry Pi 4)功能强大,可以用作开发机器,alwaysAI 使这两种方法都变得简单易行。本指南的其余部分将重点介绍在 Mac 或 Windows 上进行开发。只需运行桌面安装程序,它将设置您的 alwaysAI 开发环境,包括安装 alwaysAI CLI 和带有我们的 Python API edgeiq 的 python 环境。
alwaysAI CLI 负责从 requirements.txt 文件安装 Python 依赖项,并使用 alwaysAI Python 安装运行应用程序。设置好应用程序后,安装和运行它就像
$ aai app install
$ aai app start
在您的应用程序中,您可以从文件、网络摄像头或 IP 流获取图像或视频,并在来自我们模型目录或您训练的模型上执行推理,并使用我们的可视化调试工具 Streamer 在 Web 浏览器中显示结果。
应用程序按您想要的方式工作后,是时候将其带到边缘了!
在边缘测试您的应用程序
使用 alwaysAI,运行应用程序就像设置您的边缘设备然后使用 CLI 选择新的目标一样简单。
$ aai app configure
✔ Found alwaysai.app.json
✔ What is the destination? › Remote device
? Select choice: Use saved device
? Select a device: (Use arrow keys)
❯ nano
tx2
pi4
edgeIQ Python API 旨在使您的代码在许多不同的设备上保持一致。通常,只需要更改引擎或加速器即可,例如,构建一个在带有 Intel Neural Compute Stick 2 (NCS2) 的 Pi 4 上运行并在 CUDA 上的 NVIDIA Jetson Nano 上运行的应用程序。以下是在执行对象检测时所需的代码示例
obj_detect = edgeiq.ObjectDetection("alwaysai/mobilenet_ssd")
if edgeiq.find_ncs2():
# Load for Pi + NCS2: DNN_OPENVINO inference engine performs inference on NCS2
engine = edgeiq.Engine.DNN_OPENVINO
elif edgeiq.is_jetson():
# Load for Jetson Nano: DNN_CUDA inference engine performs inference on NVIDIA GPU
engine = edgeiq.Engine.DNN_CUDA
else:
# Load to DNN inference engine for all other devices
engine = edgeiq.Engine.DNN
obj_detect.local(engine=engine)
video_stream = edgeiq.WebcamVideoStream(cam=0).start()
frame = video_stream.read()
results = obj_detect.detect_objects(frame, confidence_level=.5)
使用 alwaysAI CLI,您可以添加新设备并切换目标设备,从而加速跨多个设备的测试。
分析应用程序的性能
某些边缘设备没有桌面或 GUI,因此 Streamer 在这里变得非常有用。Streamer 使您能够将文本数据附加到您的帧,这有助于显示检测和性能指标以及它们对应的帧。应用程序性能的两个关键因素是推理时间和整体每秒帧数 (FPS)。推理时间是在您使用的模型上执行前向传递所需的时间。模型的大小和复杂性以及引擎和加速器都会影响推理时间。推理时间从我们的基本 CV 服务类中返回每个推理:分类、对象检测、语义分割和姿势估计。以下是如何从对象检测推理中获取推理时间并将其打印到 Streamer 的示例
obj_detect = edgeiq.ObjectDetection("alwaysai/mobilenet_ssd")
obj_detect.load(engine=edgeiq.Engine.DNN)
video_stream = edgeiq.WebcamVideoStream(cam=0).start()
streamer = edgeiq.Streamer().setup()
frame = video_stream.read()
results = obj_detect.detect_objects(frame, confidence_level=.5)
streamer.send_data(frame, "Inference time: {:1.3f} s".format(results.duration))
整体 FPS 指标包括推理时间,还包括应用程序执行的任何其他处理。它会受到传入视频帧或图像上如何执行推理的很大影响。例如,推理可以在每个帧上同步执行,仅在推理完成后显示帧,或者可以异步执行,其中推理排队并在帧可用时立即显示。Streamer 是一个很好的工具,可以直观地观察 FPS,但也会影响 FPS,因为运行服务器以及编码和流式传输视频是处理密集型的。根据应用程序的要求,您可以决定将日志保存到文件中,以便具有更小的性能占用空间。您可以使用 FPS 类跟踪应用程序的 FPS
fps = edgeiq.FPS().start()
while True:
<main loop processing>
fps.update()
fps.stop()
print("elapsed time: {:.2f}".format(fps.get_elapsed_seconds()))
print("approx. FPS: {:.2f}".format(fps.compute_fps()))
将您的应用程序部署到边缘
在边缘设备上构建和测试应用程序后,您可能希望将其部署以在设备或设备群上运行。由于我们的边缘运行时环境基于 Docker,因此打包您的应用程序并使用基于 Docker 的工具来管理它非常简单。首先,使用 aai app configure 为您的应用程序 docker 镜像选择一个目标设备。这一点很重要,因为您的 docker 镜像只能为一台设备构建。例如,如果您在 Raspberry Pi 上构建镜像,它将无法在 Jetson Nano 上运行。选择目标设备后,使用 aai app install 在设备上安装应用程序和依赖项。完成后,运行 aai app package –tag <name>,其中您的 docker 镜像名称遵循 Docker Hub 的命名约定 <docker-hub-username>/<image-name>:<version>,例如 alwaysai/snapshot-security-camera:armvhf-latest。
使用Docker CLI,您可以在设备上启动和停止应用程序
$ docker run --network=host --privileged -d -v /dev:/dev <name>
- –network==host 标志告诉 docker 将设备的网络接口映射到容器中。这使得可以从容器外部访问互联网和 Streamer。
- 在使用 USB 设备时需要 –privileged 标志。
- -d 标志使容器与 CLI 分离运行。
- -v /dev:/dev 标志将设备目录挂载到容器中,以便可以访问摄像头和 USB 设备。
要详细了解这些选项,请访问Docker 运行参考页面。
要将您的应用程序构建为服务,Docker Compose 是一个很好的工具,可以管理作为单个应用程序运行的多个容器。如果您的 CV 应用程序需要与其他容器化服务(如数据库或服务器)交互,则此方法很有用。
要管理设备群,诸如balena、Kubernetes和Docker Swarm之类的工具都与 docker 配合使用,因此它们都可以用于管理您的 alwaysAI 边缘部署!
alwaysAI <3 OpenCV
在 alwaysAI,我们认识到开发人员从使用 OpenCV 中获得的巨大价值。OpenCV 使开发人员能够访问超过 2500 种算法,以支持计算机视觉应用程序的开发。使用 OpenCV 和 alwaysAI,您可以将您的计算机视觉应用程序无缝地带到边缘,使您的应用程序高效、网络独立且经济高效!
Komal Devjani 和 Steve Griset 对本文做出了贡献。alwaysAI,总部位于加利福尼亚州圣地亚哥,是一个深度学习计算机视觉开发平台。alwaysAI 为开发人员提供了一种简单灵活的方法,可以将计算机视觉交付到各种边缘设备。使用 alwaysAI,您可以快速开始进行对象检测、对象跟踪、图像分类、语义分割和姿势估计。
关于作者:
Eric VanBuhler于 2019 年 3 月加入 alwaysAI 工程团队,此前在高通工作了 8 年,主要从事 edgeIQ Python 库和运行时环境方面的工作。Eric 获得密歇根大学电气工程学士学位和加州大学圣地亚哥分校电气工程硕士学位。他合著了一本书并拥有专利,这两者都在分布式网络优化领域。