返回

SwiftUI 100天:BetterRest · part4

IOS

每当你添加一个 .mlmodel 文件到 Xcode 的时候,它会自动地创建一个同名的 Swift 类,但是你看不到这个类,也不需要看到 —— 它是编译过程自动生成的。不过呢,这也意味着,如果你给模型文件起了一个古怪的名字,那么那个自动生成的类名字也会一样古怪。 在我们的案例,既然我们叫做 sleepClassifier.mlmodel ,Swift 会创建一个 SleepClassifier 类。

class SleepClassifier: MLModel {
    // 方法: classificationRequest(input: [String : Any]) -> MLClassificationRequest
}

当然,如果你想要自己调用模型的话,并不需要 MLModel 类,因为你通过 SleepClassifier 类就能直接访问模型。

func predict(input: [String : Any]) -> [String : Any]

输入是一个字典,包含着你想要预测的值,而输出也是一个字典,包含着预测的结果。

func classificationRequest(input: [String : Any]) -> SleepClassifier.ClassificationRequest

这个方法返回一个分类请求,你可以使用它来进行分类。

struct ClassificationRequest: MLRequest {
    let input: [String : Any]
    func parameters(for model: MLModel) -> [String : Any]?
    func predictions(for model: MLModel) -> [String : Any]?
}

classificationRequest(input:) 方法返回一个 ClassificationRequest 结构体,它包含了输入数据和用于进行分类的参数。 predictions(for:) 方法返回一个字典,包含着预测的结果。

当然,你也可以使用一个更为高级的方法来进行分类:

func classify(_ input: [String : Any]) -> ([String : Any], [String : Any])?

这个方法直接返回一个元组,包含着输入数据和预测的结果。

所以,如何使用这个模型呢?

import CoreML
import Vision

let model = try! SleepClassifier(contentsOf: modelURL)

// 得到图像中的像素缓冲区
guard let pixelBuffer = CVPixelBuffer(cgImage: image.cgImage!) else {
    fatalError("无法创建像素缓冲区")
}

let input = VNCoreMLModelPredictionRequest(model: model)

// 执行 Core ML 请求
let requestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
try! requestHandler.perform([input])

// 从请求中获取结果
guard let results = input.results as? [VNClassificationObservation] else {
    fatalError("没有获得结果")
}

这样就得到了结果。

好了,这就是如何使用 Core ML 模型进行分类。