Leo Yeh's Blog

SAS Viya (94)

教學目標

初步了解 SAS Event Stream Processing 如何實作影像識別即時串流處理和分析的基本概念。

重點概念

首先 SAS Event Stream Proccessing 能夠讓我們在事件串流處理模型中使用進階分析和機器學習技術,串流分析和技術能夠讓我們利用物聯網 (IoT) 的資料解決常見問題,像是許多不同的變數、資料噪音、資料遺失、資料冗餘以預測罕見事件。同時物聯網 (IoT) 和人工智慧(AI) 應該緊密相連,在快速發展的物聯網世界中,我們透過龐大的網絡連接和共享資料、設備或事物,為企業組織帶來更多有價值的分析,主要原因在於我們能夠從大量物聯網資料學習的過程中做出快速決策,並且發現深刻見解,至於常見的物聯網串流分析案例,分別為:

  1. 檢測設備異常情況,以利確保監測系統穩定性。
  2. 預處理,轉換或過濾資料,確保從邊緣到資料中心的資料量。
  3. 處理非結構化文字,語音,影片或圖像資料,以利識別模式或趨勢。

此外在 SAS Event Stream Processing Analytics 中包含了許多種類的分析演算法,可用於事件串流處理的專案,同時 SAS Event Stream Processing Analytics 還支援各種來源的不同離線模型,其主要以 ASTORE 分析儲存檔案的模型以請求來源的設定方式載入至模型讀取器窗口中,以利進行評分窗口的分析應用,像是我們能夠將圖檔先轉為 Base64 編碼之後儲存為 CSV 檔案,再將 CSV 檔案發佈至資料窗口,窗口會自動轉換為二進位資料進行儲存,並且透過計算窗口進行圖片大小的調整之後,此時就能夠透過評分窗口針對圖片基於模型讀取器載入的模型進行評分,同時會將評分的結果透過 WebSocket 的方式傳送給訂閱者,至於如何實作以上所描述的影像識別即時串流處理和分析專案,其相關重點概念,請參考官方文件

接著當我們實作事件串流處理的專案時,就會有許多種類的窗口類型,分別為:

  1. 模型監督員:主要管理從 模型讀取器窗口接收到的模型。
  2. 模型讀取器:主要讀取分析存儲檔案或非二進位檔案的模型組合。
  3. 訓練:主要基於串流事件資料優化在線模型的演算法參數。
  4. 計算:主要使用各種分析演算法轉換資料事件。
  5. 評分:主要使用的在線分析演算法或離線模型中的演算法針對事件進行評分。

此外當我們在訓練、計算和評分窗口中執行串流分析演算法時,我們必須指定其名稱,參數屬性、輸入對應和輸出對應的屬性,此時我們就能夠透過「dfesp_analytics」工具取得特定窗口類型和演算法組合的相關資訊。

取得 ASTORE 的輸入對應和輸出對應的屬性

1
$ dfesp_analytics -score -type astore -reference /model/XXX.astore

再來進出任何串流分析窗口類型的邊緣皆必須指定與事件類型相對應的角色,也就是邊緣角色,主要有三種角色,分別為:

  1. 資料:主要在窗口之間發送資料事件,主要是將要由串流分析演算法處理的資料串流式傳輸至接收窗口中。
  2. 模型:主要在窗口之間發送模型事件,具有固定模式的模型事件會將模型細節以串流的方式傳輸到接收窗口中。
  3. 請求:主要在窗口之間發送請求事件,具有固定模式的請求事件將會請求在接收窗口內執行特定操作。

此外事件也能夠分為三種類型,分別為:

  1. 資料事件:資料事件主要會用於接收不同窗口的資料,我們主要會透過傳入模型事件指定的機器學習演算法處理傳送到評分窗口的資料,而評分窗口產生由評分資料所組成的資料事件,傳入訓練窗口的資料主要用於訓練由傳入模型事件指定的模型以產生訓練模型,傳入計算窗口的資料主要用於輸入資料的處理和分析,以利產生即時的統計資料。
  2. 模型事件:模型事件主要會將中繼資料串流模型傳入至評分窗口或模型監督員窗口中,其中訓練窗口主要會根據傳入的資料事件調整模型的參數,然後透過模型事件將這些變化的結果以串流方式傳輸到評分窗口中,模型讀取器窗口主要根據請求事件指定將模型發佈到評分窗口或模型監督員窗口中,至於模型監督員窗口主要控制如何和何時將模型部署到請求事件指定的評分窗口中。
  3. 請求事件:請求事件主要為透過請求的邊緣傳輸事件稱為請求事件,我們能夠使用請求事件來啟動操作,像是重新配置模型,以及我們也能夠使用適配器將請求事件注入來源窗口中,更能夠在連續查詢中指定它們來自另一個窗口,請注意請求事件通常比資料事件慢。

最後在大多數情況下,模型讀取器窗口主要接收離線模型的位置和類型的請求事件,所謂離線模型主要是與 ESP 服務器分開指定,開發,訓練和儲存的模型,而 SAS Event Stream Processing 支援各種來源的離線模型,像是 SAS Visual Data Mining and Machine Learning、SAS Visual Text Analytics、JMP、Open Source (TensorFlow)、…等,而模型讀取器窗口會將包含模型的模型事件發佈到評分窗口中,請注意我們必須透過請求事件將模型重新發佈至模型讀取器窗口,以利評分窗口可以為新事件進行評分,以及對於推薦系統,我們更能夠在模型讀取器窗口本身中指定離線模型的屬性值,直接基於屬性值發佈模型事件。

影像識別即時串流處理和分析專案定義範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<project name="ImageProject" threads="1" pubsub="auto" heartbeat-interval="1">
<metadata>
<meta id="studioUploadedBy">sasuser</meta>
<meta id="studioUploaded">1562740236201</meta>
<meta id="studioModifiedBy">sasuser</meta>
<meta id="studioModified">1562751605787</meta>
<meta id="layout">{"Query":{"ModelReader":{"x":190,"y":270},"Request":{"x":205,"y":40},"Resize":{"x":-65,"y":225},"Score":{"x":5,"y":410},"Source":{"x":-145,"y":35}}}</meta>
</metadata>
<contqueries>
<contquery name="Query">
<windows>
<window-source pubsub="true" insert-only="true" autogen-key="true" name="Source">
<schema>
<fields>
<field name="id" type="int64" key="true"/>
<field name="_image_" type="blob"/>
</fields>
</schema>
</window-source>
<window-source pubsub="true" insert-only="true" autogen-key="true" name="Request">
<schema>
<fields>
<field name="req_id" type="int64" key="true"/>
<field name="req_key" type="string"/>
<field name="req_val" type="string"/>
</fields>
</schema>
</window-source>
<window-model-reader name="ModelReader" pubsub="true" model-type="astore"/>
<window-score name="Score" pubsub="true">
<schema>
<fields>
<field name="id" type="int64" key="true"/>
<field name="P_label_A" type="double"/>
<field name="P_label_B" type="double"/>
<field name="I_label_" type="string"/>
</fields>
</schema>
<models>
<offline model-type="astore">
<input-map>
<properties>
<property name="_image_"><![CDATA[_image_]]></property>
</properties>
</input-map>
<output-map>
<properties>
<property name="P_label_A"><![CDATA[P_label_A]]></property>
<property name="P_label_B"><![CDATA[P_label_B]]></property>
<property name="I_label_"><![CDATA[I_label_]]></property>
</properties>
</output-map>
</offline>
</models>
</window-score>
<window-calculate pubsub="true" algorithm="ImageProcessing" name="Resize">
<schema>
<fields>
<field name="id" type="int64" key="true"/>
<field name="_image_" type="blob"/>
</fields>
</schema>
<parameters>
<properties>
<property name="function"><![CDATA[resize]]></property>
<property name="preFlip"><![CDATA[-1000]]></property>
<property name="x"><![CDATA[0]]></property>
<property name="y"><![CDATA[0]]></property>
<property name="width"><![CDATA[224]]></property>
<property name="height"><![CDATA[224]]></property>
<property name="outputWidth"><![CDATA[0]]></property>
<property name="outputHeight"><![CDATA[0]]></property>
<property name="alpha"><![CDATA[0]]></property>
<property name="beta"><![CDATA[0]]></property>
<property name="delta"><![CDATA[0]]></property>
<property name="theta"><![CDATA[0]]></property>
<property name="value"><![CDATA[0]]></property>
<property name="minValue"><![CDATA[0]]></property>
<property name="maxValue"><![CDATA[0]]></property>
<property name="type"><![CDATA[0]]></property>
<property name="flag1"><![CDATA[0]]></property>
<property name="flag2"><![CDATA[0]]></property>
<property name="flag3"><![CDATA[0]]></property>
<property name="flag4"><![CDATA[0]]></property>
<property name="flag5"><![CDATA[0]]></property>
</properties>
</parameters>
<input-map>
<properties>
<property name="imageInput"><![CDATA[_image_]]></property>
</properties>
</input-map>
<output-map>
<properties>
<property name="imageOutput"><![CDATA[_image_]]></property>
</properties>
</output-map>
</window-calculate>
</windows>
<edges>
<edge source="Request" target="ModelReader" role="request"/>
<edge source="ModelReader" target="Score" role="model"/>
<edge source="Source" target="Resize" role="data"/>
<edge source="Resize" target="Score" role="data"/>
</edges>
</contquery>
</contqueries>
</project>

相關資源

⬅️ Go back