返回文章列表

Edge Impulse 影像分類別模型訓練與佈署

本文介紹如何使用 Edge Impulse 建立影像分類別模型,涵蓋資料收集、模型訓練、測試與佈署等關鍵步驟。文章詳細說明如何利用 Edge Impulse Ingestion API 與 iNaturalist 資料函式庫收集影像資料,並使用 Edge Impulse Studio

機器學習 嵌入式系統

Edge Impulse 提供了一個簡化的機器學習模型開發流程,讓開發者能快速建立和佈署影像分類別模型。資料收集階段,可運用 Edge Impulse Ingestion API 或 iNaturalist 等公開資料函式庫取得影像資料,並透過 Python 指令碼自動化上傳和標記流程。在 Edge Impulse Studio 中,可以設定影像預處理、特徵提取和模型訓練引數,並使用 Transfer Learning 技術加速模型訓練。Edge Impulse 也提供 EON Tuner 自動機器學習工具,協助開發者最佳化模型效能。最後,訓練完成的模型可佈署至各種嵌入式平台、行動裝置或電腦上,方便進行即時影像分類別應用。

資料收集與 Edge Impulse 整合

在進行機器學習專案時,資料收集是至關重要的一步。本文將介紹如何使用 Edge Impulse 的 Ingestion API 來收集資料,以及如何直接從裝置或雲端儲存桶上傳資料至 Edge Impulse 專案。此外,我們還會探討如何利用 iNaturalist 資料函式庫來取得所需的影像資料。

使用 Edge Impulse Ingestion API 收集資料

Edge Impulse 提供了一個簡單易用的 Ingestion API,讓開發者能夠輕鬆地上傳資料至 Edge Impulse 專案。開發者可以使用任何程式語言來編寫指令碼,透過設定定時器或觸發器,自動將影像上傳至 Edge Impulse 專案。

程式碼實作

以下是一個簡單的 Python 篡寫範例,展示如何使用 Edge Impulse Ingestion API 上傳影像資料:

import requests
import time

# 設定 Edge Impulse 專案 API 金鑰
api_key = "YOUR_API_KEY"

# 設定要上傳的影像檔案路徑
image_path = "/path/to/image.jpg"

# 設定 Ingestion API 端點
ingestion_api_endpoint = "https://ingest.edgeimpulse.com/api/training/data"

# 上傳影像資料
with open(image_path, "rb") as f:
    response = requests.post(
        ingestion_api_endpoint,
        headers={"x-api-key": api_key},
        files={"data": f},
    )

    # 檢查上傳是否成功
    if response.status_code == 200:
        print("影像上傳成功!")
    else:
        print("影像上傳失敗!")

內容解密:

  1. 設定 Edge Impulse 專案 API 金鑰:首先,您需要在 Edge Impulse 專案中建立一個 API 金鑰,並將其儲存在 api_key 變數中。
  2. 設定要上傳的影像檔案路徑:指定要上傳的影像檔案路徑,並將其儲存在 image_path 變數中。
  3. 設定 Ingestion API 端點:Edge Impulse 的 Ingestion API 端點是固定的,您可以直接使用官方提供的端點。
  4. 上傳影像資料:使用 requests 函式庫,以 POST 請求的方式上傳影像資料至 Edge Impulse 專案。

從雲端儲存桶直接提取資料

Edge Impulse 也支援直接從雲端儲存桶提取資料,並自動觸發專案中的回應。這對於長期改善模型非常有用,尤其是在主動學習策略中。

直接連線裝置至 Edge Impulse

有多種方法可以直接從裝置上傳資料至 Edge Impulse 專案。如果您的裝置平台受到官方支援,您可以按照 Edge Impulse 開發板檔案中的韌體更新進行操作。如果您的裝置平台未受到官方支援,您可以按照開發平台移植,將 Edge Impulse Ingestion API 整合到您的嵌入式裝置韌體中。

使用 iNaturalist 取得影像資料

由於大多數人可能沒有大量的入侵物種影像資料,因此需要額外的資料收集方法。在本教程中,我們將使用 iNaturalist 資料函式庫來取得已標註的影像資料。

iNaturalist 資料查詢

首先,您需要在 iNaturalist 上建立一個帳戶,並使用其匯出網站來查詢所需的影像資料。查詢步驟如下:

  1. 查詢目標物種影像:使用 iNaturalist 的查詢功能,搜尋目標物種的影像資料,並下載包含 iduser_loginquality_gradelicenseurlimage_url 等欄位的 CSV 檔案。
  2. 查詢未知物種或環境影像:同樣使用 iNaturalist 的查詢功能,搜尋未知物種或環境的影像資料,並下載相應的 CSV 檔案。

下載 iNaturalist 影像資料

使用 Python 範例程式碼(Example 11-3)來下載並儲存 iNaturalist 查詢結果的影像資料,同時將下載的檔案與原始上傳者的使用者名稱相關聯。

import csv
from pathlib import Path
import requests

directory = Path("unknown")  # 更換目錄名稱,"unknown" 或 "animal"
directory.mkdir(parents=True, exist_ok=True)

with open("observations-xxx.csv") as f:  # 更換 CSV 檔案名稱
    reader = csv.reader(f)
    next(reader, None)  # 跳過標頭列
    for data in reader:
        # 檔案名稱格式為 id.user_login.extension
        id_, user_login, url = data[0], data[1], data[5]
        extension = Path(url).suffix
        path = directory / f"{id_}.{user_login}{extension}"
        img = requests.get(url).content
        path.write_bytes(img)

內容解密:

  1. 指定儲存目錄:首先,指定一個目錄來儲存下載的影像資料。
  2. 開啟 CSV 檔案:開啟從 iNaturalist 下載的 CSV 檔案,並讀取其中的資料。
  3. 下載影像資料:根據 CSV 檔案中的 url 欄位,下載相應的影像資料,並將其儲存到指定的目錄中。
  4. 檔案命名規則:下載的影像檔案名稱格式為 id.user_login.extension,其中 id 是 iNaturalist 的影像 ID,user_login 是上傳者的使用者名稱,extension 是檔案副檔名。

使用Edge Impulse進行邊緣AI影像分類別的實務探討

資料集限制與挑戰

即使透過iNaturalist取得強大的資料集,仍存在許多限制。當相機對未標記的動物進行多次偵測時,無法確定這些影像代表多個移動的個體還是單一的個體重複進入相機視野。此外,iNaturalist偏好動物在影像中近距離/較大的影像,這種偏差可能降低機器學習模型在現實世界的準確性。為瞭解決這個問題,可能需要採用「主動學習」方法來改善模型。

資料集授權與法律義務

使用Edge Impulse時,使用者必須遵守相關的使用條款、授權和政策,包括隱私政策、服務條款、責任AI授權和DMCA政策。使用第三方資料集(如iNaturalist)時,需確保資料的再分發或商業使用資格合法合規。

清理資料集

由於已從iNaturalist下載影像資料集並標記類別,因此在上傳至Edge Impulse專案前不需要進行額外的清理。然而,若擁有少量標記影像和大量未標記影像,Edge Impulse提供「資料探索器」工具,可使用預訓練模型或預處理區塊批次標記未標記的影像。

上傳資料至Edge Impulse

可透過Edge Impulse專案網頁GUI或CLI上傳工具上傳影像,並自動將上傳的影像以80/20比例分割為訓練和測試資料集。

$ edge-impulse-uploader --api-key [your-api-key] --label [label] \
--category split .[directory]/*

內容解密:

  • edge-impulse-uploader:Edge Impulse提供的CLI工具,用於上傳資料集至專案。
  • --api-key [your-api-key]:指定Edge Impulse專案的API金鑰,用於驗證身分。
  • --label [label]:指定上傳影像的標籤,例如「unknown」或目標動物的名稱。
  • --category split:自動將上傳的資料分割為訓練和測試資料集。
  • .[directory]/*:指定包含影像的目錄路徑。

DSP與機器學習工作流程

在Edge Impulse中,「Impulse設計」涵蓋了從原始資料到機器學習模型輸出的完整流程。首先,原始資料區塊對資料進行預處理,如將影像尺寸統一;接著,DSP區塊提取重要特徵;最後,學習區塊訓練神經網路模型。

設定Impulse設計

  1. Image data:設定影像寬高為160,縮放模式選擇「Fit shortest axis」。
  2. Processing block:選擇「Image」處理區塊。
  3. Learning block:選擇「Transfer Learning (Images)」進行遷移學習。
@startuml
skinparam backgroundColor #F8F9FA
skinparam roundcorner 15
skinparam sequenceArrowThickness 2

!define LIGHTBLUE #E3F2FD
!define LIGHTGREEN #E8F5E9
!define LIGHTYELLOW #FFF9C4
!define LIGHTPINK #FCE4EC

box "資料採集階段" LIGHTBLUE
  participant "影像感測器" as Camera
  participant "Edge Impulse\nIngestion API" as API
  database "訓練資料集\n(80%)" as TrainDB
  database "測試資料集\n(20%)" as TestDB
end box

box "Impulse 設計階段" LIGHTGREEN
  participant "Input Block\n(160x160 RGB)" as Input
  participant "Processing Block\n(Image DSP)" as DSP
  participant "Learning Block\n(Transfer Learning)" as ML
end box

box "模型訓練階段" LIGHTYELLOW
  participant "Feature\nExtractor" as Feature
  participant "MobileNetV2\nBackbone" as MobileNet
  participant "Custom\nClassifier" as Classifier
  participant "EON Tuner\n(AutoML)" as Tuner
end box

box "測試與部署階段" LIGHTPINK
  participant "Model Testing" as Test
  participant "Live\nClassification" as Live
  participant "Deployment\nOptions" as Deploy
  collections "嵌入式裝置\n微控制器\n行動裝置" as Devices
end box

== 1. 資料收集與上傳 ==
Camera -> API: 上傳影像資料\n(含標籤)
API -> TrainDB: 80% 分配
API -> TestDB: 20% 分配
note right of API
  支援來源:
  - 直接裝置連線
  - iNaturalist API
  - 雲端儲存桶
  - CLI 上傳工具
end note

== 2. Impulse 設計配置 ==
TrainDB -> Input: 載入訓練影像
Input -> DSP: 調整尺寸至 160x160\nFit shortest axis
note right of DSP
  影像預處理:
  - 尺寸標準化
  - 顏色空間轉換
  - 資料正規化 (0-1)
end note

DSP -> Feature: 特徵提取\n降維處理
Feature -> ML: 特徵向量輸入

== 3. 模型訓練與優化 ==
ML -> MobileNet: 使用預訓練權重\n(ImageNet)
MobileNet -> Classifier: 特徵映射傳遞
note right of Classifier
  訓練參數:
  - Epochs: 100
  - Learning Rate: 0.0005
  - Validation Split: 20%
  - Dropout: 0.1
end note

Classifier -> Tuner: 提交配置
Tuner -> Tuner: 評估多個架構\n選擇最佳模型
Tuner --> Classifier: 返回優化參數

== 4. 測試與驗證 ==
TestDB -> Test: 載入測試資料
Test -> Live: 批次測試
Live -> Live: 計算準確率\n混淆矩陣分析
note right of Live
  評估指標:
  - Accuracy
  - Precision / Recall
  - F1-Score
  - 推論時間
end note

== 5. 模型部署 ==
Live -> Deploy: 生成部署包
Deploy -> Devices: C++ Library\nWebAssembly\nTensorFlow Lite

note over Devices
  部署平台:
  - Arduino Nano 33 BLE
  - Raspberry Pi
  - ESP32
  - iOS/Android
  - Web Browser
end note

@enduml

圖表翻譯: 此圖示完整呈現了 Edge Impulse 影像分類模型的端到端開發流程,分為五個關鍵階段。第一階段「資料採集」透過影像感測器或 iNaturalist API 收集資料,並透過 Ingestion API 自動分配至訓練集(80%)與測試集(20%)。第二階段「Impulse 設計」定義完整的資料處理管線,Input Block 將影像調整為 160x160 畫素,Processing Block 執行 DSP 演算法進行特徵提取與降維,Learning Block 則配置遷移學習架構。第三階段「模型訓練」運用 MobileNetV2 作為預訓練骨幹網路,結合自定義分類器進行微調,EON Tuner 自動評估多個模型架構並選擇最佳配置。第四階段「測試與驗證」使用測試資料集進行批次評估,計算準確率、精確度、召回率及 F1-Score 等指標,並透過即時分類功能驗證模型效能。第五階段「模型部署」生成針對不同平台的部署包,支援嵌入式微控制器(Arduino、ESP32)、單板電腦(Raspberry Pi)、行動裝置及網頁瀏覽器,完整實現邊緣 AI 的落地應用。整體流程展現了 Edge Impulse 平台的低程式碼特性,大幅降低機器學習模型開發門檻,適合快速原型開發與產品化部署。

數位訊號處理區塊

本專案使用Edge Impulse Studio預設的影像DSP演算法,該演算法免費可用於影像處理。選擇的影像處理區塊會自動對影像進行預處理和特徵提取,為後續的神經網路訓練提供基礎。

專業深度與差異化觀點

在實際應用中,需考慮資料集偏差、模型泛化能力以及法律合規性等問題。採用「主動學習」方法可以逐步提升模型的準確性和適應性。同時,遵守相關的授權和政策是確保專案合法性的關鍵。未來趨勢可能朝向更加自動化的資料處理和模型最佳化方向發展。

使用Edge Impulse進行影像分類別的機器學習模型訓練

Edge Impulse是一個功能強大的開發平台,專為嵌入式機器學習應用程式設計。在本章節中,我們將探討如何使用Edge Impulse Studio來訓練一個影像分類別模型,並深入瞭解其各個組成部分。

影像DSP區塊與特徵探索

首先,我們需要設定影像DSP(Digital Signal Processing)區塊來處理我們的影像資料。Edge Impulse提供了預先建置的DSP區塊,用於從原始資料中提取有用的特徵。對於影像分類別任務,我們使用影像DSP區塊。

程式碼範例:影像DSP區塊

import numpy as np

def image_dsp_block(image_data):
    # 將影像資料調整為適當的大小
    resized_image = np.resize(image_data, (96, 96, 3))
    # 進行影像標準化
    normalized_image = resized_image / 255.0
    return normalized_image

# 使用範例
image_data = np.random.rand(128, 128, 3)  # 假設的原始影像資料
processed_image = image_dsp_block(image_data)
print(processed_image.shape)

內容解密:

  1. image_dsp_block函式接收原始影像資料,並將其調整為96x96畫素的大小,以符合模型的輸入需求。
  2. 影像資料被標準化到0到1的範圍內,以提高模型的訓練效率。
  3. 處理後的影像資料可以被送入神經網路進行訓練。

機器學習區塊

在設定好影像DSP區塊後,我們可以開始訓練我們的邊緣機器學習模型。Edge Impulse提供了多種方式來訓練模型,包括視覺化編輯模式和專業模式。

視覺化模式

視覺化模式是Edge Impulse中最簡單的訓練模型方式。我們可以透過以下步驟組態我們的機器學習訓練設定和神經網路架構:

  1. 在「Transfer learning」標籤下,設定以下引數:

    • 訓練週期數:100
    • 學習率:0.0005
    • 驗證集大小:20%
    • 自動平衡資料集:未勾選
    • 資料增強:未勾選
    • 神經網路架構:MobileNetV2 96x96 0.35(最後一層:16個神經元,0.1 dropout)
  2. 點選「Start training」來啟動訓練作業。

程式碼範例:模型訓練組態

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout

def create_model(input_shape, num_classes):
    model = Sequential([
        # 使用預訓練的MobileNetV2模型
        tf.keras.applications.MobileNetV2(input_shape=input_shape, weights='imagenet', include_top=False),
        tf.keras.layers.GlobalAveragePooling2D(),
        Dense(16, activation='relu'),
        Dropout(0.1),
        Dense(num_classes, activation='softmax')
    ])
    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0005),
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    return model

# 使用範例
input_shape = (96, 96, 3)
num_classes = 2
model = create_model(input_shape, num_classes)
model.summary()

內容解密:

  1. create_model函式定義了一個使用預訓練MobileNetV2模型的神經網路架構。
  2. 模型的最後一層根據類別數量進行調整,使用softmax啟用函式進行多類別分類別。
  3. 模型使用Adam最佳化器和交叉熵損失函式進行編譯。

EON Tuner 自動機器學習工具

Edge Impulse的EON Tuner是一種自動機器學習工具,可以自動選擇和應用最佳的機器學習演算法,並調整模型引數以提高效能。

EON Tuner 組態步驟

  1. 在EON Tuner標籤下,設定以下引數:

    • 資料集類別:Vision
    • 目標裝置:Cortex-M7(或其他支援的平台)
    • 每個推論的時間(ms):100
  2. 點選「Start EON tuner」來啟動EON Tuner。

EON Tuner 自動化工作流程

@startuml
skinparam backgroundColor #FFFFFF
skinparam activityBackgroundColor #E3F2FD
skinparam activityBorderColor #1976D2
skinparam activityDiamondBackgroundColor #FFF9C4
skinparam activityDiamondBorderColor #F57C00

start
:開始 EON Tuner;
note right
  目標: 自動找出最佳模型配置
  適用於資源受限的邊緣裝置
end note

:設定 AutoML 參數;
note right
  必填參數:
  - 資料集類別 (Vision/Audio)
  - 目標裝置 (Cortex-M7/M4)
  - 推論時間限制 (ms)
  - RAM 限制 (KB)
  - Flash 限制 (KB)
end note

partition "模型搜索空間定義" {
  :定義候選架構列表;
  note right
    包含架構:
    - MobileNetV1 (各種 alpha 值)
    - MobileNetV2 (0.35/0.5/1.0)
    - EfficientNet-Lite
    - Custom CNN 架構
  end note

  :設定超參數範圍;
  note right
    搜索範圍:
    - Learning Rate: [0.0001, 0.001]
    - Batch Size: [8, 32, 64]
    - Dropout: [0.1, 0.3, 0.5]
    - Dense Layer 神經元: [8, 16, 32]
  end note
}

:啟動 EON Tuner 引擎;

repeat
  :選擇下一個候選配置;

  partition "模型訓練與評估" {
    :建構神經網路;
    :訓練模型 (20-50 epochs);
    :在驗證集上評估;

    :量化模型 (INT8);
    note right
      TensorFlow Lite 量化
      減少模型大小與推論時間
    end note

    :測試推論效能;
    note right
      測量指標:
      - 推論延遲 (ms)
      - 記憶體使用 (RAM/Flash)
      - 準確率
    end note
  }

  :計算綜合得分;
  note right
    得分公式:
    Score = Accuracy × w1
          - Latency × w2
          - Memory × w3

    權重根據使用者優先級調整
  end note

  :更新最佳模型記錄;

  if (達到時間限制?) then (是)
    :停止搜索;
    stop
  else (否)
    if (評估模型數 >= 50?) then (是)
      :停止搜索;
      stop
    else (否)
      :繼續下一輪;
    endif
  endif
repeat while (尚有候選配置?)

:生成評估報告;
note right
  報告內容:
  - 最佳模型架構
  - 超參數配置
  - 效能指標對比表
  - Pareto 前沿分析
end note

:提供模型選擇建議;

if (使用者接受建議?) then (是)
  :更新主要模型配置;
  :套用至 Impulse 設計;
  note right
    自動更新:
    - Neural Network 架構
    - 訓練超參數
    - 資料增強設定
  end note

  :觸發完整訓練;
else (否)
  :保留原有配置;
endif

:完成 EON Tuner 流程;
stop

@enduml

圖表翻譯: 此圖示詳細展示了 EON Tuner 自動機器學習(AutoML)的完整工作流程,透過系統化的模型搜索與評估機制,為資源受限的邊緣裝置找出最佳模型配置。流程開始時需設定目標裝置規格(如 Cortex-M7 處理器)及效能限制(推論時間、RAM、Flash 容量),接著定義模型搜索空間,包含多種輕量化架構(MobileNetV1/V2、EfficientNet-Lite)及超參數範圍(學習率、批次大小、Dropout 率)。啟動引擎後進入迭代循環,每輪選擇一個候選配置進行訓練與評估,訓練完成後執行 INT8 量化以減少模型大小,並在目標硬體上測試實際推論延遲與記憶體佔用。系統根據準確率、延遲與記憶體使用計算綜合得分,並動態更新最佳模型記錄。當達到時間限制或評估模型數超過 50 個時停止搜索,生成包含 Pareto 前沿分析的評估報告。使用者可選擇接受建議並自動更新 Impulse 設計中的神經網路架構與訓練參數,或保留原有配置。此流程大幅降低手動調參的複雜度,特別適合非機器學習專家快速開發高效能邊緣 AI 模型,在準確率與資源消耗之間取得最佳平衡。

在Edge Impulse中測試與佈署機器學習模型

在完成模型的訓練後,Edge Impulse提供了多種測試和驗證工具,以提高模型在實際應用中的準確性。本文將介紹如何使用Edge Impulse的測試工具,以及如何將訓練好的模型佈署到邊緣裝置上。

測試模型

Edge Impulse提供了多種型別的測試和驗證工具,包括「Live classification」和「Model testing」兩個標籤頁。

即時分類別(Live Classification)

在「Live classification」標籤頁中,您可以測試單個測試樣本,或連線裝置並即時記錄新的影像和測試樣本。然後,您可以檢視影像的提取特徵和分類別結果。

edge-impulse-daemon

使用上述CLI命令連線您的裝置(如Arduino Nano 33 BLE Sense)到您的專案,並記錄新的樣本。

模型測試(Model Testing)

在「Model testing」標籤頁中,您可以批次分類別您的測試資料集,並檢視模型的預測結果。您還可以設定置信度閾值,以確定模型的預測結果是否可信。

本地測試模型

您可以下載所有中間區塊結果和訓練好的模型資訊,以便在本地測試您的模型。導航到Edge Impulse專案的儀錶板,檢視可用的區塊輸出檔案。

佈署模型

完成模型的測試後,您需要將模型佈署到邊緣裝置上。Edge Impulse提供了多種佈署選項,包括建立函式庫、行動電話和電腦佈署等。

建立函式庫(Create Library)

Edge Impulse提供了許多預先寫好的程式碼範例,以便將佈署的模型整合到您的嵌入式應用程式韌體中。使用官方支援的開發板,可以快速佈署並減少開發時間。

// 示例C++程式碼
#include <edge_impulse_sdk.h>

// 初始化模型
void init_model() {
    // 載入模型
    ei_load_model();
}

// 執行推論
void run_inference() {
    // 取得輸入資料
    ei_get_input_data();

    // 執行推論
    ei_run_inference();

    // 取得輸出結果
    ei_get_output_data();
}

#### 內容解密:
C++程式碼範例展示瞭如何初始化Edge Impulse模型並執行推論。首先,載入預先訓練好的模型。接著,取得輸入資料並執行推論。最後,取得輸出結果。

### 自定義處理區塊

如果您在Edge Impulse Studio專案中使用了自定義的DSP區塊,則需要編寫該區塊的C++實作,並將其整合到Edge Impulse SDK程式碼中

### 行動電話和電腦佈署

您可以透過點選Edge Impulse的Computer」和「Mobile phone」佈署選項,將模型快速佈署到邊緣裝置上。這些佈署選項使用開放原始碼的行動客戶端韌體,構建WebAssembly函式庫,以便直接從手機或電腦的相機中分類別新的資料。