Core ML 大大降低了开发者在苹果设备上使用机器学习技术预测模型的门槛和成本。苹果制定了自己的模型文件格式,统一的格式和全新的 API 设计使得 Core ML 支持苹果生态下多个平台。
performance primitives : Acccelerate and BNNS、Metal Performance Shaders。前者用于图形学以及数学上的大规模计算,后者用于优化加速图形渲染。
ML Framework: Core ML主要有两个职责:导入机器学习模型;生成对应的OC或Swift代码。
Domain Specific: Vision主要用于图片分析。NLP主要用于自然语义分析。
最上层是应用层,有了下面三层的基础,应用层就可以做很多事情,如人脸识别、手写文字理解、文字情感分析、自动翻译等。
Core ML应用创建过程
1、拿到模型模型导入到项目
最简单的获取方式是在苹果官网下载,具体是在Model模块中,该模块下有Places205-GoogLeNet、ResNet50、Inception V3、 VGG6等模型。当然也可以自己训练模型。另外苹果也提供了转换器(Core ML Tools),该转换器是基于Python实现的,可用它把训练出来的模型转为适配Core ML的模型。在文章的最后我会介绍如何使用Core ML Tools进行模型转换。
2、模型导入到项目
将模型导入到项目中。然后点击会出现下图所示状态。大小(Size)是 App 性能的一个重要指标,输入(Input)输出(Output)决定了如何使用这个模型。下图的输入是一张图片,输出有两个值,一个是最有可能的图片物体结果,为 String 类型;另一个是所有可能的物体类型以及对应的可能性,为 String 对应 Dobule 的 Dictionary 类型。
3、生成代码并编程
这个示例中我选择苹果官网提供的图像识别MobileNet作为模型。照片的选择主要是通过UIImagePickerController这个类实现。
demo地址:CoreMLClassifier
关键代码:
private func modelOutput() -> MobileNetOutput { guard let image = imageView.image else { fatalError("No image specified.") } let scaledImage = image.scaleImage(newSize: CGSize.init(width: 224.0, height: 224.0)) let buffer = scaledImage!.buffer()! guard let output = try? model.prediction(image: buffer) else { fatalError("Prediction process failed.") } return output }
private func diplayDesc() { let output = modelOutput() let probability = Int(output.classLabelProbs[output.classLabel]! * 100) descLabel.text = "I'm \(probability)% sure it's a \(output.classLabel)! " }