Core ML 第二弹: 将 Caffe 模型转换为 Core ML 格式

本文是一篇译文
原文地址: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 格式。

flower-recognition-app-demo.png
Note: 你需要 Xcode 9 来完成以下课程。你也需要一个运行 iOS 11的设备来测试此课程中的部分特性。最重要的是,所有的代码都是用 Swift 4 和 Python 2.7 编写。

开始之前

此课程的目的是为了帮助我们学习如何把多元化格式的数据模型转换为 Core ML 格式。但是在开始之前,我想要先介绍一些关于机器学习框架的背景知识。有许多热门的深度学习的框架,给开发者提供了设计,构建和训练他们自己模型的工具。我们将要用到的模型是CaffeCaffe 是由Bekerley Artificial Intelligence Research (BAIR)开发的,它是在创建机器学习模型中最常使用的框架。

除了Caffe,还有许多其他的框架,例如Keras,TensorFlow, 和SciKit-learn.所有的这些框架都有他们自身的优点和不足之处,你可以在这里查看他们的对比情况。

在机器学习当中,所有的事情都始于模型和那些用于识别和辨认的系统。教电脑学习需要一套机器学习的算法和它需要学习的预先训练的模型。有许多的机器学习模型它们用不同的算法处理着相同的事情(比如说:对象识别)。Neural NetworksTree EnsemblesSVMs就是其中一些算法。

作者提示:如果你对机器学习的模型感兴趣,你可以看一下这个这篇文章.

在发布的时候,Core ML 不支持所有这些不同框架的模型转换。下图由 Apple 提供,展示了 Core ML 支持的模型以及第三方工具。

model-supported-by-coreml-tool.png

我们转换数据模型为 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.prototxtclass_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 安装完成的时候,我们把它更新到最新版本。

install-python-terminal.png

接下来我们创建一个虚拟环境。在虚拟环境中,你可以使用不同版本的 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.prototxtclass_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,然后稍作休息。这个转换需要耗费一点时间,这个取决于你的电脑的计算能力。当转换完成,你将会看到一个>>>.

python-convert-ml.png

现在,这个 Caffe 模型已经被转换了,你需要保存一下,你可以输入下面的代码来保存:

coreml_model.save('Flowers.mlmodel')

这个.mlmodel的文件将会被保存到你当前的目录下。

coreml-model-ready.png

在 Xcode 中导入模型

现在我们来到最后一步了,就是把转换之后的模型加入我们的工程里面。如果你已经看了上一节课程这个部分你应该很熟悉了。打开我们的初始工程,根据你迄今为止所学的内容,挑战一下把 CoreML 模型加到你的工程当中。

我希望你可以完成这个任务或者至少尝试一下。如果你没有完成,不必担心,继续往下跟着我做就好了!

第一步,我们需要把Flowers.mlmodel拖拽到工程里面,确认你勾选了Target Membership.

xcode-target-coreml-model.png

接下来,我们打开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 模型的更多细节,你可以查阅以下资源:

关于这节课程你的想法是什么?如果你觉得它有用或者你有一些评论,请让我知道! 😘

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容