Core ML 第二彈: 將 Caffe 模型轉(zhuǎn)換為 Core ML 格式

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

flower-recognition-app-demo.png
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 EnsemblesSVMs就是其中一些算法。

作者提示:如果你對機器學(xué)習(xí)的模型感興趣泣刹,你可以看一下這個這篇文章.

在發(fā)布的時候助析,Core ML 不支持所有這些不同框架的模型轉(zhuǎn)換。下圖由 Apple 提供椅您,展示了 Core ML 支持的模型以及第三方工具外冀。

model-supported-by-coreml-tool.png

我們轉(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.prototxtclass_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 安裝完成的時候裳凸,我們把它更新到最新版本贱鄙。

install-python-terminal.png

接下來我們創(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.prototxtclass_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)換完成,你將會看到一個>>>.

python-convert-ml.png

現(xiàn)在栖袋,這個 Caffe 模型已經(jīng)被轉(zhuǎn)換了拍顷,你需要保存一下,你可以輸入下面的代碼來保存:

coreml_model.save('Flowers.mlmodel')

這個.mlmodel的文件將會被保存到你當(dāng)前的目錄下塘幅。

coreml-model-ready.png

在 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.

xcode-target-coreml-model.png

接下來铃辖,我們打開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é)载慈,你可以查閱以下資源:

關(guān)于這節(jié)課程你的想法是什么惭等?如果你覺得它有用或者你有一些評論,請讓我知道办铡! ??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辞做,一起剝皮案震驚了整個濱河市琳要,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秤茅,老刑警劉巖稚补,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異框喳,居然都是意外死亡课幕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門五垮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乍惊,“玉大人,你說我怎么就攤上這事放仗∪笠铮” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵诞挨,是天一觀的道長莉撇。 經(jīng)常有香客問我,道長惶傻,這世上最難降的妖魔是什么棍郎? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮银室,結(jié)果婚禮上涂佃,老公的妹妹穿的比我還像新娘。我一直安慰自己蜈敢,他們只是感情好巡李,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扶认,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殊橙。 梳的紋絲不亂的頭發(fā)上辐宾,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音膨蛮,去河邊找鬼叠纹。 笑死,一個胖子當(dāng)著我的面吹牛敞葛,可吹牛的內(nèi)容都是我干的誉察。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惹谐,長吁一口氣:“原來是場噩夢啊……” “哼持偏!你這毒婦竟也來了驼卖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鸿秆,失蹤者是張志新(化名)和其女友劉穎酌畜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卿叽,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡桥胞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了考婴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贩虾。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沥阱,靈堂內(nèi)的尸體忽然破棺而出缎罢,到底是詐尸還是另有隱情,我是刑警寧澤喳钟,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布屁使,位于F島的核電站,受9級特大地震影響奔则,放射性物質(zhì)發(fā)生泄漏蛮寂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一易茬、第九天 我趴在偏房一處隱蔽的房頂上張望酬蹋。 院中可真熱鬧,春花似錦抽莱、人聲如沸范抓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匕垫。三九已至,卻和暖如春虐呻,著一層夾襖步出監(jiān)牢的瞬間象泵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工斟叼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留偶惠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓朗涩,卻偏偏與公主長得像忽孽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容