前言
Apple在 WWDC 2017的发布会上发布了机器学习框架Core ML.然后在后续的两年里,不断完善Core ML的框架,在今年的WWDC 2019里对Core ML框架进行了一次大的更新,将更新到3.0版本,即Core ML 3.0增加了包括Tensorflow等知名框架的支持,开发者不仅可以通过苹果开发的模型还可以使用第三方框架的机器学习模型来进行开发.Core ML 3.0还支持开发者自己开发和训练自己的学习模型,而且开发者还可以更新已有的学习模型来对学习模型进行更新改造.
可以说Core ML 3.0是苹果在机器学习上面的上的一个很大的台阶.
本文将会介绍开发者如何使用Core ML去做对图片相关识别的内容.
官方介绍
使用Core ML,开发者可以将机器学习模型集成到应用程序中.
模型是将机器学习算法来训练数据集合的结果.开发者可以使用模型根据新输入数据进行预测。例如,在给定卧室和浴室数量的情况下,对区域历史房价进行培训的模型可能能够预测房屋的价格。
卡发着可以使用Create ML训练模型.或者可以使用各种其他机器学习库,然后使用Core ML Tools将模型转换为Core ML格式.Core ML还允许您在设备上重新训练或微调现有模型,而且会保持用户数据的私密性和安全性.
Core ML是某些特定域的框架和功能的基础.Vision支持视觉图像分析,自然语言的自然语言处理,语音转换音频文本,SoundAnalysis用于识别音频声音.Core ML本身建立在低层面的原语之上,如Accelerate和BNNS,以及Metal Performance Shaders.

Core ML也为设备性能进行了优化,从而减少了内存占用和功耗.严格在设备上运行能够确保用户数据的隐私,并且能保证你的应用在没有网络连接时也能够工作和响应。
官方文档
WWDC介绍
机器学习模型下载
此外也可以到这个第三方仓库里面下载模型
代码示例--识别图片中的数字
准备工作
首先我们到Core ML Models下载MNIST模型并导入到工程中.

我们可以看到这边包含有模型的详细描述,模型名字、尺寸大小、作者以及证书等等.这里开发中要注意的点是Inputs以及Outputs.在我们给模型图片的时候,我们需要注意传递的参数,这里我们要传入的是尺寸为28*28的图片.如果传错了,将会影响到我们的输出值.
当我们点击Model Class栏目的箭头时,我们可以看到该模型的源码.

源码定义了具体的输入输出的相关代码,这里不展开研究.
我们需要注意的是prediction这个函数,通过给模型一个图片CVPixelBuffer数据,得到模型处理后的输出数据.
/**
Make a prediction using the convenience interface
- parameters:
- image: Image of the digit drawing to be classified as grayscale (kCVPixelFormatType_OneComponent8) image buffer, 28 pixels wide by 28 pixels high
- throws: an NSError object that describes the problem
- returns: the result of the prediction as MNISTClassifierOutput
*/
func prediction(image: CVPixelBuffer) throws -> MNISTClassifierOutput {
let input_ = MNISTClassifierInput(image: image)
return try self.prediction(input: input_)
}
关键代码
从相册取出图片
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else {
return
}
processMNIST(image)
picker.dismiss(animated: true, completion: nil)
}
对图片进行分析
func processMNIST(_ image: UIImage) {
imageView.image = image
// 获取图片Buff
guard let pixelBuffer = image.pixelBufferGray(width: 28, height: 28) else {
return
}
// 获取模型,进行分析
let model = MNISTClassifier()
do {
let output = try model.prediction(image: pixelBuffer)
classifier.text = "\(output.classLabel)"
}
catch {
}
}
结果展示
我们分析图片里是否包含0-9的数字,将最有可能包含的数字展示出来.

总结
机器学习经过几年的发展,已经越来越完善了,苹果在这方面也是不遗余力,Core ML 3.0是苹果机器学习领域的一次重大突破.这一次的进展也将会让更多的开发者投入到机器学习的热潮中,共同促进机器学习整个大生态的发展.
参考: