從上一節了解到,影像分類若要符合各行各業的需求,必須想辦法訓練自己的的資料模型,資料模型相當於 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,很適合手機使用,本節就利用這個來練習一下。

截圖 2023-03-18 上午10.44.09.png

在 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 關閉後一段時間會自動清除),用來存放模型檔案: