在物聯網應用中,Jetson Nano 作為邊緣運算平台,結合霧運算與機器學習技術,能有效提升資料處理效率與即時性。本文提供的火災警示系統範例,利用 MQTT 協定實作感測器資料傳輸,並透過 Twilio 雲端服務傳送 WhatsApp 警示,展現了邊緣裝置與雲端服務的整合能力。此外,文章也詳細介紹瞭如何在 Jetson Nano 上使用 SVM 演算法進行模式識別,包含資料集準備、模型訓練、驗證與應用,提供讀者實務操作的參考。同時,文章也闡述了人工智慧、機器學習與深度學習的基礎概念,並說明瞭監督式、非監督式與強化學習的差異,以及深度學習演算法的應用與發展趨勢,讓讀者對機器學習在物聯網領域的應用有更全面的認識。
霧計算與雲端運算在 Jetson Nano 上的應使用案例項
5.6 霧計算與雲端運算例項解析
在 Jetson Nano 單板電腦上建立一個名為 main.py 的檔案,並將以下程式碼複製到該檔案中,然後使用以下命令執行:
python3 main.py
程式碼範例:
import paho.mqtt.client as mqtt
global z
# Twilio 相關函式庫匯入
import os
from twilio.rest import Client
# 設定 Twilio 帳戶資訊
twilio_client = Client('AC230101cb426d251b82479e33a992c149', '1d55483a6ab87ed20eac8531d70650c4')
# Twilio 沙盒測試號碼
from_whatsapp_number = 'whatsapp:+14155238886'
# 替換成您的 WhatsApp 訊息號碼
to_whatsapp_number = 'whatsapp:+917057504996'
# 當連線到 MQTT 代理時的回呼函式
def on_connect(client, userdata, flags, rc):
print('Connected with result code {0}'.format(rc))
# 訂閱主題(或在重新連線時續訂)
client.subscribe('smoke_alert')
# 當接收到已釋出訊息時的回呼函式
def on_message(client, userdata, msg):
print(msg)
z = [float(x) for x in msg.payload.decode("utf-8").split(',')]
if z[0] == 1.0:
message = twilio_client.messages.create(
body='偵測到煙霧/火災',
from_=from_whatsapp_number,
to=to_whatsapp_number
)
print(message.sid)
client = mqtt.Client()
client.on_connect = on_connect # 指定 on_connect 回呼函式
client.on_message = on_message # 指定 on_message 回呼函式
client.connect('localhost', 1883, 60) # 連線到 MQTT 代理
# 處理 MQTT 網路流量、回呼函式和重新連線(阻塞式)
client.loop_forever()
#### 內容解密:
此程式碼範例展示瞭如何在 Jetson Nano 上執行一個 MQTT 使用者端,並在接收到煙霧警示訊息時,透過 Twilio 服務傳送 WhatsApp 通知。
程式碼結構:程式碼首先匯入必要的函式庫,包括
paho.mqtt.client用於 MQTT 通訊,以及twilio.rest用於傳送 WhatsApp 訊息。Twilio 設定:程式碼中設定了 Twilio 的帳戶資訊,包括帳戶 SID 和 Auth Token,以及傳送和接收 WhatsApp 訊息的號碼。
on_connect回呼函式:當 MQTT 使用者端成功連線到 MQTT 代理時,此函式會被呼叫,並訂閱smoke_alert主題。on_message回呼函式:當使用者端接收到訂閱主題的訊息時,此函式會被觸發。程式碼會解析訊息內容,如果偵測到煙霧/火災(z[0] == 1.0),則透過 Twilio 傳送 WhatsApp 警示訊息。MQTT 連線與訊息處理:程式碼建立一個 MQTT 使用者端,設定回呼函式,並連線到本地 MQTT 代理。最後,透過
client.loop_forever()處理網路流量和回呼函式。
成功執行此程式碼後,系統會在偵測到火災時,透過 Twilio 向房主註冊的手機號碼傳送訊息通知,提示存在火災並需要採取必要措施。
練習
類別似於第 5.6.2.3 節(火警系統),使用 ESP32-CAM 模組設計一個系統,該系統能夠讀取 DHT22 感測器的溫度,並每隔 30 分鐘將溫度更新到霧節點。
修改第 5.6.1 節(根據雲端的病人監測系統),使其在 Raspberry Pi 上執行,而不是 Jetson Nano。
參考第 5.6.1 節(根據雲端的病人監測系統),將 MAX30102 心率感測器與 Jetson Nano 連線,持續監測病人的心率。如果心率超出正常範圍,則透過 Twilio 雲端傳送警示訊息。
參考第 5.6.2.2 節(家庭安全鎖),將 ESP32-CAM 模組與 2 個 PIR 感測器連線。同時,透過繼電器模組連線一個燈源。編寫一個 Python 程式,使 ESP32-CAM 能夠接收兩個 PIR 感測器的輸入。如果兩個 PIR 感測器都偵測到移動,則向 Jetson Nano 傳送訊號並開啟燈源。此外,透過 Twilio 雲端向 WhatsApp 號碼傳送訊息“偵測到移動,燈已開啟”。
修改第 5.6.2.1 節(家庭監控)的設定,使其在 PIR 感測器未偵測到移動時,每隔 10 分鐘拍攝一次影像。
為了增強家庭安全,將指紋感測器模組與系統整合。
增加火警系統中的 IoT 節點數量,以便在多個房間偵測火災。
機器學習(ML)在物聯網(IoT)與 Jetson Nano 的應用
摘要
機器學習(ML)是一個快速發展的領域,並已廣泛應用於各種物聯網(IoT)場景。當這兩者結合使用時,可以從龐大的資料中挖掘出原本隱藏的洞察。Jetson Nano 單板電腦(SBC)是實作 IoT 中 ML 的流行平台之一。它採用 NVIDIA Maxwell 架構,具備 128 個 CUDA 核心,能夠高效執行 ML 演算法。本章系統性地介紹了 ML 的基礎概念,包括人工智慧(AI)、深度學習(DL)和 ML。為了提供實踐經驗,本章精心設計了三個應用案例,分別是:使用 ML 與雲端的模式識別、使用 ML 與霧運算(FoG)的物件分類別,以及在邊緣預測未知血糖濃度。完成本章後,讀者將對在 IoT 平台上實作 ML 應用所需的技能有深入的瞭解。
關鍵字
人工智慧 · 機器學習 · 模式識別 · 物件分類別 · 預測 · 邊緣
6.1 什麼是人工智慧?
人工智慧(AI)的概念起源於 20 世紀 50 年代,當時艾倫·圖靈在其開創性論文《電腦機械與智慧(1950)》中提出了一個問題:「是否可以讓電腦思考?」這個問題至今仍在被探索。AI 是電腦科學的一個分支,旨在以肯定回答圖靈的問題。它試圖在機器中重現或模擬人類的智慧。因此,AI 是一個涵蓋 ML 和 DL 的廣泛領域,如 圖 6.1 所示。
此圖示說明瞭 AI 的基本概念,包括其與 ML 和 DL 的關係。
許多科學家長期以來一直認為,可以實作人類級別的 AI。程式設計師試圖編寫一套足夠廣泛的明確規則來操縱知識。這種方法被稱為符號式 AI,並在 20 世紀 50 年代至 80 年代佔據主導地位(Levesque, 2017)。20 世紀 80 年代的專家系統熱潮被證明是符號式 AI 的黃金時期。
6.2 機器學習(ML)和深度學習(DL)的概念
機器學習
ML 是電腦科學和統計學的結合,可用於解決模糊任務。圖靈提出的問題開啟了一扇通往新程式設計正規化的大門。在傳統程式設計和符號式 AI 中,輸出是根據輸入規則(程式)生成的。而在 ML 中,會提供輸入資料和預期的輸出資料,從而產生一套規則(程式)。這些規則隨後可以應用於新的資料,以產生原來的輸出。這兩種方法如 圖 6.2 所示。監督式學習、無監督式學習和強化學習是三種最常見的 ML 演算法形式。
圖 6.2 說明瞭傳統程式設計與 ML 的區別。
監督式學習: 在監督式學習中,使用標記良好的資料來訓練機器。監督式學習用於解決迴歸和分類別相關的問題。最常用的監督式學習演算法包括支援向量機(SVM)、線性迴歸、邏輯迴歸、樸素貝葉斯、線性判別分析(LDA)、決策樹(DT)、K 最近鄰演算法(KNN)、神經網路-多層感知器(MLP)等(演算法與機器學習:品牌忠誠度預測,2019)。
# 一個簡單的監督式學習範例:使用 scikit-learn 的 SVM 進行分類別
from sklearn import datasets
from sklearn import svm
from sklearn.model_selection import train_test_split
# 載入 iris 資料集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 將資料分為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 建立 SVM 分類別器
classifier = svm.SVC()
# 使用訓練資料訓練分類別器
classifier.fit(X_train, y_train)
# 對測試資料進行預測
y_pred = classifier.predict(X_test)
# 評估模型的準確度
accuracy = classifier.score(X_test, y_test)
print(f"模型的準確度:{accuracy}")
#### 內容解密:
此範例程式碼展示瞭如何使用 scikit-learn 中的 SVM 對 iris 資料集進行分類別。首先,我們載入 iris 資料集並將其分為訓練集和測試集。然後,建立一個 SVM 分類別器並使用訓練資料進行訓練。接著,對測試資料進行預測並評估模型的準確度。這個例子說明瞭監督式學習的基本流程,包括資料準備、模型訓練、預測和評估。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Jetson Nano 霧運算與機器學習應用
package "機器學習流程" {
package "資料處理" {
component [資料收集] as collect
component [資料清洗] as clean
component [特徵工程] as feature
}
package "模型訓練" {
component [模型選擇] as select
component [超參數調優] as tune
component [交叉驗證] as cv
}
package "評估部署" {
component [模型評估] as eval
component [模型部署] as deploy
component [監控維護] as monitor
}
}
collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型
note right of feature
特徵工程包含:
- 特徵選擇
- 特徵轉換
- 降維處理
end note
note right of eval
評估指標:
- 準確率/召回率
- F1 Score
- AUC-ROC
end note
@enduml
圖表翻譯:
此 Plantuml 圖表呈現了一個使用 SVM 分類別器的機器學習工作流程。首先,從載入資料開始,接著將資料分割為訓練集和測試集。然後,建立一個 SVM 分類別器並使用訓練資料訓練模型。模型訓練完成後,對測試資料進行預測。最後,評估模型的效能。這個流程展示了監督式學習的主要步驟。
機器學習(ML)與深度學習(DL)基礎概念
機器學習(ML)是人工智慧的一個子領域,專注於開發能夠從資料中學習並改進其效能的演算法。ML 可分為三類別:監督式學習、非監督式學習和強化學習。
非監督式學習
非監督式學習是一種 ML 技術,其中演算法未被提供任何標籤或分數來訓練資料。此技術用於降維和叢集。常見的非監督式學習演算法包括 K-means 叢集、KNN、層次叢集、異常檢測、神經網路(NN)、主成分分析(PCA)、獨立成分分析(ICA)和 Apriori 演算法等。
強化學習
強化學習是一種 ML 技術,其中模型根據反饋學習執行動作。對於每個準確的動作,模型獲得正向反饋;對於每個不準確的動作,模型獲得負向反饋。這裡,模型透過反饋自動學習,而無需標籤資料。常見的強化學習方法包括蒙特卡羅、Q-learning、狀態-動作-獎勵-狀態-動作(SARSA)、深度 Q 網路(DQN)、深度確定性策略梯度(DDPG)和具有歸一化優勢函式的 Q-Learning(NAF)等。
深度學習(DL)
DL 是 ML 的一個子領域,透過使用更深層次的網路結構來提取隱藏資訊,從而解決複雜問題。DL 的高效能在於能夠處理大量資料,這是傳統 ML 無法實作的。DL 演算法透過模仿人類思考邏輯來分析資料,使用稱為人工神經網路(ANN)的分層結構演算法。ANN 的架構靈感來自人類大腦的生物神經網路,因此其學習過程遠遠優於普通的 ML 模型。
人工神經網路(ANN)架構
圖 6.4 描述了一個簡單的 ANN 架構。最左側的層稱為「輸入層」,最右側的層稱為「輸出層」。輸入層和輸出層之間的層稱為「隱藏層」。隱藏層的權重會被調整,以便網路能夠實作預期的目標。網路越深,輸入層和輸出層之間的隱藏層就越多。一般來說,深度神經網路(DNN)是指具有一個或多個隱藏層的 ANN。
深度學習的進展
DL 在涉及大量資料和高計算能力的應用中取得了顯著進展。然而,隨著雲端計算基礎設施和高效能圖形處理單元(GPUs)的出現,訓練 DL 網路所需的時間可以大大縮短。此外,遷移學習(TL)的引入,即使用預訓練模型,是 DL 領域最重要的進展之一。TL 的出現消除了對大量資料集的需求,這些資料集以前是 ANN 取得良好效能所必需的。
深度學習演算法
DL 演算法非常流行,其中最突出的包括卷積神經網路(CNNs)、長短期記憶網路(LSTMs)、遞迴神經網路(RNNs)、生成對抗網路(GANs)、徑向基函式網路(RBFNs)、自組織對映(SOMs)、深度信念網路(DBNs)、受限玻爾茲曼機(RBMs)和自動編碼器等。
使用 ML 和雲端進行模式識別
模式識別引起了全球研究人員的興趣。模式可以透過 ML 演算法進行物理檢測或計算觀察。模式識別系統可以快速準確地識別熟悉的模式。這裡使用了標籤訓練資料。模式識別應用包括影像處理、語音、指紋識別、航空影像解釋、光學字元識別(OCR)和醫學成像等。
實作步驟
本文介紹了在 Jetson Nano SBC 平台上使用 SVM ML 演算法進行模式識別的實作步驟。成功識別後,將使用 Twilio 雲平台向註冊的手機號碼傳送 WhatsApp 訊息。
更新和升級平台:使用以下命令作為 root 使用者更新和升級 Jetson Nano SBC。
sudo apt-get update sudo apt-get upgrade安裝必要的函式庫/倉函式庫:安裝必要的函式庫,如
pip、open-CV、sklearn和pickle。sudo apt install python3-pip sudo pip install opencv-python sudo pip install -U scikit-learn sudo pip install pickle-mixin安排專案目錄:在所需位置建立一個名為
Project的目錄,並在其中建立一個名為Pattern_recog的子目錄,用於存放資料集、訓練模型和程式。組態 Twilio:按照第 5 章第 6.2.1 節的描述,在 Jetson Nano SBC 上組態 Twilio。
建立子目錄:在
Pattern_recog目錄中建立 3 個子目錄,分別命名為Test、Triangle和Quadrilateral。
SVM 模型訓練和驗證流程圖
圖 6.6 描述了 SVM 模型訓練和驗證的流程圖。
程式碼實作
以下是一個簡單的 Python 程式碼範例,用於演示如何使用 SVM 演算法進行模式識別:
# 載入必要的函式庫
import cv2
import numpy as np
from sklearn import svm
import pickle
# 載入資料集
# ...
# 訓練 SVM 模型
def train_svm(X_train, y_train):
clf = svm.SVC()
clf.fit(X_train, y_train)
return clf
# 儲存訓練好的模型
def save_model(clf, filename):
with open(filename, 'wb') as f:
pickle.dump(clf, f)
# 載入儲存的模型
def load_model(filename):
with open(filename, 'rb') as f:
clf = pickle.load(f)
return clf
# 使用訓練好的模型進行預測
def predict(clf, X_test):
return clf.predict(X_test)
#### 程式碼解密:
1. **載入必要的函式庫**:載入 OpenCV、NumPy、scikit-learn 和 pickle 函式庫,用於影像處理、數值計算、機器學習和模型儲存/載入。
2. **載入資料集**:載入用於訓練和測試的資料集。
3. **`train_svm` 函式**:定義一個函式來訓練 SVM 模型,使用 scikit-learn 的 `svm.SVC` 類別。
4. **`save_model` 和 `load_model` 函式**:定義函式來儲存和載入訓練好的 SVM 模型,使用 pickle 函式庫。
5. **`predict` 函式**:定義一個函式來使用訓練好的模型進行預測。
此範例程式碼展示瞭如何使用 SVM 演算法進行模式識別,包括資料載入、模型訓練、儲存和載入,以及使用模型進行預測。