Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS MachineLearning 系列(22)——将其他三方模型转换成CoreML模型

iOS MachineLearning 系列(22)——将其他三方模型转换成CoreML模型

作者头像
珲少
发布于 2023-07-27 12:36:18
发布于 2023-07-27 12:36:18
84900
代码可运行
举报
文章被收录于专栏:一“技”之长一“技”之长
运行总次数:0
代码可运行

iOS MachineLearning 系列(22)——将其他三方模型转换成CoreML模型

本篇文章将是本系列文章的最后一篇。本专题将iOS中有关Machine Learning的相关内容做了整体梳理。下面是专题中的其他文章地址,希望如果你有需要,本专题可以帮助到你。

专题中,从iOS中Machine Learning相关的API开始介绍,后续扩展到如何使用模型进行预测,如何自定义的训练模型。其实CoreML框架只是Machine Learning领域内的一个框架而已,市面上还有许多流行的用来训练模型的框架。如TensorFlow,PyTorch,LibSVM等。在iOS平台中直接使用这些框架训练完成的模型是比较困难的,但是Core ML Tools提供了一些工具可以方便的将这些模型转换成CoreML模型进行使用,大大降低了模型的训练成本。

此工具官网:

https://coremltools.readme.io/docs

首先需要有安装Python运行环境,从Core ML Tools4.1版本开始将不再支持Python2,因此建议直接使用Python3。安装Python会默认安装pip工具,使用如下命令来安装Core ML Tools:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install coremltools

coremltools模块并不包含三方库(如TensorFlow),因此安装会比加快。

要使用三方的模型,需要做如下几步操作:

  1. 下载三方模型。
  2. 将三方模型转换为CoreML格式。
  3. 设置CoreML模型的元数据。
  4. 进行测试验证。
  5. 存储模型,之后在Xcode中进行使用即可。

其中最核心的是模型的转换和元数据的写入。

以TensorFlow的MobileNetV2模型为例,我们下面尝试将其转换成CoreML模型。要转换TensorFlow格式的模型,首先需要安装对应的框架,使用pip来安装如下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install tensorflow h5py pillow

第一步,下载三方模型,使用tensorflow框架提供的API可以将模型加载的到内存中去,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf 

keras_model = tf.keras.applications.MobileNetV2(
    weights="imagenet", 
    input_shape=(224, 224, 3,),
    classes=1000,
)

其中applications.MobileNetV2是tensorflow框架中提供好的API,在此文档中可以查看这个API的更多用法:

https://www.tensorflow.org/api_docs/python/tf/keras/applications/mobilenet_v2/MobileNetV2

同时我们还需要下载一个索引文件,此文件定义了模型所能预测的标签数据,Python代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import urllib
# 模型对应的索引文件地址
label_url = 'https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt'
class_labels = urllib.request.urlopen(label_url).read().splitlines()
class_labels = class_labels[1:]
assert len(class_labels) == 1000
for i, label in enumerate(class_labels):
  if isinstance(label, bytes):
    class_labels[i] = label.decode("utf8")

下面进行模型的转换,直接使用coremltools模块提供的API即可,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import coremltools as ct

# 定义输入
image_input = ct.ImageType(shape=(1, 224, 224, 3,),
                           bias=[-1,-1,-1], scale=1/127)

# 设置可预测的标签
classifier_config = ct.ClassifierConfig(class_labels)

# 进行模型转换
model = ct.convert(
    keras_model, 
    inputs=[image_input], 
    classifier_config=classifier_config,
)

这一步做完成,实际上已经完整了核心的转换部分,我们还需要为model实例追加一些元数据,你应该还记得,将CoreML模型引入Xcode工程后,可以在Xcode中看到模型的简介和使用方法等信息,这些信息就是通过追加元数据写入的。上面实例代码中,默认将其转换成neuralnetwork(神经网络)模式的模型,转换模型时我们也可以选择了添加conver_to参数为mlprogram,这表示将模型转换成CoreML程序模式的。

写入元数据实例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 写入元数据
model.input_description["input_1"] = "输入要分类的图片"
model.output_description["classLabel"] = "最可靠的结果"

# 模型作者
model.author = "TensorFlow转换"

# 许可
model.license = "Please see https://github.com/tensorflow/tensorflow for license information, and https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet for the original source of the model."

# 描述
model.short_description = "图片识别模型"

# 版本号
model.version = "1.0"

最后,就可以进行模型的导出了,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 存储模型
model.save("MobileNetV2.mlmodel")

需要注意,此时导出的模型格式,与前面转换成设置的模型类型有关,转换为mlprogram模式的模型需要导出mlpackage格式的,转换为neuralnetwork的模型需要导出为mlmodel格式的。

完整的Python文件代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf 
# 加载模型
keras_model = tf.keras.applications.MobileNetV2(
    weights="imagenet", 
    input_shape=(224, 224, 3,),
    classes=1000,
)


import urllib
# 模型对应的索引文件地址
label_url = 'https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt'
class_labels = urllib.request.urlopen(label_url).read().splitlines()
class_labels = class_labels[1:]
assert len(class_labels) == 1000
for i, label in enumerate(class_labels):
  if isinstance(label, bytes):
    class_labels[i] = label.decode("utf8")


import coremltools as ct

# 定义输入
image_input = ct.ImageType(shape=(1, 224, 224, 3,),
                           bias=[-1,-1,-1], scale=1/127)

# 设置可预测的标签
classifier_config = ct.ClassifierConfig(class_labels)

# 进行模型转换
model = ct.convert(
    keras_model, 
    inputs=[image_input], 
    classifier_config=classifier_config,
)

# 写入元数据
model.input_description["input_1"] = "输入要分类的图片"
model.output_description["classLabel"] = "最可靠的结果"

# 模型作者
model.author = "TensorFlow转换"

# 许可
model.license = "Please see https://github.com/tensorflow/tensorflow for license information, and https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet for the original source of the model."

# 描述
model.short_description = "图片识别模型"

# 版本号
model.version = "1.0"

# 存储模型
model.save("XMobileNetV2.mlmodel")

运行此Python脚本,如果没有报错,则会在当前脚本的同级目录下生成模型文件,下面我们可以将此模型文件引入到Xcode中,如下:

下面可以尝试下此模型的预测效果,如下:

可以看到,将三方模型转成成CoreML模型非常简单,同理对于PyTroch,LibSVM等模型也类似,安装对应的三方模块,读取模型后进行转换即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式之观察者模式及典型应用
微信公众号有服务号、订阅号和企业号之分。以我的公众号为例,我的公众号类型是订阅号,名称是 "小旋锋",专注于大数据,Java后端类技术分享。目前主要是分享学习笔记为主,尽量做到 "原创"、"高质量"、"成体系"。每当我发布一篇博文推送,订阅的用户都能够在我发布推送之后及时接收到推送,即可方便地在手机端进行阅读。
小旋锋
2019/01/21
1.1K0
设计模式---观察者模式
微信公众号有服务号、订阅号和企业号之分。当我们在公众号上发布一篇博文推送时,订阅的用户都能够在我发布推送之后及时接收到推送,即可方便地在手机端进行阅读。
大忽悠爱学习
2021/11/15
2720
观察者模式(Observer)
1. 问题场景 当一个对象的状态放生改变的时候,如何让依赖于它的所有对象得到通知,并进行相应的处理? 2. UML图 Subject:目标对象,通常具有以下功能 一个目标对象可以被多个观察者观察 目标
Java高级架构
2018/07/20
4870
五分钟学会观察者模式
观察者模式:多个观察者同时监听一个主题对象,当主题对象发生改变时,它的所有观察者都会收到通知。
Java识堂
2020/03/25
3930
五分钟学会观察者模式
设计模式-观察者模式
JDK中也有自带的观察者模式。但是被观察者是一个类而不是接口,限制了它的复用能力。
Anymarvel
2018/10/22
3630
设计模式-观察者模式
订阅发布模式到底是不是观察者模式?
快手前天发布了《看见》一时间好评如潮,盖过了之前的《后浪》。现如今搞内容创作都要开始玩价值观导向了。不过互联网真是一个神奇的东西,我们足不出户就可以看到你想看的东西。不管是时下火热的抖音、快手,还是微信公众号、知乎。你只需要关注订阅你喜欢的领域,你就可以获取你想要的内容,甚至和创作者进行互动。创作者只需要创作的内容发布到对应的平台上,用户只需要在对应的平台上订阅自己喜欢的领域或者作者就可以了。用户和创作者并不认识,但是他们却可以“看见”。从编程范式上来说这就是发布-订阅。
码农小胖哥
2020/06/11
1.3K0
订阅发布模式到底是不是观察者模式?
设计模式-观察者模式
自从有了微信公众号后,关注了某个公众号基本每天都有新的文章推送的通知,我们可以很方便的进行查阅,了解最新的资讯,什么老美放大水、什么中东又暴乱了,第一时间就知道了,而这里的关注和通知的行为其实有点类似观察者模式的观察者。用户关注公众号,公众号(被观察者)更新文章通知所有用户(观察者)。
逍遥壮士
2020/09/18
3850
CRUD很无聊?一起学设计模式吧!— 观察者模式
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
JAVA日知录
2019/10/19
6680
CRUD很无聊?一起学设计模式吧!— 观察者模式
JAVA 设计模式 观察者模式
本文介绍了观察者模式在JAVA中的实现方式,通过具体实例讲解了观察者模式在项目中的使用,以及观察者模式在实现项目中的具体应用。
静默虚空
2018/01/05
7310
JAVA 设计模式 观察者模式
Go 设计模式-观察者模式
观察者模式,也被称为发布订阅模式(Publish-Subscribe Design Pattern)
王小明_HIT
2021/07/27
3990
观察者模式的思考
观察者模式(Observer Pattern)是一种行为型设计模式,它的起源可以追溯到20世纪90年代初,由设计模式四人帮(Erich Gamma, Richard Helm, Ralph Johnson 和 John Vlissides)在其著作《设计模式:可复用面向对象软件的基础》中首次提出。观察者模式用于解决对象之间的一对多依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都会得到通知并自动更新。
不惑
2024/07/23
3810
观察者模式的思考
设计模式-观察者模式
模式定义 定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。主题(Subject)是被观察的对象,而其所有依赖者(Observer)称为观察者。 设计原则 为
武培轩
2018/04/18
8460
设计模式-观察者模式
设计模式之观察者模式:实现松耦合通信
在现实世界中,许多对象都不是独立存在的。其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。
程序视点
2023/09/13
2660
设计模式之观察者模式:实现松耦合通信
观察者模式
观察者模式需要如下几个对象构建出整个框架: 1抽象主题角色:提供了一个用于保存观察者对象的聚集类和增加删除观察者对象的方法,以及通知所有观察者的抽象方法 2具体主题:具体目标类,实现抽象主题的类 3抽象观察者:是一个抽象类接口,包含一个更新自己的抽象方法,更改通知时随时被调用 4具体观察者
gzq大数据
2022/05/11
4010
设计模式(十八):行为型之观察者模式
冬天vs不冷
2025/01/21
1130
设计模式(十八):行为型之观察者模式
java设计模式-观察者模式
模式定义 定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。主题(Subject)是被观察的对象,而其所有依赖者(Observer)称为观察者。 设计原则 为交
三哥
2018/06/15
6830
Head First 设计模式之观察者模式,你我都是发布者和订阅者
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
用户4361942
2019/05/24
8540
Java设计模式-观察者模式(订阅发布模式)
在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。
宁在春
2022/10/31
1.1K0
Java设计模式-观察者模式(订阅发布模式)
浅谈几种设计模式--观察者模式
1 定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
田维常
2019/07/16
4120
浅谈几种设计模式--观察者模式
观察者模式上篇
天气更新时候,调用天气对象的dataChange方法,得到数据后,然后将数据通过display()方法展示出来。
凯哥Java
2019/08/23
3950
观察者模式上篇
相关推荐
设计模式之观察者模式及典型应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验