從上一節了解到,影像分類若要符合各行各業的需求,必須想辦法訓練自己的的資料模型,資料模型相當於 AI 背後的知識庫,若模型有欠缺,目前的 AI 是無法自行推理補足的。
所謂訓練自己的資料模型,以影像分類為例,是指自己去蒐集相關的圖片資料合輯(稱為 data set),人工加註標籤或分類,再使用機器學習(machine learning)軟體,萃取出資料的類型特徵,最後的產出就稱為AI的資料模型(data model)。
是否一定得自己訓練才能獲得資料模型呢?也未必,最近幾年機器學習的發展非常迅速,網路已有不少前人訓練好的模型開放出來,可以從 Model Zoo 或類似的網站下載。
不過還有個問題,網路上 AI 模型的檔案格式並不一致,Apple 目前使用的格式稱為 Core ML (副檔名為 .mlmodel,ml 是 machine learning 的縮寫),而網路上很多的是 Google 的 TensorFlow 或用於 Python 的 PyTorch 格式,模型下載後須轉換為 .mlmodel 才能使用。
Apple 官網已有一些轉換為 .mlmodel 格式的第三方模型,其中 MobileNetV2 是 Google 開放出來的影像分類模型,輕薄短小只有24.7MB,很適合手機使用,本節就利用這個來練習一下。
在 Swift Playgrounds 裡面如何使用 .mlmodel ?網路上似乎缺乏這種案例,經筆者一番嘗試終於成功,須經過兩個前置處理:(1) 下載模型 (2) 編譯模型,才能用於影像分類的工作請求。
我們先寫兩個函式進行前置處理,第一個「下載模型」使用檔案管理員(FileManager)物件,將下載的 .mlmodel 模型暫存到檔案裡面。
// 5-4b AI模型(with CoreML)
// Created by Heman, 2023/03/17
import Foundation
// 第6段
func 下載模型(_ 網址: String) async throws -> URL? {
if let myURL = URL(string: 網址) {
let 檔案名稱 = myURL.lastPathComponent
let 檔案管理員 = FileManager()
if let 目錄 = 檔案管理員.urls(
for: .cachesDirectory,
in: .userDomainMask).first {
let 存檔路徑 = 目錄.path + "/" + 檔案名稱
print("下載目標:\\(myURL)\\n存檔標的:\\(存檔路徑)")
if 檔案管理員.fileExists(atPath: 存檔路徑) {
print("檔案已下載過")
} else {
let (原始資料, 錯誤碼) = try await URLSession.shared.data(from: myURL)
print("下載成功:\\(原始資料)", 錯誤碼)
_ = 檔案管理員.createFile(atPath: 存檔路徑, contents: 原始資料)
}
let 回傳值 = 目錄.appendingPathComponent(檔案名稱)
print("回傳模型位址:\\(回傳值)")
return 回傳值
}
}
return nil
}
這個函式的輸入參數為模型網址,如:
https://ml-assets.apple.com/coreml/models/Image/ImageClassification/MobileNetV2/MobileNetV2.mlmodel
將此網址最後一部分(.lastPathComponent)抓出來指定為「檔案名稱」,此時檔案名稱為 “MobileNetV2.mlmodel”。
接下來取得檔案管理員(FileManager)物件,指定「目錄」為使用者的 .cacheDirectory,這是每個 App 的暫存目錄(App 關閉後一段時間會自動清除),用來存放模型檔案: