2019 年 2 月

第 34 卷,第 2 期

本文章是由機器翻譯。

[機器學習服務]

機器學習服務在邊緣上:Azure ML 和 Azure IOT Edge 整合

藉由Ted 方式 |2019 年 2 月

定義邊緣做為任何計算,不是雲端平台。範圍從 Azure Stack (叢集中的機器做為迷你 Azure),到功能強大的閘道伺服器,以較小的裝置,例如 Raspberry Pi 或感應器。即使冰箱和其他設備有足夠處理能力,現今才會被視為 edge 裝置。所面臨的挑戰是如何套用人工智慧 (AI) 和機器學習 (ML) 無法對雲端中的資料,不論是因為資料主權、 隱私權、 頻寬或其他問題。

James McCaffrey 會有一篇好文章 — 「 機器學習與 IoT Edge 上的裝置 」 (msdn.com/magazine/mt847186)、 在 2018 年 7 月號 MSDN Magazine 的教育訓練 ML 模型,以及使用 Microsoft Embedded 學習程式庫 (ELL),將最佳化的模型部署到小的 edge 裝置。在本文中,我們的焦點是企業工具和訓練您的模型、 管理並將它與 Azure Machine Learning 容器化服務。使用 Azure IoT Edge,您將了解如何設定資料管線,使用模型,並將它部署到 edge 裝置。我們將逐步範例,自訂視覺服務可用來定型模型使用 Azure IoT Edge 部署。可以註冊 Azure ML 模型的反覆項目。

Snow Leopard 案例

Snow Leopard 信任 (snowleopard.org) 專門用來 「 深入了解瀕臨絕種的 snow leopard、 並保護與社群共用其 habitat 合作 cat。 」 其做法是設定跨 200 英哩的正方形來追蹤攝影機 snow 豹中哪些區域。相機會部署,然後資料會從收集觀景窗在一段時間之後。這些數位相機是動作啟動,可能會產生一些意外 — 例如時間年前當研究人員開發膠捲才能尋找相片搖晃樹狀結構的 windows 中的彙總。

使用數位相機,可以擷取更多映像,但即使如此,只有 5%的映像包含 snow 豹。它可能需要人力的研究人員超過 200 個小時,仔細檢查以確認包含 snow 豹圖片。定型的 ML 演算法,來識別 snow 豹是時間的更充分利用的研究人員。

ML 演算法,稱為 「 了解 」,而不明確的程式設計。例如,如果您所建立的應用程式,以預測一棟房子因素,例如數個房間的清單、 平方英尺以及其他因素為基礎的價格,您可以明確撰寫它藉由新增規則,或查閱已回應某些資料庫中。如果使用者輸入數個房間的清單之間兩個和四個房屋有某些平方英尺,會傳回特定的價格。

而不是程式設計該回應,您可以使用非常簡單的方程式,如下所示:

y = w1*x1 + w2*x2 + b

在此範例中,x1 是數個房間的清單和 x2 平方英尺。根據您有房屋的數字的最後一個銷售價格的資料,您可以 「 訓練 」 模型 w1、 w2 和 b 最符合的資料,找出。定型之後,如果您為其指定相同的輸入兩次,它會回應相同的輸出每一次,是靜態的 ML 模型。不過,您可以繼續發展此演算法訓練新的資料,以及更新的演算法,基本上 w1、 w2 和 b 尋找新的值。

深入學習是 ML 的子集。而不是如先前所提到的一個簡單的線性方程式,我們使用人工類神經網路或跨多個層級包含許多的神經或節點的深度類神經網路 (Dnn)。目標是要模擬我們的大腦運作的方式。每一個神經都執行計算的資料,例如組件的映像為基礎,如果結果符合特定的臨界值,就會啟用神經。

此輸入然後進到下一層。例如,假設我們有一張圖片手寫數字,而我們有兩個神經。第一個神經探討上半部的圖片,並第二個會查看下方一半。如果第一個神經看到圓形,它會啟動。如果位於下面看到垂直線時,它會啟動。數的八中,第一個神經會啟動,但第二個則不會。不過,號碼、 包含九部中,第一個神經會啟動,而且也會啟用第二個。然後,您可以取得該資訊,並結束它是數字、 包含九部。

Azure 元件

在我們繼續之前,務必要注意的 Azure 和 ML 堆疊的元件。這些工作包括:

Custom Vision Service:此服務是認知服務平台的一部分,並可讓您輕鬆上傳映像,並以手動方式將它們標記中定型 AI 模型。模型可以匯出至許多平台-iOS (CoreML),ONNX 或 TensorFlow 等 — 和 Protocol Buffers 或 protobufs.pb 格式儲存。Protobufs 均描述於 Google 作為其 「 語言中性、 平台中立、 可延伸機制來序列化結構化的資料 — 更快且更簡單,但比較小,認為 XML"(developers.google.com/protocol-buffers)。

Azure Machine Learning:這項服務會為雲端服務,您可以使用它來開發和部署 ML 模型的端對端資料科學平台。使用 Azure Machine Learning 服務,您可以追蹤您的模型為您建置、 訓練、 部署及管理它們,全都在雲端所提供的廣泛小數位數。

Azure IoT 中樞和 IoT Edge:Azure IoT 中樞用來連接、 監視並控制數十億個物聯網 (IoT) 資產。Azure IoT Edge 是一個平台,從遠端管理在 IoT 中樞。如此將部份工作負載移至 edge,而不是在雲端中的裝置上的資料分析。您的裝置可以較少的時間將訊息傳送至雲端,以及他們可以回應變更自發且快速。

使用這些元件 Snow Leopard 信任可以部署為 30 動作啟動相機,每個附加至相對較低成本的個人電腦。我們將使用 Azure IoT Edge 將 snow leopard 模型部署至電腦上,以模擬的裝置。

在 Edge 上的影像分類

現在讓我們逐步解說中佈建所需的 Azure 資源及建置解決方案所需的步驟。我們將提供更多詳細功能會佈建,而下一節中的程式碼中的情況。若要開始使用您將需要:

• Azure 訂用帳戶。沒有帳戶嗎?建立免費帳戶azure.microsoft.com/free

• Visual Studio Code (code.visualstudio.com)。

• Ubuntu 16.04 Linux x64 VM 做為您的 IoT Edge 裝置。

• Azure 資源,包括 Azure Machine Learning 工作區、 Azure IoT 中樞和 CustomVision.ai 帳戶。

• 模型部署範例,在aka.ms/visedge

建立 Azure ML 工作區也會建立儲存體帳戶和 Azure Container Registry,您可以使用它來儲存您的 Docker 映像部署到 IoT Edge 裝置。下載並安裝 VS Code Tools for AI,從開始 (aka.ms/vscodetoolsforai)。安裝完成後,按一下 [Azure 符號在 VS Code 活動列在左側。

現在安裝 Azure ML SDK 開啟命令選擇區中使用 Ctrl + Shift + P,然後輸入 「 安裝 Azure ML SDK 」。 在整合式終端機視窗中,指定要使用的 Python 解譯器,或您可以按 enter 鍵來使用預設的 Python 解譯器。

按一下 [Visual Studio Code 活動列中的 Azure 圖示,接下來,建立 Azure ML 工作區。Azure:機器學習服務提要欄位隨即出現,然後以滑鼠右鍵按一下您的 Azure 訂用帳戶,並選取 [建立工作區。在出現的清單,從清單中,選取現有的資源群組或建立新的使用命令選擇區中的精靈。在此範例中,我們使用 「 iot-相機-群組。 」

現在在欄位中,輸入新的工作區的唯一且清楚的名稱。按下 enter 鍵,並建立新的工作區。它會出現在 [訂用帳戶名稱下的樹狀結構。

讓我們來開啟 VS Code,然後按一下 [延伸模組] 按鈕,在左窗格中 (Ctrl + Shift + X) 建立 IoT 中樞。搜尋 「 Azure IoT Toolkit 」,並安裝擴充功能。您必須在 Linux 電腦,做為您的 edge 裝置。您可以使用您的電腦上的 VM,您在 Azure 或任何其他地方可以存取。

按一下左側的 [活動] 列上的 [總管] 按鈕來啟動,並尋找 「 Azure IoT 中樞裝置 」 項目。按一下 [更多動作] (三個點),然後選取 「 建立 IoT 中樞 」。

現在選擇訂用帳戶,然後從 [稍早選擇資源群組 (「 iot-相機-群組 」) 或建立新的。接下來,選擇的區域,並選擇定價層。您可以使用 F1 免費層,但如果 F1 層 IoT 中樞已存在,則您必須建立一個 S1 層。最後,讓 IoT 中樞名稱,例如 「 iot-相機-中樞。 」

就可以開始將項目新增至 IoT 中樞註冊 IoT Edge 裝置。這會產生您要輸入您的 IoT Edge 裝置 (在此案例中,您的 Linux VM) 中的連接字串讓它可以連線到您的 IoT 中樞。

若要這樣做,請先按一下 「 Azure IoT 中樞裝置 」 的 [更多動作] 功能表 (三個點),然後選擇 「 建立 IoT Edge 裝置。 」 不要按 「 建立裝置。 」 然後輸入 edge 裝置,例如數位相機-pc-01 的名稱。最後,將 connectionString 值複製到您剛才建立的項目。您必須在您的 edge 裝置中輸入。

在未來,您可以在此對話方塊中按一下 「 Azure IoT 中樞裝置 」,然後 [選取 IoT 中樞。 您必須登入 Azure,選擇您佈建中,IoT 中樞的訂用帳戶,然後選取您的 IoT 中樞,但您可以檢視您的裝置相關聯的所有連接字串。

設定 IoT Edge 裝置

模擬 edge 裝置的最簡單方式是使用預先設定的 VM (aka.ms/edgevm)。當 VM 啟動時,它會安裝最新版的 Azure IoT Edge 執行階段和相依性。佈建 VM 之後,登入它,然後在您註冊使用 (連接字串會是您稍早複製的 connectionString.value) 的 IoT Edge 裝置的連接字串的命令列上執行此命令:

/etc/iotedge/configedge.sh "<your_iothub_edge_connection_string>"

如果您想要自己 Ubuntu 16.04 x64 VM 設定為 edge 裝置,請參閱這項資訊: aka.ms/edgevm

映像分類解決方案

現在就來建置映像分類解決方案。複製 Git 範例 (aka.ms/visedge)。我們將使用 Linux x64 電腦,做為 edge 機器。請遵循下列步驟:

• 更新.env 檔案取代為您的容器登錄的值,並確定您的 Docker 引擎具有其存取權。

• 重新命名 deployment.template.RPI.json deployment.template.json 檔案。

• 重新命名 deployment.template.json deployment.template.test amd64.json 檔案。

• 檔案 deployment.template.json 上按一下滑鼠右鍵,然後選取 [建置 IoT Edge 方案 (這可以需要一些時間,尤其是組建 numpy 和好不容易) 建置整個方案。

• 會 config/deployment.json 檔案上按一下滑鼠右鍵,選取 [IoT Edge 裝置的 [建立部署,然後選擇您的目標的裝置,將方案部署到您的裝置。

• 監視您從 VS 程式碼 IoT Edge 擴充功能的裝置上按一下滑鼠右鍵,然後選取 [開始監視 D2C 訊息傳送至雲端的訊息。

適用於 x64 版本的解決方案,這些步驟會部署兩個模組:

相機擷取:這會擷取來自 USB 網路攝影機的視訊資料流,並將框架傳送至影像分類 」 模組。結果會傳送至 edgeHub,可以轉送到 IoT 中樞的訊息。

Custom Vision:此 Web 服務會在本機執行,透過 HTTP 和映像會接受並將其分類。它是使用自訂視覺 (customvision.ai) 網站上所建立的。在方案中的模型分類是否映像包含 apple 或 banana。

相機擷取模組可以使用 Azure IoT Edge SDK edgeHub 來傳送訊息。您可以建置自己的模組,作為 Docker 容器,並使用 SDK 來與 edgeHub 通訊。

Custom Vision Service 您可以使用現有的模型,在方案中,或者您可以前往 customvision.ai 訓練您自己的模型。若要建立雪花 leopard 分類,請將 snow 豹的相片上傳至 Custom Vision Service。您也可以上傳其他您可能會發現在雪 leopard habitat 的動物照片。只是標記映像,然後按一下 [定型] 按鈕,以定型模型。模型和標籤的檔案會匯出為.pb 與.txt 檔案,分別可用來取代功能的解決方案。

自訂辨識使用遷移學習,這會採用現有的深度類神經網路,並從您的映像擷取功能。然後它會定型分類器對您的資料 (在此情況下,您上傳的映像和指派給他們的標記)。

為了說明傳輸學習,想像一下您想要定型炸彈探查的 dog — 德文 Shepherd,例如。如果您採取 2 歲德文 Shepherd,它不會知道任何關於炸彈。它沒有 「 基礎結構 」 來偵測炸彈,使用其強大的氣味感。您可以開始訓練德文 Shepherd 它而讓其竊取炸彈,並告訴它,這炸彈,然後提供另一個異味,例如花卉,並說這不是炸彈。重複此步驟的各種類型的炸彈和其他的氣味還有幾個月和大量 kibble 之後, 您自行炸彈探查的 dog。訓練德文 Shepherd 不算難。讓德文 Shepherd 是困難的部分。

ResNet 50,起始 v3,例如 Dnn YOLO VGG 且基本上德文 Shepherds。它們是複雜的 AI 模型映像,並擷取功能,就像德文 Shepherd 氣味從擷取訊號。就像數個房間的清單和一棟房子平方英尺是可用來預測價格的功能,就會將擷取的功能傳送給分類器。此分類器是您需要定型,這會再 snow leopard 是否映像中的預測。分類器可以是簡單的羅吉斯迴歸、 支援向量機器或任何其他分類器。在遷移學習優點是與 DNN,這會產生有用的功能,可用來精確地分類影像擷取特徵。

[圖 1提供取得映像,並預測功能的使用 AI 模型的程式碼。

[圖 1 預測程式碼

from urllib.request import urlopen

import tensorflow as tf

from PIL import Image
import numpy as np
# import scipy
# from scipy import misc
import sys
import os  

filename = 'model.pb'
labels_filename = 'labels.txt'

network_input_size = 227
mean_values_b_g_r = (0,0,0)

size = (256, 256)
output_layer = 'loss:0'
input_node = 'Placeholder:0'

graph_def = tf.GraphDef()
labels = []

def initialize():
  print('Loading model...',end=''),
  with tf.gfile.FastGFile(filename, 'rb') as f:
    graph_def.ParseFromString(f.read())
    tf.import_graph_def(graph_def, name='')
  print('Success!')
  print('Loading labels...', end='')
  with open(labels_filename, 'rt') as lf:
    for l in lf:
      l = l[:-1]
      labels.append(l)
  print(len(labels), 'found. Success!')
  
def crop_center(img,cropx,cropy):
  y,x,z = img.shape
  startx = x//2-(cropx//2)
  starty = y//2-(cropy//2)
  print('crop_center: ', x, 'x', y, 'to', cropx, 'x', cropy)
  return img[starty:starty+cropy,startx:startx+cropx]

def predict_url(imageUrl):
  print('Predicting from url: ',imageUrl)
  with urlopen(imageUrl) as testImage:
    # image = scipy.misc.imread(testImage)
    image = Image.open(testImage)
    return predict_image(image)

def predict_image(image):
  print('Predicting image')
  tf.reset_default_graph()
  tf.import_graph_def(graph_def, name='')
  
  with tf.Session() as sess:
    prob_tensor = sess.graph.get_tensor_by_name(output_layer)

    # w = image.shape[0]
    # h = image.shape[1]
    w, h = image.size
    print('Image size',w,'x',h)

    # scaling
    if w > h:
      new_size = (int((float(size[1]) / h) * w), size[1], 3)
    else:
      new_size = (size[0], int((float(size[0]) / w) * h), 3)

    # resize
    if  not (new_size[0] == w and new_size[0] == h):
      print('Resizing to', new_size[0],'x',new_size[1])
      #augmented_image = scipy.misc.imresize(image, new_size)
      augmented_image = np.asarray(image.resize((new_size[0], new_size[1])))
    else:
      augmented_image = np.asarray(image)

    # crop center
    try:
      augmented_image = crop_center(augmented_image, network_input_size, 
        network_input_size)
    except:
      return 'error: crop_center'

    augmented_image = augmented_image.astype(float)

    # RGB -> BGR
    red, green, blue = tf.split(axis=2, num_or_size_splits=3, value=augmented_image)

    image_normalized = tf.concat(axis=2, values=[
      blue - mean_values_b_g_r[0],
      green - mean_values_b_g_r[1],
      red - mean_values_b_g_r[2],
    ])

    image_normalized = image_normalized.eval()
    image_normalized = np.expand_dims(image_normalized, axis=0)

    predictions, = sess.run(prob_tensor, {input_node: image_normalized})

    result = []
    idx = 0
    for p in predictions:
      truncated_probablity = np.float64(round(p,8))
      if (truncated_probablity > 1e-8):
        result.append({'Tag': labels[idx], 'Probability': truncated_probablity })
      idx += 1
    print('Results: ', str(result))
    return result

Azure Machine Learning

您可以使用自訂視覺來建立您的 AI 模型,但如果您想要定型多個模型,或與資料科學家小組共同作業?資料科學工作流程中遺漏了在現今的軟體開發中,特別是關於原始檔控制的。Azure ML 讓這一切搭配資料準備、 測試、 模型管理和運算化。

此範例中,如果您要執行的自訂願景的各種實驗您可以註冊.pb 模型和其他檔案讓您可以保留它們的追蹤。以下是該程式碼:

from azureml.core.model import Model
model = Model.register(model_path = "custom-vision-model/",
                       model_name = "model.pb",
                       tags = {"area": "vision", "type": "classification", 
                         "version": "1.0"},
                       description = "Snow leopard classification model",
                       workspace = ws)

如果您想要查看您已註冊的所有模型中,輸入下列程式碼:

models = Model.list(workspace=ws)
for m in models:
  print("Name:", m.name,"\tVersion:", m.version, "\tDescription:", 
  m.description, m.tags)

如果您想要定型您自己的模型,請參閱 Azure 機器學習服務範例筆記本 (github.com/Azure/MachineLearningNotebooks)。您可以訓練您的模型、 註冊和使用模型建立 Docker 映像。Docker 映像可以部署到雲端的 Azure 容器執行個體或 Azure Kubernetes 服務。REST API 會公開容器中要評分的資料時呼叫。Docker 映像也包含 Azure IoT Edge SDK,將代理訊息與 edge 裝置上執行的 IoT Edge 代理程式。這可讓您建立容器,並將它部署到雲端或邊緣。

總結

有許多的元件建置企業解決方案,來定型模型,來管理模型 (以及定型模型的其他類型) 的 Azure ML 的自訂視覺從開始時和 Azure IoT Edge 部署的模型。設定這些服務需要一些緩慢增加時間,但您會獲得輕鬆定型新模型和多個邊緣裝置上更新它們的優點。


Ted Wa是資深專案經理 Azure ML 小組合作來加速 AI 在雲端和邊緣的特殊硬體上。[Radiologists,拼字檢查] 已從密西根 Uni versity 取得博士預估 malignancy thoracic CT 在電腦輔助的診斷系統掃描。

Emmanuel Bertrand是 Azure IoT Edge 小組的資深專案經理,他負責協助啟用輕鬆部署 IoT 模組,透過 Azure Marketplace。Ber trand 加入 Microsoft 專家,客戶和使用者體驗為,並在那之前有 digitized 的數個產業的公司使用 tradi 它工具的處理程序。

感謝閱本篇文章的下列技術專家:Rakesh Kelkar,Chipalo Street


MSDN Magazine 論壇中的這篇文章的討論