一. 概述
伴隨著人工智慧、機器學習與深度學習的火熱盛行,恩智浦 NXP 也開始著手部屬 AI 領域的相關應用。設計了一套相當完善的 機器學習開發環境 eIQ (edge intelligence) 專門應用於 i.MX8 系列。而所謂的 eIQ Toolkit 開發工具 就是 eIQ 的衍伸產物。主要是用來輔佐初學者或是 AI 工程師來做模組的開發,提供一整套完整的機器學習訓練方式以及模組轉換工具,所產出的模組能夠直接應用於 eIQ 的開發環境。
本文章將介紹 eIQ Toolkit 之中的 eIQ Portal 開發工具,主要是幫助開發者訓練或調用機器學習模型的一套相當完整的工具。如下圖所示,為系列博文之示意架構圖。此架構圖隸屬於 i.MX8M Plus 的方案博文中,並屬於 eIQ 機器學習開發環境 內的 應用層(Application Layer) – eIQ Toolkit 的子系列 !! 時不宜遲,趕快一起來看看 “eIQ Portal 快速使用介紹” 是如何輔助 AI 工程師進行開發。
若新讀者欲理解人工智慧、機器學習以及深度學習的差異,可點選查閱下方博文
大大通精彩博文 探討機器學習與深度學習之差異
eIQ Toolkit 系列博文-文章架構示意圖
二. eIQ Toolkit 介紹
eIQ Toolkit 是專門為機器學習所設計的一套開發工具。
由 NXP 與 Au-Zone Technologies 團隊共同開發,並搭配淺顯易懂的 GUI 介面,讓開發人員可以快速直覺地創建、優化、調試、訓練、導出、佈署模組等等一整個系列的機器學習開發流程,能讓初學者快速進入至機器學習的領域中,並有助於理解 物件分類(Object Classification) 與 物件偵測(Object Detection) 的訓練及開發流程。
eIQ Toolkit 可分為 eIQ Portal 與 eIQ Model Tool 兩大部分。
eIQ Portal : 提供一整套從載入資料庫、選擇最佳化目標、訓練、驗證與生成模組等機器學習佈署項目。
此部分屬於 Bring Your Own Data (BYOD) 的範疇,以 輸入資料/資料庫 為主。
eIQ Model Tool : 提供模組轉換的服務,如 Keras to TensorFlow Lite, ONNX to TensorFlow Lite 等等。
此部分屬於 Bring Your Own Model (BYOM) 的範疇,以 輸入模組(Model) 為主。
eIQ Command-line Tools : 亦可直接用下達指令方式來操作 eIQ Portal 與 eIQ Model Tool 的項目。
eIQ Toolkit 架構示意圖
Tip : 如何安裝 NXP eIQ Toolkit ?
進入官方網站 eIQ Toolkit for End-to-End Model Development and Deployment 的頁面點選下載。
點擊下載的 eIQ Toolkit v1.0.5 檔案,依序點選 Next 步驟即可。
三. eIQ Portal 介紹與應用方式
eIQ Portal 是一套相當整完整的機器學習開發工具。
如上圖所示,僅需要按照流程由 載入資料庫(Import dataset) 、 強化資料(Augment dataset) 、 選擇最佳化目標(Select and Optimize model for target) 、 訓練(Train Model)、 驗證(Validate model on target) 與 發佈模組(Deploy model to target) 等項目,即可 產生模組 !! 完成機器學習的開發 !!
此工具提供幾種 MobileNet 模型 (V1/V2/V3),可幫助開發者快速訓練物件偵測與物件分類等應用。並能夠發佈/輸出多種模組格式 DeepViewRT ( *.rtm )、TensorFlow Lite ( *.tflite )、ONNX ( *.onnx )、Keras ( *.h5 )
eIQ Portal 應用方式
步驟 1 : 開啟 eIQ Portal -> 點選 COMMAND LINE
步驟 2 : 開啟終端機,確認安裝 Tensorflow 1.5.0、Protobuf 和 NumPy 套件
(1) 進入 workspace 資料夾
$ cd workspace
(2) 安裝 tdqm 模組
$ python -m pip install tqdm
(3) 透過 CIFAR_uploader.py 下載 CIFAR-10 資料庫,並生成專案檔
$ python -m CIFAR_uploader
步驟 3 : 開啟專案 > workspace > cifar10.deepview
開啟後,將會看到由 CIFAR_uploader.py 所載入的資料庫資料。如下圖所示…
左側欄位,由標籤類別作分類並顯示每項類別的訓練、驗證數量、總數等資訊。
右側顯示窗 (較靠左的紅框標示 - 三個選項) ,可以額外加入資料集。分別為載入資料(IMPORT)、擷取攝像頭影像(CAPTURE)、或從遠端裝置擷取影像 (REMOTE)。
右側顯示窗 (較靠右的紅框標示),可以調整訓練與測試集的比例。
順帶一提,直接點選右側顯示視窗內的圖片,即可對該圖片進行重新標記的動作 ;
如下圖所示,點選任意處將會出現標註視窗,框選完成後即是該物體的位置資訊。接著重新選擇標籤類別資訊即可更新該影像的標籤、物件位置等訊息。
步驟 4 : 強化資料(Augment dataset)
點擊左下角的 AUGMENTATION TOOL 即可開始進行此步驟。
主要是以傳統影像處理方式來豐富資料集內的資料,也許能在得到更好的訓練結果。(可略)
如下圖所示,左側欄位可以選擇影像處理的方式,如將影像進行水平翻轉(Horizontal Flip)。
亦可點選 Set to default ,直接取用預設的設定。
步驟 5 : 選擇訓練目標(Model Selection)
點擊左下角的 SELECT MODEL 即開始設定模組相關資訊。
接著,選擇 物件分類(Object Classification) 與 物件偵測(Object Detection) 兩種訓練目標。
此範例請操作於 物件分類(Object Classification)
接著,選擇 性能(Performance) 、平衡(Balanced)、 精準(Accuracy) 三種模組最佳化目標。
此範例請操作於 平衡(Balanced)
接著,選擇 MCU 、 CPU 、 GPU 、 NPU 四種平台端。
此範例請操作於 神經網路加速器 NPU
順帶一提,亦可點選右下方的 BASE MODELS 選項來挑選基本模組。
有物件分類常用的 mobilenet v1 至 v3 的模型以及物件偵測 SSD mobilenet 的模型。
步驟 6 : 設置最佳化設定(Model Selection)
此步驟將須設定初始權重(Weight initialization)、輸入尺寸(Input Size)、學習率(Learning Rate)、批次數量(Batch Size)、批次次數(Epochs To Train)、最佳化方法(Optimizer) 等等。操作如下圖紅框內資訊。
步驟 7 : 開始訓練
設置好上圖的參數即可點選 START TRAINING 開始訓練。
此處能夠呈現此工具能夠即時調整參數的優勢。點選 CONTINUE TRAINING,即可延續上次的訓練結果再次訓練 !!
在右方顯示視窗,能自由切換判斷模組的兩大指標 準確度(Accuray) 與 損失函數(loss) 的結果。
同時,也能夠依照 第幾次訓練(Epochs) 來設定檢視的範圍。
步驟 8 : 驗證模組
按下左下角 VALIDATE 即開始驗證模型,將會於右側顯示視窗產生出 混淆矩陣(Confusion Matrix) 即可清楚地看出模組的正確性,綠色表示預測正確,紅色表示預測錯誤,顏色呈現即表示準確/錯誤率。
同時,每一個格子皆可點選查看是哪個環節出了問題。
步驟 9 : 佈署/輸出模型
按下 Export Settings 即選擇輸出模型格式,其格式有 DeepViewRT ( *.rtm )、TensorFlow Lite ( *.tflite )、ONNX ( *.onnx )、Keras ( *.h5 )
接著,就可以點選 EXPORT MODEL 即可輸出模組
因 NPU 的特性,需要將模組的權重量化為整數型態,如下圖所示。
步驟 10 : 實現應用
接著,將利用 TensorFlow Lite 與生成的模組作 物件分類(Object Classification) 的應用。
測試圖片 :
Python 代碼 :
import cv2
import time
import numpy as np
from tflite_runtime.interpreter import Interpreter
# 標籤資訊
class_names = ["airplane","automobile","bird","cat","deer","dog","frog","horse","ship","truck"]
# 解析模組(解譯器)
interpreter = Interpreter(model_path="classification-precision-npu.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
width = input_details[0]['shape'][2]
height = input_details[0]['shape'][1]
nChannel = input_details[0]['shape'][3]
# 載入與整理資料
frame = cv2.imread("airplane.jpg")
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame_resized = cv2.resize(frame_rgb, (width, height))
# 設置解譯器的輸入端
input_data = frame_resized.astype("uint8")
input_data = np.expand_dims(input_data, axis=0)
interpreter.set_tensor(input_details[0]['index'], input_data)
# 進行推理
interpreter.invoke()
# 再次進行推理(為了正確計算運算時間)
interpreter_time_start = time.time()
interpreter.invoke()
interpreter_time_end = time.time()
print(" Inference Time = ", (interpreter_time_end - interpreter_time_start)*1000 , " ms" )
# 取得解譯器的預測結果
prediction = interpreter.get_tensor(output_details[0]['index'])
prediction = np.squeeze(prediction)
index = np.squeeze(np.where(prediction==np.max(prediction)))
print("This image is " + class_names[index])
執行結果 :
如下圖所示,識別該物件為飛機(airplane),推理時間約 1.81 ms
四. 結語
經由上述的介紹,相信各位已經對 eIQ Portal 作用與目標有一定程度的了解,並已依照實作範例順利訓練完成模組了!! 故可以在後續的開發中,不仿試試藉由此工具來進行 物件分類(Object Classification) 或 物件偵測(Object Detection) 的開發,能夠幫助初學者更快速的上手機器學習的開發!!
五. 參考文件
[1] 官方網站 - eIQ™ Toolkit for End-to-End Model Development and Deployment
[2] 官方文件 - eIQ Toolkit User's Guide.pdf
如有任何相關 eIQ Toolkit 技術問題,歡迎至博文底下留言提問 !!
接下來還會分享更多 eIQ Toolkit 的技術文章 !!敬請期待 【ATU Book-i.MX8系列 – eIQ Toolkit】 !!
評論