十分钟使用苹果机器学习框架CoreML进行图片识别(Swift版)

2017年06月09日 由 Neo 发表 22709 0
前几天WWDC上,苹果发布了机器学习框架CoreML 。借助 Core ML,您可以将已训练好的机器学习模型,集成到自己的应用当中,根据文档,Core ML是基于Metal和Accelerate开发的,在性能效率上有很高的保证。

十分钟使用苹果机器学习框架CoreML进行图片识别(Swift版)

在 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
十分钟使用苹果机器学习框架CoreML进行图片识别(Swift版)

下载下来 Run 了一下,不得不说,Apple 对开发者还是非常友好的,直接将模型文件拖到项目中,Xcode 会自动生成接口文件:

十分钟使用苹果机器学习框架CoreML进行图片识别(Swift版)可以看到,主要是定义了输入,输出以及预测的格式,调用的时候,也非常简单,传参即可。

但是这些接口文件并没有在 XCode 左边的文件树中出现。

查了一下,是生成在 DerivedData 目录下,估计是想开发者使用起来更简洁。

运行一下,可以看到,主要功能是对价格进行预测。

好像稍微有点儿不那么高大上啊,官网提供的四个模型库,我们还没用呢,当然要看下能用来干啥,看了一下,貌似主要是物体识别,基于苹果提供的图像识别模型,本文将构建一个动物图像识别的Demo,项目要用到官网提供的图像模型库,下载地址:https://developer.apple.com/machine-learning/

二、配置完beta版开发完环境,下载完模型库Resnet50后开始coding,首先创建一个新的swift项目,将下载好的模型库拖进去:

十分钟使用苹果机器学习框架CoreML进行图片识别(Swift版)从描述里面能看出来,这是一个神经网络的分类器,输入是一张像素为 (224 * 224) 的图片,输出为分类结果。自动生成上述接口文件(Model Class)

OK,要照片,而且是 CVPixelBuffer 类型的。

但是每次从相册选太烦了,所以我们直接找了一张本地的图片,读取UIImage,然后改下大小,再转回 CVPixelBuffer

 

OK ,Run起来

十分钟使用苹果机器学习框架CoreML进行图片识别(Swift版)识别成 斑猫 虎斑猫,瞬间感觉高大上了啊

再来一个秋田犬试试…

十分钟使用苹果机器学习框架CoreML进行图片识别(Swift版)

北极犬、哈士奇……我笑出了声

 

总结一下,在大多数情况下,您只需要与模型动态生成的接口进行交互即可,也就是说当您将模型添加到 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

最后代码奉上…玩的开心
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消