写点什么

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

作者:珲少
  • 2023-07-25
    上海
  • 本文字数:3269 字

    阅读完需:约 11 分钟

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


iOS MachineLearning 系列(1)—— 简介


iOS MachineLearning 系列(2)—— 静态图像分析之矩形识别


iOS MachineLearning 系列(3)—— 静态图像分析之区域识别


iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类


iOS MachineLearning 系列(5)—— 视频中的物体运动跟踪


iOS MachineLearning 系列(6)—— 视频中的物体轨迹分析


iOS MachineLearning 系列(7)—— 图片相似度分析


iOS MachineLearning 系列(8)—— 图片热区分析


iOS MachineLearning 系列(9)—— 人物蒙版图生成


iOS MachineLearning 系列(10)—— 自然语言分析之文本拆解


iOS MachineLearning 系列(11)—— 自然语言识别与文本分析


iOS MachineLearning 系列(12)—— 自然语言之词句相似性分析


iOS MachineLearning 系列(13)—— 语音与音频相关的 AI 能力


iOS MachineLearning 系列(14)—— 使用官方模型进行预测


iOS MachineLearning 系列(15)—— 可进行个性化更新的 CoreML 模型


iOS MachineLearning 系列(16)—— 几个常用的图片分类 CoreML 模型


iOS MachineLearning 系列(17)—— 几个常用的对象识别 CoreML 模型


iOS MachineLearning 系列(18)—— PoseNet,DeeplabV3 与 FCRN-DepthPrediction 模型


iOS MachineLearning 系列(19)—— 分析文本中的问题答案


iOS MachineLearning 系列(20)—— 训练生成 CoreML 模型


iOS MachineLearning 系列(21)——CoreML 模型的更多训练模板


专题中,从 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:


pip install coremltools
复制代码


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


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


  1. 下载三方模型。

  2. 将三方模型转换为 CoreML 格式。

  3. 设置 CoreML 模型的元数据。

  4. 进行测试验证。

  5. 存储模型,之后在 Xcode 中进行使用即可。


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


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


pip install tensorflow h5py pillow
复制代码


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


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 代码如下:


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) == 1000for i, label in enumerate(class_labels):  if isinstance(label, bytes):    class_labels[i] = label.decode("utf8")
复制代码


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


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 程序模式的。


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


# 写入元数据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("MobileNetV2.mlmodel")
复制代码


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


完整的 Python 文件代码如下:


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) == 1000for 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 等模型也类似,安装对应的三方模块,读取模型后进行转换即可。

发布于: 22 小时前阅读数: 17
用户头像

珲少

关注

还未添加个人签名 2022-07-26 加入

还未添加个人简介

评论

发布
暂无评论
iOS MachineLearning 系列(22)——将其他三方模型转换成CoreML模型_珲少_InfoQ写作社区