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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
npm ERR! ERESOLVE unable to resolve dependency tree的解决方法
在 package.json 文件中,存在一个叫做 peerDependencies(对等依赖关系)的对象,它包含了项目里需要的所有的包或用户正在下载的版本号相同的所有的包。
德顺
2022/09/20
3.1K0
package.json 配置完全解读
package.json 是前端每个项目都有的 json 文件,位于项目的根目录。许多脚手架在搭建项目时也会自动帮我们自动初始化好 package.json。
Leecason
2022/12/16
3K0
package.json 配置完全解读
大佬,第三方组件的Hooks为啥报错了?
http://localhost:8081/Users/项目目录/node_modules/组件库/node_modules/react/cjs/react.development.js
公众号@魔术师卡颂
2021/04/21
2.2K0
NPM 组件你应该知道的事
开发一个 npm 组件, 你是否了解需要对外导出什么格式的代码?如何让 npm 组件体积尽可能小?
lucifer210
2020/09/30
1.7K0
NPM 组件你应该知道的事
大家都能看得懂的源码(一)ahooks 整体架构篇
本文是深入浅出 ahooks 源码系列文章的第一篇,这个系列的目标主要有以下几点:
GopalFeng
2022/08/01
7740
大家都能看得懂的源码(一)ahooks 整体架构篇
从 UNMET PEER DEPENDENCY 中理解依赖版本管理
笔者之前在开发模块分析工具,使用npm list命令时遇到 UNMET PEER DEPENDENCY 这个问题,在探究解决方法的时候对npm的包管理机制有了很多新的认识,分享一下过程中的思考。 UNMET PEER DEPENDENCY 是什么 ? 你在使用npm list命令的时候,可能遇到过下面这种npm ERR: UNMET PEER DEPENDENCY ERR 当你去检查依赖的树状结果,你会发现每一行npm ERR都有对应一行这样的结果: UNMET PEER DEPENDENCY,翻译过来
用户1097444
2022/06/29
5.4K0
从 UNMET PEER DEPENDENCY 中理解依赖版本管理
pnpm技术体系之:打造企业级 pnpm 开源组件
pnpm 是 performant npm(高性能的 npm),它是一款快速的,节省磁盘空间的包管理工具,同时,它也较好地支持了 workspace 和 monorepos,简化开发者在多包组件开发下的复杂度和开发流程。
南山种子外卖跑手
2023/01/12
2.2K0
pnpm技术体系之:打造企业级 pnpm 开源组件
【CodeSandbox】:Sandpack Packager 解析
CodeSandbox 是一个在线的代码编辑器,主要聚焦于创建 Web 应用项目。
WEBJ2EE
2021/02/26
1.9K0
【CodeSandbox】:Sandpack Packager 解析
从零搭建基于react与ts的组件库(一)项目搭建与封装antd组件
为什么会有这样一篇文章?因为网上的教程/示例只说了怎么做,没有系统详细的介绍引入这些依赖、为什么要这样配置,甚至有些文章还是错的!迫于技术洁癖,我希望更多的开发小伙伴能够真正的理解一个项目搭建各个方面的细节,做到面对对于工程出现的错误能够做到有把握。
w4ngzhen
2023/10/17
1.2K0
从零搭建基于react与ts的组件库(一)项目搭建与封装antd组件
Vite + React + Typescript 构建实战
点击上方蓝字,发现更多精彩 导语 最近前端大火的 Vite 2.0 版本终于出来了,在这里分享一下使用 vite 构建一个前端单页应用以及踩过的坑,希望能带给大家一些收获。 文章首发于个人博客:heavenru.com 该文章主要面向对 Vite 感兴趣,或者做前端项目架构的同学 源码地址:fe-project-base https://github.com/lichenbuliren/fe-project-base 通过这篇文章,你能了解到以下几点: vscode 编辑器配置 git pre-commi
腾讯VTeam技术团队
2021/04/22
1.8K0
前端package.json文件详解
package.json 文件是 Node.js 项目的配置文件,用于描述项目的元数据和依赖关系。它是一个 JSON 格式的文件,位于项目根目录下。在这个文件中,你可以定义项目的名称、版本号、作者、许可证等项目信息,并且可以列出项目所需的依赖包和脚本。
jack.yang
2025/04/05
1820
[译] Node 模块中的 peer dependencies 是什么?
原文:https://flaviocopes.com/npm-peer-dependencies/
江米小枣
2020/06/15
2K0
npm 依赖管理中被忽略的那些细节
? 这是第 66 篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队 关注我们吧~ 本文首发于政采云前端团队博客:npm 依赖管理中被忽略的那些细节 https://www.zoo.te
政采云前端团队
2020/08/26
2.6K0
npm 依赖管理中被忽略的那些细节
React项目实战(React后台管理系统、TypeScript+React18)-环境准备(1)
这是一套Typescript+React+Antd的通用后台管理系统的视频,我会在这个视频里面带着大家徒手搭了一套基于react的后台管理系统基础设施,之所以叫通用,是因为不管以后做什么类型的管理系统,都可以直接拿这一套代码快速上手项目。
王小婷
2023/11/02
8280
React项目实战(React后台管理系统、TypeScript+React18)-环境准备(1)
package.json 知多少?
在 Node.js 中,模块是一个库或框架,也是一个 Node.js 项目。Node.js 项目遵循模块化的架构,当我们创建了一个 Node.js 项目,意味着创建了一个模块,这个模块必须有一个描述文件,即 package.json。它是我们最常见的配置文件,但是它里面的配置你真的有详细了解过吗?配置一个合理的 package.json 文件直接决定着我们项目的质量,本章就带大家了解下 package.json 的各项详细配置。
ConardLi
2019/12/02
1.9K0
你真的了解package.json吗?
然后,在写这系列文章时,发现有些操作需要用到package.json中的属性。然后,有些属性看起来人畜无害,但是用起来却需要查很多的资料。所以,就想着。写一篇或者两篇关于package.json的文章。
前端柒八九
2024/02/17
3140
你真的了解package.json吗?
你真的了解package.json吗?
大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder。
用户6256742
2024/05/18
1880
你真的了解package.json吗?
关于前端大管家package.json,你知道多少
今天来看看前端的大管家 package.json 文件相关的配置,充分了解这些配置有助于我们提高开发的效率,规范我们的项目。文章内容较多,建议先收藏在学习!
程序员法医
2022/08/11
1.6K0
关于前端大管家package.json,你知道多少
React:不要动,否则你会被炒鱿鱼
不知道大家在用React开发时,有没有注意到react与react-dom这两个包中有个很奇葩的属性__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:
公众号@魔术师卡颂
2022/11/22
9210
React:不要动,否则你会被炒鱿鱼
关于npm 包更新工具npm-check-updates 使用详解
首先说一下包版本的控制 假设 package.json 的包版本如下 "dependencies": { "vue": "^2.5.0", "vuex": "~3.1.0", "vue-router": "3.5.3", "react": "15.4.x", "typescript": "3.x.x", "react-dom": "*.*.*", "react-draggable": "x.x", "classnames": "x", "pinia": "*" } 执行
用户10106350
2022/10/28
1.4K0
关于npm 包更新工具npm-check-updates 使用详解
推荐阅读
相关推荐
npm ERR! ERESOLVE unable to resolve dependency tree的解决方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验