1. 程式人生 > >AWS DeepLens 擴充套件:自建專案

AWS DeepLens 擴充套件:自建專案

AWS DeepLens 提供了極好的機會來學習新技術,例如深度學習和物聯網 (IoT),以及構建可以解決實際問題的創新系統。該裝置和服務附帶有一組預定義的專案,使得從頭開始執行非常簡單。它設計作為開放平臺,使得新手和有經驗的開發人員都能構建 (和分享) 新的激動人心的專案。

在本部落格文章中,您將逐步完成構建自己專案的過程,包括以下步驟:

  • 優化經過訓練的模型以在 AWS DeepLens 邊緣裝置上執行
  • 開發 AWS Lambda 函式以載入模型並用於在視訊流上執行推理
  • 使用
    AWS Greengrass
    將 AWS Lambda 函式部署到 AWS DeepLens 裝置
  • 將邊緣 AWS Lambda 函式傳遞到雲中,用於傳送命令和接收推理輸出
  • 營利

訓練深度學習模型 (使用 Amazon SageMaker)

Amazon SageMaker 是面向繁重的資料科學的另一項新服務。它汲取了 Amazon 資料科學家在 Amazon.com 眾多業務領域的多年經驗,從建議引擎到 Alexa、Amazon Go、Amazon Robotics 乃至其他無窮的基於機器學習的系統。

雖然本篇部落格帖子所涵蓋的內容極為有趣,不過設計和構建良好機器學習模型的完整過程遠不止這些。實際上,通過將深度學習模型部署到 DeepLens 裝置,然後傳輸回來並從輸出中獲益,一旦通過這個流程實現生產,您就會發現自己會有越來越多的時間構建模型,來解決真實世界的新問題。

對於機器學習新手以及資料科學專家而言,當您在 Amazon SageMaker 中啟動 Notebook 例項時,Jupyter Notebook 中提供的一組 Notebook 是一個很好的起點。例如,這裡有一個 Notebook,展示了兩個流程,一個是轉換學習,另一個是使用 Amazon SageMaker 開發工具包構建、訓練和部署經過調整的深度學習模型工作流,用於推理終端節點託管。

在本篇部落格帖子中,您的重點是將模型專案儲存到 Amazon S3 中以啟用流程中的後續步驟。

以下示例模型使用 SageMaker 中的訓練作業進行訓練,包括輸出目錄以及在其訓練中使用的超級引數:

超級引數可幫助您瞭解如何使用模型。例如,根據 image_shape (3,224,224),我們知道您可以處理彩色影象 (3=RGB 通道),並且需要將其大小調整為 224*224 畫素。它還有助於在未來的訓練作業中獲得更準確的模型,例如,對訓練資料 (epochs>2) 執行更多次數,更改 learning_rate 以及新增更多 num_training_samples。

優化經過訓練的模型以在 AWS DeepLens 邊緣裝置上執行

對 DeepLens 裝置模型進行硬體優化的步驟是它在任何實際深度學習系統中的重要示例。在之前的步驟中,您擁有幾乎無限的雲資源用於模型訓練,但是,當您希望使用模型進行推理時,面臨著一系列的業務約束,主要與業務規模有關。在雲中,您可以輕鬆獲得基於 GPU 的大量例項,並可以在很多小時數的訓練中執行多個實驗。但是,當您要將模型部署到邊緣裝置時,您需要考慮晶片集 (CPU/GPU)、記憶體、網路頻寬和穩定性等各種裝置規格。您的 DeepLens 裝置可能會足夠強大,能夠在高幀率的高解析度視訊流上執行多個模型,不過多數情況下您需要在較低規格的裝置上執行。因此,Intel 開發了庫,獲取 MXNet 模型的構件,並根據 DeepLens 裝置中的 Intel 晶片板進行優化。從前一步驟匯入模型之後,當您通過 DeepLens 控制檯部署模型時,此庫自動執行。

完成訓練模型後,在將模型匯入到 DeepLens 時,您可以指向訓練作業 ID。(請注意,Sagemaker 和 DeepLens 需要位於同一個 AWS 區域中才能匯入。)

開發 AWS Lambda 函式以載入模型並用於在視訊流上執行推理

執行在 IoT 裝置 (在我們的案例中是 AWS DeepLens 攝像機) 上的 AWS Greengrass 核心能夠執行部署到其中的 AWS Lambda Python 函式。在未來的帖子中,我們將探討建立 Greengrass 組和核心以及準備和註冊裝置的步驟,您可以檢視 Greengrass 文件中的入門指南。AWS DeepLens 可以自動完成其中的大部分步驟。我們可以側重於開發 Lambda 函式以部署到所註冊和配置的裝置。

對於每個 Lambda 函式,請遵循以下步驟:

  • 載入模型
  • 捕獲幀
  • 在幀上執行模型推理
  • 解析推理的結果
  • 將結果釋出到 MQTT 主題

下面的一些示例是關於這些步驟中的每個步驟。

載入模型

AWS DeepLens 裝置預安裝了幫助程式庫 awscam。利用這個庫,您很容易就可以集中注意力於 Lambda 函式邏輯。它包裝了大部分常用步驟,例如載入模型。如您在以下示例中所見,您需要提供模型 XML 檔案的路徑以及模型 (GPU/CPU) 的上下文,然後庫會自動執行模型的載入和繫結:

import awscam
modelPath = "/opt/awscam/artifacts/mxnet_deploy_CaltechTransfer_224_FP16_FUSED.xml"
# 將模型載入到 GPU (對 CPU 使用 {"GPU": 0})
mcfg = {"GPU": 1}
model = awscam.Model(modelPath, mcfg)

請注意,此步驟應該在內部推導函式之外定義 (例如,下面的 greengrass_infer_image_run)。此步驟應僅執行一次,因為將模型從磁碟載入到記憶體再到 GPU 需要幾秒鐘。

捕獲幀

可使用 OpenCV (cv2) 在深度學習模型之前 (調整大小) 和之後 (繪製框和標籤) 來處理影象。由於各個模型在不同的輸入規範上訓練,因此第一步都需要將捕獲的幀大小調整為合適的尺寸:

import cv2
input_width = 224
input_height = 224
ret, frame = awscam.getLastFrame()
# 調整幀大小以適應模型輸入要求
frameResize = cv2.resize(frame, (input_width, input_height))

在幀上執行模型推理

幫助程式庫 awscampredict 命令包裝到簡單 doInference 函式中,使得 Lambda 函式的這一部分非常簡明:

# 在調整大小後的幀上執行模型推理
inferOutput = model.doInference(frameResize)

解析推理的結果

幫助程式庫支援幾個經典的計算機視覺問題:“classification”用於物件分類,即提供標籤;“ssd”(“single-shot-multibox-detector”) 用於物件檢測和本地化,為物件提供標籤和邊界框;以及“segmentation”,用於將影象細分為區域,並提供畫素級別的輸出 (例如,用於風格轉換)。以下示例針對常見的“ssd”型別模型:

modelType = "ssd"
parsed_results = model.parseResult(modelType, inferOutput)['ssd']

將結果釋出到 MQTT 主題

最後一部分是傳送模型的輸出。此邏輯取決於模型的型別以及您嘗試解決的問題型別。其中一個簡單輸出是影象的標籤,例如“狗/貓”或者“熱狗/非熱狗”,如以下示例所示。其他型別的輸出還包括從人臉檢測模型剪裁影象中的臉部併發送以進行面部識別,視訊流中物件的邊界框,或影象/視訊的神經風格轉換。從裝置傳送輸出的最簡單方法是通過 MQTT 使用 Greengrass 客戶端,如以下程式碼所示。此通道可以支援文字訊息,不過也支援經過文字編碼之後的影象 (例如,帶有邊界框和標籤)。

# 建立 greengrass 核心開發工具包客戶端
client = greengrasssdk.client('iot-data')
iotTopic = 'iot-data'
for obj in parsed_results:
    if obj['prob'] > max_threshold:
        label = '{{"label":"{}", "prob":{:.2f}%'.format(outMap[obj['label']], obj['prob']*100 )
        client.publish(topic=iotTopic, payload = label)

使用 AWS Greengrass 將 AWS Lambda 函式部署到 DeepLens 裝置

Greengrass 以兩種主要模式執行 Lambda 函式:固定和按需。針對 AWS DeepLens 模型,推薦方法是使用固定選項作為 Lambda 函式的開始。這花的時間會很長,特別是在深度學習模型很大時 (數百 MB,甚至若干 GB)。您可以通過幾種模式來控制觸發推理的頻率和時間:

  • 最高幀率 – 以無限迴圈方式執行函式,幀與幀之間沒有“休眠”。根據模型推理、預處理和後處理的速度,您可以得到 10-30 FPS 的幀率。
  • 特定幀率 – 以無限迴圈方式執行函式,幀與幀之間具有預定義的“休眠”。一些任務 (例如人臉檢測) 可以按照每秒 1-5 幀的速度執行,並提供檢測某一區域中所有臉部時的必需功能。您可以使用 Timer 來控制函式推理的速率:
    from threading import Timer
    def greengrass_infer_image_run():
        # 讀取影象
        # 預處理
        # 對影象執行模型推理
        # 解析結果
        # 輸出結果
        
        # 非同步呼叫此函式,在 1/2 秒後重新執行
        Timer(0.5, greengrass_infer_image_run).start()
  • 按需 – 每當您希望觸發時執行函式,可以手動觸發,也可以從其他事件觸發。即使您在以固定方式執行函式,也可以使用事件處理程式來按需觸發。以下示例演示瞭如何在每個事件上觸發推理,不過您還可以使用事件處理程式,通過解析事件引數來進一步控制函式 (例如,切換模型或模型模式)。
    def greengrass_infer_image_run():
        # 讀取影象
        # 預處理
        # 對影象執行模型推理
        # 解析結果
        # 輸出結果
        
    def lambda_handler(event, context):
        client.publish(topic=iotTopic, payload="About to call image inference function")
        greengrass_infer_image_run()
    return

為您的 Lambda 函式獲取 Greengrass 骨架有一種簡單方法,這就是在 AWS Lambda 控制檯中使用 Greengrass 藍圖之一,最好是 greengrassHelloWorld,因為在其程式包中已經包括了 Greengrass 客戶端庫。使用此藍圖建立 Lambda 函式並使用您的程式碼替換函式的 Python 程式碼,然後釋出新建立的 Lambda 函式。現在您可以將它新增到專案,然後通過 AWS DeepLens 控制檯將其部署到裝置。

將本地 Lambda 函式傳遞到雲中,用於傳送命令和接收推理輸出

如前文所述,Lambda 函式可以使用 IoT 主題通過 MQTT 協議寫出其輸出。內建專案使用的預設輸出主題為:

iotTopic = '$aws/things/{}/infer'.format(os.environ['AWS_IOT_THING_NAME'])

您可以在 AWS DeepLens 控制檯或 AWS IoT 控制檯中找到此內容。在 Lambda 函式中,您可以選擇使用相同的格式,也可以使用任何其他主題名稱,例如前面示例中的 iotTopic = ‘iot-data’。

在前文中還可以看到,您能夠使用 lambda_handler 以按需模式觸發 Lambda 函式。為了實現這一點,您需要使用 IoT 控制檯,在 IoT 雲與 Lambda 函式之間設定訂閱。例如,此處是對 Lambda 函式的入站和出站訂閱 (ImageInferenceTest 版本 19):

在本例中,邊緣 Lambda 函式偵聽到主題“trigger-image-inference”,並在每次有事件釋出到此主題時觸發推理。使用第二個訂閱可以檢視邊緣 Lambda 函式的輸出訊息,並在雲端對其做出反應。例如,您可以使用 AWS IoT 規則引擎篩選特定訊息 (例如“face detected”),然後將其傳送到其他雲端 Lambda 函式、Amazon Elasticsearch Service、Amazon Kinesis 等。請不要忘記部署 (在“Actions”下) 訂閱以同樣在 DeepLens 裝置上啟用訂閱。

我們還建議您為裝置的 Greengrass 組啟用 Amazon CloudWatch Logs,以允許您檢視 Lambda 函式的日誌和 Greengrass 核心資訊 (或除錯) 日誌。您可在 Greengrass 組控制檯頁的“Settings”部分下找到該設定。

結論

在本篇部落格帖子中,您瞭解瞭如何擴充套件在 AWS DeepLens 中提供的開放專案環境。在以後的部落格中,您將看到以這個流程為基礎的更詳細、更具體的示例,它們使用相同的結構和構建塊。此處的圖形展示了各種步驟,您可在擴充套件現有專案時 (採用更好的模型或不同 Lambda 函式) 或者從頭開始建立全新專案時使用這些步驟。

如果您有任何疑問,請在評論中留言。

補充閱讀

作者簡介

Guy Ernest 是 Amazon AI 的首席解決方案架構師。他有一個令人非常興奮的機會來幫助塑造和踐行策略,以構建思想共享並廣泛使用適用於 AI、機器學習和深度學習使用案例的 Amazon 雲端計算平臺。在空閒時間,他喜歡與妻子和家人呆在一起,收集一些令人尷尬的故事,然後在談論 Amazon 和 AI 的未來時進行分享。

相關推薦

AWS DeepLens 擴充套件專案

AWS DeepLens 提供了極好的機會來學習新技術,例如深度學習和物聯網 (IoT),以及構建可以解決實際問題的創新系統。該裝置和服務附帶有一組預定義的專案,使得從頭開始執行非常簡單。它設計作為開放平臺,使得新手和有經驗的開發人員都能構建 (和分享) 新的激動人心的專案。

ASP.NET Core MVC 授權的擴充套件定義 Authorize Attribute 和 IApplicationModelProvide

一、概述 ASP.NET Core MVC 提供了基於角色( Role )、宣告( Chaim ) 和策略 ( Policy ) 等的授權方式。在實際應用中,可能採用部門( Department ,

Keras資料集影象分類的模型訓練、儲存與恢復

資料擴增 在資料集中的資料不多的情況下,可以使用圖片生成器ImageDataGenerator用來生成一個batch的影象資料,進行資料擴增. 示例: #!/usr/bin/python # coding:utf8 from keras.prepro

通用Android應用架構專案開始

1.專案結構 現在的MVP模式越來越流行。就預設採用了。 如果專案比較小的話: app——Application Activity Fragment Presenter等的頂級父類 config——API,常量表等 model——資料層 entit

k8s 開船記-故障公告 k8s 叢集在阿里雲上大翻船

非常非常抱歉,新年上班第一天, 在今天阿里雲上氣候突變情況下,由於我們開船技術差,在今天 10:15~12:00 左右的訪問高峰,我們竟然把船給開翻了,造成近2個小時整個部落格站點無法訪問,由此給您帶來很大很大的麻煩,懇請您的諒解。 翻船經過如下。 FQ前的船隻情況 部落格站點正在使用的 k8s 叢集一共用了

告別AWSDropbox軟硬體系統,轉移500PB資料

Dropbox曾經是較早躋身獨角獸俱樂部的AWS明星使用者,而現在他們卻跳下大船,走上了自建資料中心的道路。原因主要還是成本。Dropbox的工程副總裁Aditya Agarwal表示,雲端計算公司也是要賺錢的,規模大了以後自建還是可以節省大量資金。也難怪,Dr

雲計算之路-阿裏雲上-容器難容容器服務故障以及 docker swarm 集群故障

故障 基本 pos 應用 雲上 灰色 很大的 lead leader 3月21日,由於使用阿裏雲服務器自建 docker swarm 集群的不穩定,我們將自建 docker swarm 集群上的所有應用切換阿裏雲容器服務 swarm 版(非swarm mode)。 3月2

楊澤業一個用戶體驗更好的定義404頁面

vertica borde ant word-wrap lin 狀態碼 不用 和我 體驗 我先來說說,什麽是404頁面?404頁面是客戶端在瀏覽網頁時,服務器無法正常提供信息,或是服務器無法回應,且不知道原因所返回的頁面。404頁面的作用主要是:提升用戶體驗,避免出現死鏈,

兌吧HBase遷移到阿裏雲HBase實戰經驗

2.0 系統故障 環境 hbase配置 一個 拆分 愛好 作用 專業 摘要: 業務介紹 兌吧集團包含兌吧網絡和推啊網絡,兌吧網絡是一家致力於幫助互聯網企業提升運營效率的用戶運營服務平臺,提供積分商城和媒體運營服務。推啊網絡是一家互動式廣告平臺,經過多年的探索與實踐,首創了全

git服務器連接Pycharm系列二在centos7上搭建git服務器

搭建 str dsc 虛擬 conf char har pat 連接 在自己的Linux虛擬機上,搭建git服務器,用來保存代碼。 centos7本身自帶git,需要先卸載,安裝成較新的版本。 1、卸載系統自帶版本 系統已經自帶 [root@dscrapy01 ~

git服務器連接Pycharm系列三在Win10上,安裝git

type .com 創建 連接 ffffff 安裝git vpd 系統 png 在win10系統上,安裝git,作為客戶端 安裝: Git-2.18.0-64-bit.exe 安裝步驟: 都是簡單的安裝過程,只截圖簡單表示下 只有第4、8兩步有點更改 1 選擇安裝

git服務器連接Pycharm系列四pycharm項目更新到git服務器中

strong 提示 char 點擊 win pychar set repo info 在pycharm中,已經開始敲代碼了,這是一個已經存在,沒連接到git服務器的一個項目工程。 現在就要實現,如何把這個項目同步到服務器。 > 前提:> 1. 已經在Linu

乾貨如何實現rtsp h265 轉 rtmp (rtsp hevc 轉 rtmp)並轉發到CDN或伺服器

      rtsp h265 轉 rtmp,首先要對rtmp協議做擴充套件,目前國內已有相應擴充套件標準,國內開發者基本上都按這個擴充套件協議做的。協議層問題已解決。剩下關鍵問題是要實現rtmp h265推送模組, 支援rtmp h265

VUE指令與定義指令

VUE:內建指令與自定義指令 常用的內建指令 1)v:text  更新元素的 textContent 2)v-html  更新元素的 innerHTML 3)v-if  如果為true,當前標籤才會輸出到頁面 4)v-else  如果為false,當前標籤才會輸出到頁面 5)v-show  通過控

git 訪問gitlab報錯Please make sure you have the correct access rights and the repository exists.

1.首先設定git身份的名字和郵箱:     git config --global user.name "yourname"     git config --global user.email“[email protected]"

spring4.1.8擴充套件實戰之一定義環境變數驗證

為了方便開發和測試,我們的擴充套件實戰是在SpringBoot框架下進行的,在SpringBoot自定義spring擴充套件的方式請參考《SpringBoot應用使用自定義的ApplicationContext實現類》 擴充套件功能介紹 今天實戰的內容,是通過

Dubbo專案搭建consumer

建立maven專案之consumer,同建立provider一樣。  pom新增: 先建立介面: 寫實現:  寫實現邏輯: package com.testDubo.service.impl; import org.springfram

Dubbo專案搭建provider

然後匯入相應的配置資訊:  先配置dubbo:   然後配置zookeeper: 下圖可知:dubbo依賴已經預設攜帶下載了spring很多的包    然後開始程式碼程式設計: 先定義一

冷門創業專案媒體賺錢速成之搬運大法

網上很多人,包括我自己,已經多次寫了關於自媒體的內容,原因無他,真風口也。 這裡的風口,不是說它有多麼高的收益,未來有多麼高的潛力,而是說“自媒體”,是諸位開啟網賺世界的新大門。 我們可以不會引流、不會專案、甚至不會變現,但是隻要基於一個平臺,做好自己的“自媒體”,只要積

媒體專案招商捆綁式發展無縫對接!原創視訊單人月入3萬+

一、何為自媒體創業? 一切傳遞資訊的方式和工具就叫自媒體,我們傳統認識的媒體形式像中央電視臺,各大衛視平臺,我們每天看到的新聞、娛樂節目、電視劇都叫媒體傳播,包括我們看到的報刊雜誌都是媒體傳播的一種形式,可是那樣的傳播方式離我們普通老百姓很遠。 而現在我們普通老百姓也可以通過網際網路這個平臺