返回文章列表

Jetson Nano 霧運算與機器學習應用

本文探討在 Jetson Nano 上結合霧運算與機器學習的應使用案例項,包含火災警示搭配 Twilio WhatsApp 通知、根據 MQTT 的資料採集與雲端整合,以及運用 SVM

物聯網 機器學習

在物聯網應用中,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 通知。

  1. 程式碼結構:程式碼首先匯入必要的函式庫,包括 paho.mqtt.client 用於 MQTT 通訊,以及 twilio.rest 用於傳送 WhatsApp 訊息。

  2. Twilio 設定:程式碼中設定了 Twilio 的帳戶資訊,包括帳戶 SID 和 Auth Token,以及傳送和接收 WhatsApp 訊息的號碼。

  3. on_connect 回呼函式:當 MQTT 使用者端成功連線到 MQTT 代理時,此函式會被呼叫,並訂閱 smoke_alert 主題。

  4. on_message 回呼函式:當使用者端接收到訂閱主題的訊息時,此函式會被觸發。程式碼會解析訊息內容,如果偵測到煙霧/火災(z[0] == 1.0),則透過 Twilio 傳送 WhatsApp 警示訊息。

  5. MQTT 連線與訊息處理:程式碼建立一個 MQTT 使用者端,設定回呼函式,並連線到本地 MQTT 代理。最後,透過 client.loop_forever() 處理網路流量和回呼函式。

成功執行此程式碼後,系統會在偵測到火災時,透過 Twilio 向房主註冊的手機號碼傳送訊息通知,提示存在火災並需要採取必要措施。

練習

  1. 類別似於第 5.6.2.3 節(火警系統),使用 ESP32-CAM 模組設計一個系統,該系統能夠讀取 DHT22 感測器的溫度,並每隔 30 分鐘將溫度更新到霧節點。

  2. 修改第 5.6.1 節(根據雲端的病人監測系統),使其在 Raspberry Pi 上執行,而不是 Jetson Nano。

  3. 參考第 5.6.1 節(根據雲端的病人監測系統),將 MAX30102 心率感測器與 Jetson Nano 連線,持續監測病人的心率。如果心率超出正常範圍,則透過 Twilio 雲端傳送警示訊息。

  4. 參考第 5.6.2.2 節(家庭安全鎖),將 ESP32-CAM 模組與 2 個 PIR 感測器連線。同時,透過繼電器模組連線一個燈源。編寫一個 Python 程式,使 ESP32-CAM 能夠接收兩個 PIR 感測器的輸入。如果兩個 PIR 感測器都偵測到移動,則向 Jetson Nano 傳送訊號並開啟燈源。此外,透過 Twilio 雲端向 WhatsApp 號碼傳送訊息“偵測到移動,燈已開啟”。

  5. 修改第 5.6.2.1 節(家庭監控)的設定,使其在 PIR 感測器未偵測到移動時,每隔 10 分鐘拍攝一次影像。

  6. 為了增強家庭安全,將指紋感測器模組與系統整合。

  7. 增加火警系統中的 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 訊息。

  1. 更新和升級平台:使用以下命令作為 root 使用者更新和升級 Jetson Nano SBC。

    sudo apt-get update
    sudo apt-get upgrade
    
  2. 安裝必要的函式庫/倉函式庫:安裝必要的函式庫,如 pipopen-CVsklearnpickle

    sudo apt install python3-pip
    sudo pip install opencv-python
    sudo pip install -U scikit-learn
    sudo pip install pickle-mixin
    
  3. 安排專案目錄:在所需位置建立一個名為 Project 的目錄,並在其中建立一個名為 Pattern_recog 的子目錄,用於存放資料集、訓練模型和程式。

  4. 組態 Twilio:按照第 5 章第 6.2.1 節的描述,在 Jetson Nano SBC 上組態 Twilio。

  5. 建立子目錄:在 Pattern_recog 目錄中建立 3 個子目錄,分別命名為 TestTriangleQuadrilateral

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. **載入必要的函式庫**載入 OpenCVNumPyscikit-learn 和 pickle 函式庫用於影像處理數值計算機器學習和模型儲存/載入
2. **載入資料集**載入用於訓練和測試的資料集
3. **`train_svm` 函式**定義一個函式來訓練 SVM 模型使用 scikit-learn 的 `svm.SVC` 類別
4. **`save_model``load_model` 函式**定義函式來儲存和載入訓練好的 SVM 模型使用 pickle 函式庫
5. **`predict` 函式**定義一個函式來使用訓練好的模型進行預測

此範例程式碼展示瞭如何使用 SVM 演算法進行模式識別包括資料載入模型訓練儲存和載入以及使用模型進行預測