編輯注
這是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 獲得密歇根大學電氣工程學士學位和加州大學聖地亞哥分校電氣工程碩士學位。他合著了一本書並擁有專利,這兩者都在分散式網路最佳化領域。






