深入浅出 Core ML

2024-05-26 09:18
文章标签 深入浅出 core ml

本文主要是介绍深入浅出 Core ML,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Machine Learning 基本介绍

机器学习是一门人工智能的科学。它通过对经验、数据进行分析,来改进现有的计算机算法,优化现有的程序性能。其基本流程如下图:
在这里插入图片描述

如图,机器学习有三个要素:

  1. 数据(Data)
  2. 学习算法(Learning Algorith)
  3. 模型(Model)

以图片分析 App 为例,这个场景下的数据、学习算法和模型分别对应:

  1. 数据:各种花的图片。这些数据称为此次机器学习的样本(Sample)。每张图片中包含的信息,比如形状、色彩,称之为特征(Feature)。每张图片对应的花朵,比如梅花、玫瑰,称之为标签(Label)。这些图片中蕴含着某些规律,而我们人类正是依靠这些规律判断出图片对应的花朵(标签)。现在我们希望机器能够把这个规律挖掘出来。这样在面对新的样本时,机器能根据其特征,准确判断其对应标签,也就是判断图片对应的花朵。
  2. 学习算法:机器学习的算法有很多,比如神经网络、逻辑回归、随机森林等等。作为 iOS 工程师我们无需深刻理解这些算法,只要知道输入数据后执行“学习算法”就可以得到模型。
  3. 模型:即机器从样本数据中挖掘出来的规律。有了模型之后,面对新的数据,模型就可以做出相应判断,例如下图图片是郁金香还是玫瑰。
    在这里插入图片描述

Core ML 到底是什么

Core ML 是苹果为其开发者准备的机器学习框架。支持 iOS, MacOS,tvOS,和 watchOS。它由4部分组成,其结构如下图:
在这里插入图片描述

  1. 最底层性能框架层:由 Acccelerate 和 Metal Performance Shaders 两个框架组成。前者用于图形学和数学上的大规模计算,后者用于优化与加速 GPU 和图形渲染。
  2. Core ML:支持导入机器学习的模型,并生成对应高级代码(Swift, Objective-C)的框架。
  3. 专用机器学习框架:基于 Core ML,针对特殊场景进行封装和优化的框架。如上图所示,Vision 框架和 NLP 框架都是 iOS 11 最新添加:前者用于图片分析,例如人脸识别;后者用于自然语义分析,例如上下文理解。 iOS 中的 GamePlayKit 框架也属于Core ML 对应的专用框架,用于决策树(Decision Tree)模型的学习。
  4. 应用层:使用了这些框架之后构建起来的 App。应用场景(如下图)十分广泛:人脸识别,手写文字理解,类型转化,文字情感分析,自动翻译,等等。
    在这里插入图片描述

Core ML 使用说明

主要操作过程分三步:

  1. 得到 Core ML 的模型
  2. 将模型导入项目中
  3. 用生成的 Swift 接口进行编程

下面我们来分别对这三个步骤进行详解:

得到 Core ML 的模型

在苹果官网上你可以直接拿到训练好的模型。目前有4个:
在这里插入图片描述

你也可以自己训练模型,或到第三方社区去下载别人训练好的模型。苹果提供了转换器(基于 Python,开源)用于把其它机器学习框架训练出来的模型转化
为 Core ML 适配的模型。如下图所示:
在这里插入图片描述

如何使用 Core ML Tools 进行转化的原理和演示详见《Core ML in Depth》文章。

将模型导入项目中

直接拖拽即可。记得右侧 Target Membership 选项勾选自己的 App。你可以点击 mlmodel 文件观看它的属性。大小(Size)是 App 性能的一个重要指标,输入(Input)输出(Output)决定了如何使用这个模型。下图中输入是花朵图片,为 image 类型。输出有两个值,一个是最有可能的花朵,为 String 类型;另一个是所有可能的花朵类型即其对应的可能性,为 String 对应 Dobule 的 Dictionary 类型。
在这里插入图片描述

用生成的 Swift 接口进行编程

生成的接口如下:

// 输入class FlowerClassifierInput {    // 花朵图片var flowerImage: CVPixelBuffer
}// 输出class FlowerClassifierOutput {    // 最有可能的花朵类型let flowerType: String// 所有可能的花朵类型即其对应的可能性let flowerTypeProbs: [String: Dobule]
}// 模型class FlowerClassifier {convenience init()    // 通过输入产生输出func prediction(flowerImage: CVPixelBuffer) throws -> FlowerClassifierOutput
}在实际代码中调用接口进行应用:// 调用 modellet flowerModel = FlowerClassifier()// 利用 flower model 对输入进行分析if let prediction = try? flowerModel.prediction(flowerImage: image) {    // 得到分析的结构return prediction.flowerType
}

Core ML 的支持和工具

现在 iOS 上可以运行的Core ML 的模型可以从苹果官网上下载,也可以通过第三方社区下载,Caffee,Keras,LIBSVM,scikit-learn,xgboot等开源机器学习框架训练出的模型皆可无缝转换为 Core ML 对应的模型。

同时,苹果开源并展示了如何使用它们自己的 Core ML 模型转换工具,它是用 Python 写成。你可以定制转换器和转换模型的参数。下面我们就来看看使用 Core ML 模型转换工具的步骤。

  • 安装 Core ML 工具

直接在终端中输入以下命令:

pip install -U coremltools

如果 Mac 上没有安装 Python,请先用命令行安装:

brew install python
  • 转换训练好的模型

假如你的模型是用 caffe 训练的,即现在有一个 .caffemodel 文件,以下步骤可以将其转化为苹果支持的 .mlmodel:

// 导入 core ml 工具库
import coremltools// 利用 core ml 中对应的 caffee 转化器处理 .caffemodel 模型
coreml_model = coremltools.converters.caffe.convert('XXX.caffemodel')// 将转化好的模型存储为 .mlmodel 文件
coreml_model.save('XXX.mlmodel')

确定转化好的模型能否工作(比如检测现有模型能否识别一张玫瑰图片),可以直接运行:

myTestData = Image.open('rose.jpg')XXX.mlmodel.predict('data': myTestData)

如果能正确输出结果(预测结果应含有 rose,其预测可能性较高),那么证明模型转换没有问题。

  • 定制化转化的模型

定制转化模型的参数,我们一般用 label.txt 文件来定义,直接传入转化中即可。

// 自定义模型的接口参数
labels = 'labels.txt'// 将 labels 设为转换的模型参数
coreml_model = coremltools.converters.caffe.convert('XXX.caffemodel', class_labels='labels')

定制转化的输入数据 data 为 image 类型:

coreml_model = coremltools.converters.caffe.convert('XXX.caffemodel', class_labels='labels', image_input_name = 'data')

指定转换模型的描述型参数(metadata):

// 指定作者信息
coreml_model.author = 'Apple Papa'// 指定许可证
coreml_model.license = 'MIT'// 指定输入('data')描述
coreml_model.input_description['data'] = 'An image of flower'

其他参数也类似设置。

目前苹果因为版权问题,对于 Google 的 TensorFlow 和 Amazon 的 MXNet 两大框架支持不够,但是这两个框架训练出来的模型转换成 iOS 上对应的 Core ML 模型难度并不大,除了用苹果自己的转换工具外,网上也有很多开源工具可以做到。
在这里插入图片描述

App 使用场景

  1. 文字情感分析

所谓文字情感分析,就是根据输入文字内容,机器自动判定文字表达的是正面还是负面情绪。苹果示例的 App 如下:
在这里插入图片描述

当什么文字都没有的时候,App 反应的是正常情感;当文字内容为开心或赞美时,App 会变为笑脸;当文字内容为伤心或抱怨时,App 会变为苦瓜脸。整个过程为即时反映,几乎无延迟。

整个 App 的原理可以分为下四步

  • 用自然语义处理API统计输入文字的单词频率
  • 将单词频率输入到 Core ML 的模型中
  • Core ML 模型根据单词频率判断内容为正面或负面情绪
  • 根据情绪内容更新 UI
  1. 实时物体识别

文字情感分析 App 使用的是自然语义处理(NLP)的框架,而实时物体识别使用的是视觉(Vision)框架,他们两是基于 Core ML 的最核心的两大系统框架。

所谓实时物体识别,是指 iPhone 可以自动识别出摄像头所对准的物品,如下图所示。
在这里插入图片描述

当镜头对准餐桌时,机器自动识别出餐桌,并给出相似概率。类似 Google IO 大会上展示的 Google Lens。其原理是将所捕捉到的物体传给 Core ML 的模型,让模型实时推测出物品并更新 UI。具体的原理和代码参见《初探 iOS 上的人工智能:Core ML》,这里不再赘述。

总结

借助 Core ML,苹果将复杂的学习算法和模型训练从机器学习中剥离出来,开发者无需理解其背后深奥的逻辑和计算,只需直接调用模型、在本地实时安全的运用即可。同时为了兼顾扩展性,苹果对其他第三方机器学习框架和模型提供了 Core ML 转换接口和工具。由于现在的 Core ML 支持模型太少,且转换流程自定义空间不大,所以使用场景和应用也比较简单局限。相信在未来苹果会加快完善 Core ML,使得其能够在 App 开发中大展拳脚。

这篇关于深入浅出 Core ML的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004054

相关文章

jupyter在加载pkl文件时报错ModuleNotFoundError: No module named 'pandas.core.internals.managers'; '的解决方法

笔者当看到这个错误的时候一脸懵逼,在pycharm上正常运行的code 放在jupyter就不成了,于是就研究一翻。 一开始以为自己的pkl文件有问题,研究重点放在这里,最后发现不是。 然后取搜索pycharm和jupyter下的python的\Lib\site-packages\pandas\core\internals有什么不同 发现jupyter下没有pandas\core\intern

C#/.NET/.NET Core推荐学习路线文档文章

前言 专门为C#/.NET/.NET Core推荐学习路线&文档&文章提供的一个Issues,各位小伙伴可以把自己觉得不错的学习路线、文档、文章相关地址分享出来🤞。 https://github.com/YSGStudyHards/DotNetGuide/issues/10 🏷️C#/.NET/.NET Core优质学习资料 📚.NET 入门教程 📚

ASP.NET Core 入门教学十七 GraphQL入门指南

GraphQL 是一种用于 API 的查询语言,允许客户端请求所需的数据,并能够合并多个资源到一个请求中。在 ASP.NET Core 中使用 GraphQL 可以提供更灵活、高效和实用的数据查询方式。以下是 ASP.NET Core 中 GraphQL 的入门指南: 1. 安装必要的 NuGet 包 首先,你需要安装以下 NuGet 包: GraphQLGraphQL.Server.Tra

【ML--05】第五课 如何做特征工程和特征选择

一、如何做特征工程? 1.排序特征:基于7W原始数据,对数值特征排序,得到1045维排序特征 2. 离散特征:将排序特征区间化(等值区间化、等量区间化),比如采用等量区间化为1-10,得到1045维离散特征 3. 计数特征:统计每一行中,离散特征1-10的个数,得到10维计数特征 4. 类别特征编码:将93维类别特征用one-hot编码 5. 交叉特征:特征之间两两融合,x+y、x-y、

【ML--04】第四课 logistic回归

1、什么是逻辑回归? 当要预测的y值不是连续的实数(连续变量),而是定性变量(离散变量),例如某个客户是否购买某件商品,这时线性回归模型不能直接作用,我们就需要用到logistic模型。 逻辑回归是一种分类的算法,它用给定的输入变量(X)来预测二元的结果(Y)(1/0,是/不是,真/假)。我们一般用虚拟变量来表示二元/类别结果。你可以把逻辑回归看成一种特殊的线性回归,只是因为最后的结果是类别变

【ML--13】聚类--层次聚类

一、基本概念 层次聚类不需要指定聚类的数目,首先它是将数据中的每个实例看作一个类,然后将最相似的两个类合并,该过程迭代计算只到剩下一个类为止,类由两个子类构成,每个子类又由更小的两个子类构成。 层次聚类方法对给定的数据集进行层次的分解,直到某种条件满足或者达到最大迭代次数。具体又可分为: 凝聚的层次聚类(AGNES算法):一种自底向上的策略,首先将每个对象作为一个簇,然后合并这些原子簇为越来

深入浅出SRS—RTMP实现

RTMP 直播是 SRS 最典型的使用场景,客户端使用 RTMP 协议向 SRS 推流,使用 RTMP 协议从 SRS 拉流,SRS 作为一个 RTMP 直播服务器实现媒体的转发。同时,RTMP 是 SRS 的中转协议,其他协议之间的互通需要先转为 RTMP,因此,理解 SRS RTMP 直播实现是理解其他协议实现的重要前提。本文主要分析 SRS RTMP 直播功能的实现原理,相关概念和配置请参考

【UE4源代码观察】观察Core模块

话题 Core模块是整个引擎中最核心的模块,在之前的博客【UE4源代码观察】可视化所有模块的依赖情况中有统计,它被983个模块引用,恐怕除了第三方的模块外基本所有模块都有引用。我想首先观察其中的内容,然后再做测试:将Core模块拷贝到之前【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程建立的空白工程中,看能否将它成功编译,理论上讲,“核心”不应再依赖太多其他的东西,所以我应该不会再需

Spark Core源码精读计划7 | Spark执行环境的初始化

推荐阅读 《Spark源码精度计划 | SparkConf》 《Spark Core源码精读计划 | SparkContext组件初始化》 《Spark Core源码精读计划3 | SparkContext辅助属性及后初始化》 《Spark Core源码精读计划4 | SparkContext提供的其他功能》 《Spark Core源码精读计划5 | 事件总线及ListenerBus》 《Spa

Spark Core源码精读计划3 | SparkContext辅助属性及后初始化

推荐阅读 《关于MQ面试的几件小事 | 消息队列的用途、优缺点、技术选型》         《关于MQ面试的几件小事 | 如何保证消息队列高可用和幂等》 《关于MQ面试的几件小事 | 如何保证消息不丢失》 《关于MQ面试的几件小事 | 如何保证消息按顺序执行》 《关于MQ面试的几件小事 | 消息积压在消息队列里怎么办》 《关于Redis的几件小事 | 使用目的与问题及线程模型》 《关于Red