返回
SwiftUI 100天:BetterRest · part4
IOS
2023-11-07 14:22:52
每当你添加一个 .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 模型进行分类。