本文是一篇譯文
原文地址:A Beginner’s Guide to Core ML Tools: Converting a Caffe Model to Core ML Format
歡迎來到 Core ML 課程系列的第二部分媒至。在這個課程中杂拨,你可以學(xué)會搭建一個 Python 的虛擬環(huán)境藕咏,獲得一個不是 CoreML 格式的數(shù)據(jù)模型,并把它轉(zhuǎn)換為 Core ML 格式谊惭,最后用到你自己的 app 里面。強烈建議你在學(xué)習(xí)這節(jié)課程之前,先看一下上一節(jié)課程的內(nèi)容哈误,對 Core ML 有一個初步了解暖眼。
在這個工程中惕耕,我們會創(chuàng)建一個花朵識別的 app,就像下面展示的一樣。重點是告訴你怎么獲得一個已經(jīng)訓(xùn)練過的模型诫肠,并把它轉(zhuǎn)換為 iOS app 開發(fā)可用的 Core ML 格式司澎。
Note: 你需要 Xcode 9 來完成以下課程。你也需要一個運行 iOS 11的設(shè)備來測試此課程中的部分特性栋豫。最重要的是挤安,所有的代碼都是用 Swift 4 和 Python 2.7 編寫。
開始之前
此課程的目的是為了幫助我們學(xué)習(xí)如何把多元化格式的數(shù)據(jù)模型轉(zhuǎn)換為 Core ML 格式丧鸯。但是在開始之前蛤铜,我想要先介紹一些關(guān)于機器學(xué)習(xí)框架的背景知識。有許多熱門的深度學(xué)習(xí)的框架丛肢,給開發(fā)者提供了設(shè)計围肥,構(gòu)建和訓(xùn)練他們自己模型的工具。我們將要用到的模型是Caffe
蜂怎。Caffe 是由Bekerley Artificial Intelligence Research (BAIR)
開發(fā)的穆刻,它是在創(chuàng)建機器學(xué)習(xí)模型中最常使用的框架。
除了Caffe
杠步,還有許多其他的框架氢伟,例如Keras,TensorFlow, 和SciKit-learn.所有的這些框架都有他們自身的優(yōu)點和不足之處榜轿,你可以在這里查看他們的對比情況。
在機器學(xué)習(xí)當(dāng)中腐芍,所有的事情都始于模型和那些用于識別和辨認(rèn)的系統(tǒng)差导。教電腦學(xué)習(xí)需要一套機器學(xué)習(xí)的算法和它需要學(xué)習(xí)的預(yù)先訓(xùn)練的模型。有許多的機器學(xué)習(xí)模型它們用不同的算法處理著相同的事情(比如說:對象識別)猪勇。Neural Networks设褐、Tree Ensembles和SVMs就是其中一些算法。
作者提示:如果你對機器學(xué)習(xí)的模型感興趣泣刹,你可以看一下這個和 這篇文章.
在發(fā)布的時候助析,Core ML 不支持所有這些不同框架的模型轉(zhuǎn)換。下圖由 Apple 提供椅您,展示了 Core ML 支持的模型以及第三方工具外冀。
我們轉(zhuǎn)換數(shù)據(jù)模型為 Core ML 格式,采用的是一個叫做Core ML Tools
的軟件掀泳。在下一段我們將會使用 python 下載這些工具并把他們用到我們的轉(zhuǎn)換中去雪隧。
安裝 Python 并搭建環(huán)境
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上你可以找到不同的已經(jīng)訓(xùn)練好的模型。為了更高效的分享這些模型员舵,BAIR 推出了model zoo framework.你可以在這里找到許多可用的模型脑沿。在這一課程中,我使用的這個Caffe 模型來告訴你怎么把它轉(zhuǎn)換為 CoreML 格式马僻,并實現(xiàn)花朵識別功能庄拇。
首先,下載一個初始工程,如果你打開工程并查看了代碼韭邓,你會看到代碼需要使用相機和相冊的權(quán)限措近,并且已經(jīng)做了相應(yīng)處理。你可能會發(fā)現(xiàn)其實這個工程就是第一節(jié)課程里面的工程女淑,唯一缺的就是 CoreML 模型瞭郑。
你也需要關(guān)注一下工程中的這3個文件:oxford102.caffemodel
,deploy.prototxt
和class_labels.txt
,這就是在工程中需要用到的Caffe
模型和文件诗力。具體內(nèi)容會在后面詳細說明凰浮。
使用 Core ML 的工具,第一步就是安裝 Python 到你的 Mac 上苇本。 首先袜茧,下載 Anaconda(選擇 Python 2.7 版本)。Anaconda
是一種超級簡單的方式去運行 python 而不引起任何問題瓣窄。當(dāng)你安裝好了Anaconda
,打開終端并輸入以下內(nèi)容:
conda install python=2.7.13
conda update python
這兩行代碼笛厦,我們安裝了我們想要的 Python 版本。在寫這篇課程的時候俺夕,Python2 的最新版本是 Python 2.7.13. 所以當(dāng) Python 安裝完成的時候裳凸,我們把它更新到最新版本贱鄙。
接下來我們創(chuàng)建一個虛擬環(huán)境。在虛擬環(huán)境中姨谷,你可以使用不同版本的 Python 或者程序包來編寫程序逗宁。創(chuàng)建一個虛擬環(huán)境,需要輸入以下代碼:
conda create --name flowerrec
終端會提示你:
proceed ([y]/n)?
輸入y
表示 yes, 祝賀你梦湘!現(xiàn)在你有了一個叫做flowerrec
的虛擬環(huán)境瞎颗。
最后,輸入下面??的命令來安裝Core ML Tools
:
pip install -U coremltools
轉(zhuǎn)換 Caffe 模型
再次打開終端捌议,輸入下面的代碼哼拔,就會進入到你的虛擬環(huán)境中:
source activate flowerrec
然后進入到你的工程目錄下,就是你的初始工程包含了這三個文件的目錄:oxford102.caffemodel
,deploy.prototxt
和class_labels.txt
瓣颅。
cd <directory>
當(dāng)你進入到這個文件夾下倦逐,就可以開始 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
- 描述神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu) - 2.
oxford102.caffemodel
- Caffe 格式的訓(xùn)練過的數(shù)據(jù)模型 - 3.
class_labels.txt
- 包含了這個模型所能識別的花朵的列表
在上面的聲明中,我們定義了一個叫coreml_model
的模型來作為 Caffe 到 Core ML 經(jīng)過coremltools.converters.caffe.convert
方法的轉(zhuǎn)換結(jié)果虐秦。最后兩個參數(shù):
- 1.
image_input_names='data'
- 2.
class_labels='class_labels.txt'
這兩個參數(shù)定義了我們希望的我們創(chuàng)建的 Core ML 模型所能接收的輸入和輸出平酿。我來這樣解釋下:電腦只能懂?dāng)?shù)字,所以如果我們沒有加這兩個參數(shù)悦陋,我們的 Core ML 模型就只能接收數(shù)字作為輸入和輸出蜈彼,而不是接收一個圖片作為輸入,將一個字符串作為輸出俺驶。
現(xiàn)在幸逆,你可以按下Enter
,然后稍作休息。這個轉(zhuǎn)換需要耗費一點時間暮现,這個取決于你的電腦的計算能力还绘。當(dāng)轉(zhuǎn)換完成,你將會看到一個>>>
.
現(xiàn)在栖袋,這個 Caffe 模型已經(jīng)被轉(zhuǎn)換了拍顷,你需要保存一下,你可以輸入下面的代碼來保存:
coreml_model.save('Flowers.mlmodel')
這個.mlmodel
的文件將會被保存到你當(dāng)前的目錄下塘幅。
在 Xcode 中導(dǎo)入模型
現(xiàn)在我們來到最后一步了昔案,就是把轉(zhuǎn)換之后的模型加入我們的工程里面尿贫。如果你已經(jīng)看了上一節(jié)課程這個部分你應(yīng)該很熟悉了。打開我們的初始工程踏揣,根據(jù)你迄今為止所學(xué)的內(nèi)容庆亡,挑戰(zhàn)一下把 CoreML 模型加到你的工程當(dāng)中。
我希望你可以完成這個任務(wù)或者至少嘗試一下捞稿。如果你沒有完成又谋,不必?fù)?dān)心,繼續(xù)往下跟著我做就好了括享!
第一步搂根,我們需要把Flowers.mlmodel
拖拽到工程里面,確認(rèn)你勾選了Target Membership
.
接下來铃辖,我們打開ViewController.swift
并定義下面的內(nèi)容:
var model: Flowers!
override func viewWillAppear(_ animated: Bool) {
model = Flowers()
}
這兩行代碼剩愧,我們定義了我們的數(shù)據(jù)模型并在 View 將要顯示之前初始化它。
然后娇斩,我們需要定義一個常量語言等于這個模型所預(yù)測的數(shù)據(jù)仁卷。在ViewController
的擴展中輸入以下內(nèi)容在imageView.image = newImage
之后。
guard let prediction = try? model.prediction(data: pixelBuffer!) else {
return
}
classifier.text = "I think this is a \(prediction.classLabel)."
以上就是所有內(nèi)容了犬第。編譯并運行這個 app, 你會發(fā)現(xiàn)它和上一課程的圖片識別功能一樣锦积。唯一不同的是他只能對花朵識別,并且我們獲得了學(xué)會從 Caffe 模型轉(zhuǎn)換為 Core ML 模型的滿足感歉嗓。
總結(jié)
現(xiàn)在你知道了怎么去轉(zhuǎn)換一個數(shù)據(jù)模型丰介,你可能會好奇你在哪里可以找到數(shù)據(jù)模型。當(dāng)然你可以去 Google鉴分,你可以找到幾乎各種類別的模型哮幢,比如:不同類型的車、植物志珍、動物橙垢,甚至一個可以告訴你最喜歡的名人的模型。這里有幾處你可以開始的位置:
當(dāng)你找到了你需要的模型伦糯,你可能又會好奇你是否可以創(chuàng)建自己的數(shù)據(jù)模型柜某。答案是肯定的,但是將會是非常困難的敛纲。如果你喜歡挑戰(zhàn)喂击,我將建議你從瀏覽Scikit-Learn
或者TensorFlow
的主頁開始。
完整工程的代碼地址GitHub
關(guān)于轉(zhuǎn)換 Core ML 模型的更多細節(jié)载慈,你可以查閱以下資源:
- Apple Developer’s Article on Conversion of Models
- Python Documentation on Core ML
- Coremltools Package Documentation
- Coremltools Package Documentation on Different Converters
關(guān)于這節(jié)課程你的想法是什么惭等?如果你覺得它有用或者你有一些評論,請讓我知道办铡! ??