本文是一篇译文
原文地址:A Beginner’s Guide to Core ML Tools: Converting a Caffe Model to Core ML Format
欢迎来到 Core ML 课程系列的第二部分。在这个课程中,你可以学会搭建一个 Python 的虚拟环境,获得一个不是 CoreML 格式的数据模型,并把它转换为 Core ML 格式,最后用到你自己的 app 里面。强烈建议你在学习这节课程之前,先看一下上一节课程的内容,对 Core ML 有一个初步了解。
在这个工程中,我们会创建一个花朵识别的 app,就像下面展示的一样。重点是告诉你怎么获得一个已经训练过的模型,并把它转换为 iOS app 开发可用的 Core ML 格式。
Note: 你需要 Xcode 9 来完成以下课程。你也需要一个运行 iOS 11的设备来测试此课程中的部分特性。最重要的是,所有的代码都是用 Swift 4 和 Python 2.7 编写。
开始之前
此课程的目的是为了帮助我们学习如何把多元化格式的数据模型转换为 Core ML 格式。但是在开始之前,我想要先介绍一些关于机器学习框架的背景知识。有许多热门的深度学习的框架,给开发者提供了设计,构建和训练他们自己模型的工具。我们将要用到的模型是Caffe
。Caffe 是由Bekerley Artificial Intelligence Research (BAIR)
开发的,它是在创建机器学习模型中最常使用的框架。
除了Caffe
,还有许多其他的框架,例如Keras,TensorFlow, 和SciKit-learn.所有的这些框架都有他们自身的优点和不足之处,你可以在这里查看他们的对比情况。
在机器学习当中,所有的事情都始于模型和那些用于识别和辨认的系统。教电脑学习需要一套机器学习的算法和它需要学习的预先训练的模型。有许多的机器学习模型它们用不同的算法处理着相同的事情(比如说:对象识别)。Neural Networks、Tree Ensembles和SVMs就是其中一些算法。
作者提示:如果你对机器学习的模型感兴趣,你可以看一下这个和 这篇文章.
在发布的时候,Core ML 不支持所有这些不同框架的模型转换。下图由 Apple 提供,展示了 Core ML 支持的模型以及第三方工具。
我们转换数据模型为 Core ML 格式,采用的是一个叫做Core ML Tools
的软件。在下一段我们将会使用 python 下载这些工具并把他们用到我们的转换中去。
安装 Python 并搭建环境
Lots of researchers and engineers have made Caffe models for different tasks with all kinds of architectures and data. These models are learned and applied for problems ranging from simple regression, to large-scale visual classification, to Siamese networks for image similarity, to speech and robotics applications.
- Caffe Model Zoo
在GitHub上你可以找到不同的已经训练好的模型。为了更高效的分享这些模型,BAIR 推出了model zoo framework.你可以在这里找到许多可用的模型。在这一课程中,我使用的这个Caffe 模型来告诉你怎么把它转换为 CoreML 格式,并实现花朵识别功能。
首先,下载一个初始工程,如果你打开工程并查看了代码,你会看到代码需要使用相机和相册的权限,并且已经做了相应处理。你可能会发现其实这个工程就是第一节课程里面的工程,唯一缺的就是 CoreML 模型。
你也需要关注一下工程中的这3个文件:oxford102.caffemodel
,deploy.prototxt
和class_labels.txt
,这就是在工程中需要用到的Caffe
模型和文件。具体内容会在后面详细说明。
使用 Core ML 的工具,第一步就是安装 Python 到你的 Mac 上。 首先,下载 Anaconda(选择 Python 2.7 版本)。Anaconda
是一种超级简单的方式去运行 python 而不引起任何问题。当你安装好了Anaconda
,打开终端并输入以下内容:
conda install python=2.7.13
conda update python
这两行代码,我们安装了我们想要的 Python 版本。在写这篇课程的时候,Python2 的最新版本是 Python 2.7.13. 所以当 Python 安装完成的时候,我们把它更新到最新版本。
接下来我们创建一个虚拟环境。在虚拟环境中,你可以使用不同版本的 Python 或者程序包来编写程序。创建一个虚拟环境,需要输入以下代码:
conda create --name flowerrec
终端会提示你:
proceed ([y]/n)?
输入y
表示 yes, 祝贺你!现在你有了一个叫做flowerrec
的虚拟环境。
最后,输入下面👇的命令来安装Core ML Tools
:
pip install -U coremltools
转换 Caffe 模型
再次打开终端,输入下面的代码,就会进入到你的虚拟环境中:
source activate flowerrec
然后进入到你的工程目录下,就是你的初始工程包含了这三个文件的目录:oxford102.caffemodel
,deploy.prototxt
和class_labels.txt
。
cd <directory>
当你进入到这个文件夹下,就可以开始 Python 编码了。简单的输入python
,然后你就可以在终端看到 Python 的接口。 事实上我们第一步要做的就是 引入 Core ML 工具。
import coremltools
接下来的一行代码非常非常的重要,所以请注意一下。输入下列代码暂时先不要 enter
coreml_model = coremltools.converters.caffe.convert(('oxford102.caffemodel', 'deploy.prototxt'), image_input_names='data', class_labels='class_labels.txt')
虽然这是一行不怎么长的代码,但是却做了很多事。让我们先解释下这3个文件。
- 1.
deploy.prototxt
- 描述神经网络的结构 - 2.
oxford102.caffemodel
- Caffe 格式的训练过的数据模型 - 3.
class_labels.txt
- 包含了这个模型所能识别的花朵的列表
在上面的声明中,我们定义了一个叫coreml_model
的模型来作为 Caffe 到 Core ML 经过coremltools.converters.caffe.convert
方法的转换结果。最后两个参数:
- 1.
image_input_names='data'
- 2.
class_labels='class_labels.txt'
这两个参数定义了我们希望的我们创建的 Core ML 模型所能接收的输入和输出。我来这样解释下:电脑只能懂数字,所以如果我们没有加这两个参数,我们的 Core ML 模型就只能接收数字作为输入和输出,而不是接收一个图片作为输入,将一个字符串作为输出。
现在,你可以按下Enter
,然后稍作休息。这个转换需要耗费一点时间,这个取决于你的电脑的计算能力。当转换完成,你将会看到一个>>>
.
现在,这个 Caffe 模型已经被转换了,你需要保存一下,你可以输入下面的代码来保存:
coreml_model.save('Flowers.mlmodel')
这个.mlmodel
的文件将会被保存到你当前的目录下。
在 Xcode 中导入模型
现在我们来到最后一步了,就是把转换之后的模型加入我们的工程里面。如果你已经看了上一节课程这个部分你应该很熟悉了。打开我们的初始工程,根据你迄今为止所学的内容,挑战一下把 CoreML 模型加到你的工程当中。
我希望你可以完成这个任务或者至少尝试一下。如果你没有完成,不必担心,继续往下跟着我做就好了!
第一步,我们需要把Flowers.mlmodel
拖拽到工程里面,确认你勾选了Target Membership
.
接下来,我们打开ViewController.swift
并定义下面的内容:
var model: Flowers!
override func viewWillAppear(_ animated: Bool) {
model = Flowers()
}
这两行代码,我们定义了我们的数据模型并在 View 将要显示之前初始化它。
然后,我们需要定义一个常量语言等于这个模型所预测的数据。在ViewController
的扩展中输入以下内容在imageView.image = newImage
之后。
guard let prediction = try? model.prediction(data: pixelBuffer!) else {
return
}
classifier.text = "I think this is a \(prediction.classLabel)."
以上就是所有内容了。编译并运行这个 app, 你会发现它和上一课程的图片识别功能一样。唯一不同的是他只能对花朵识别,并且我们获得了学会从 Caffe 模型转换为 Core ML 模型的满足感。
总结
现在你知道了怎么去转换一个数据模型,你可能会好奇你在哪里可以找到数据模型。当然你可以去 Google,你可以找到几乎各种类别的模型,比如:不同类型的车、植物、动物,甚至一个可以告诉你最喜欢的名人的模型。这里有几处你可以开始的位置:
当你找到了你需要的模型,你可能又会好奇你是否可以创建自己的数据模型。答案是肯定的,但是将会是非常困难的。如果你喜欢挑战,我将建议你从浏览Scikit-Learn
或者TensorFlow
的主页开始。
完整工程的代码地址GitHub
关于转换 Core ML 模型的更多细节,你可以查阅以下资源:
- Apple Developer’s Article on Conversion of Models
- Python Documentation on Core ML
- Coremltools Package Documentation
- Coremltools Package Documentation on Different Converters
关于这节课程你的想法是什么?如果你觉得它有用或者你有一些评论,请让我知道! 😘