十分钟使用苹果机器学习框架CoreML进行图片识别(Swift版)
2017年06月09日 由 Neo 发表
107081
0
前几天WWDC上,苹果发布了机器学习框架CoreML 。借助 Core ML,您可以将已训练好的机器学习模型,集成到自己的应用当中,根据文档,Core ML是基于Metal和Accelerate开发的,在性能效率上有很高的保证。
在 CoreML 中, Apple 定义了一套自己的模型格式,后缀名为: mlmodel,通过 CoreML 框架,以及模型库,可以在 App 层面进行机器学习的功能研发。
一、下载Xcode9.0beta、苹果官网提供的demo
使用Core ML需要最新的Xcode9.0beta,而最低版本OS需要10.12.4。
下载地址:
https://developer.apple.com/download/
以及苹果提供的官方项目:
https://docs-assets.developer.apple.com/published/51ff0c1668/IntegratingaCoreMLModelintoYourApp.zip
下载下来 Run 了一下,不得不说,Apple 对开发者还是非常友好的,直接将模型文件拖到项目中,Xcode 会自动生成接口文件:
可以看到,主要是定义了输入,输出以及预测的格式,调用的时候,也非常简单,传参即可。
但是这些接口文件并没有在 XCode 左边的文件树中出现。
查了一下,是生成在 DerivedData 目录下,估计是想开发者使用起来更简洁。
运行一下,可以看到,主要功能是对价格进行预测。
好像稍微有点儿不那么高大上啊,官网提供的四个模型库,我们还没用呢,当然要看下能用来干啥,看了一下,貌似主要是物体识别,基于苹果提供的图像识别模型,本文将构建一个动物图像识别的Demo,项目要用到官网提供的图像模型库,下载地址:
https://developer.apple.com/machine-learning/
二、配置完beta版开发完环境,下载完模型库Resnet50后开始coding,首先创建一个新的swift项目,将下载好的模型库拖进去:
从描述里面能看出来,这是一个神经网络的分类器,输入是一张像素为 (224 * 224) 的图片,输出为分类结果。自动生成上述接口文件(Model Class)
OK,要照片,而且是 CVPixelBuffer 类型的。
但是每次从相册选太烦了,所以我们直接找了一张本地的图片,读取UIImage,然后改下大小,再转回 CVPixelBuffer
OK ,Run起来
识别成 斑猫 虎斑猫,瞬间感觉高大上了啊
再来一个秋田犬试试…
北极犬、哈士奇……我笑出了声
总结一下,在大多数情况下,您只需要与模型动态生成的接口进行交互即可,也就是说当您将模型添加到 Xcode 项目当中的时候,这个接口就由 Xcode 自动创建完毕了。您可以直接使用 Core ML API,以便支持自定义工作流或者更为高级的用例。举个例子,如果您需要将输入数据异步收集到自定义结构体,从而来执行预测的话,那么您就可以让这个结构体实现
MLFeatureProvider 协议,从而来为模型提供输入功能。
如果您已经使用了第三方机器学习工具来创建和训练模型,只要这个工具是受支持的,那么就可以使用
Core ML Tools (
https://developer.apple.com/machine-learning)来将这些模型转换为 Core ML 模型格式。下方表格 列出了支持的模型和第三方工具。
注意
Core ML Tools 是一个 Python 包 (coremltools),并挂载在 Python Package Index (PyPI) 上。要了解关于 Python 包的更多信息,请参阅
Python Packaging User Guide。
模型类型 |
支持的模型 |
支持的工具 |
神经网络 (Neural network) |
前馈 (Feedforward)、卷积 (Convolutional)、循环 (Recurrent) |
Caffe / Keras 1.2.2 |
组合树 (Neural networks) |
随机森林 (Random Forests)、提升树 (Boosted Trees)、决策树 (Decision Trees) |
scikit-learn 0.18 / XGBoost 0.6 |
支持向量机 (Support vector machines) |
标量回归 (Scalar Regression)、
多级分类 (Multiclass classification) |
scikit-learn 0.18 / LIBSVM 3.2 |
广义线性模型 (Support vector machines) |
线性回归 (Linear Regression)、逻辑回归 (Logistic Regression) |
scikit-learn 0.18 |
特征工程 (Feature engineering) |
稀疏向量矢量化 (Sparse Vectorization)、稠密向量矢量化 (Dense Vectorization)、分类处理 (Categorical Processing) |
scikit-learn 0.18 |
管道模型 (Pipeline models) |
顺序链模型 (Sequentially Chained Models) |
scikit-learn 0.18 |
模型转换
您可以使用 Core ML 转换器,并根据对应的模型第三方工具,来对模型进行转换。通过调用转换器的 convert 方法,然后再将结果保存为 Core ML 模型格式 (.mlmodel)。
例如,如果您的模型是使用 Caffe 来创建的,您可以将 Caffe 模型 (.caffemodel) 传递给 coremltools.converters.caffe.convert 方法。
import coremltools
coreml_model = coremltools.converters.caffe.convert('my_caffe_model.caffemodel')
然后将结果保存为 Core ML 模型格式。
coreml_model.save('my_model.mlmodel')
根据您模型的不同,您可能会需要更新输入、输出以及相关的参数标签,或者您还可能会需要声明图片名称、类型以及格式。转换工具内置了更详细的文档,因为可用的选项因工具而异。
代码后期会改进成在真机上运行,用相机拍照,识别照片中的物体,后期将上传OC版以及苹果其他模型库demo的操作文章
https://pan.baidu.com/s/1hsacwfi
最后代码奉上…玩的开心