□編譯/張含陽
超簡單掌握CoreML 開發(fā)
□編譯/張含陽
CoreML是2017年蘋果WWDC發(fā)布的最令人興奮的功能之一。它可用于將機(jī)器學(xué)習(xí)整合到應(yīng)用程序中,并且全部脫機(jī)。
CoreML允許你將各種機(jī)器學(xué)習(xí)模型類型集成到你的應(yīng)用程序中。除了支持30多種類型廣泛的深度學(xué)習(xí)外,它還支持諸如樹集成、SVM(支持向量機(jī))和廣義線性模型之類的標(biāo)準(zhǔn)模型。由于它是建立在像Metal和Accelerate這樣的低級技術(shù)之上的,所以Core ML無縫利用CPU和GPU,以提供最高的性能和效率。你可以在設(shè)備上運(yùn)行機(jī)器學(xué)習(xí)模型,因此數(shù)據(jù)不需要離開要進(jìn)行分析的設(shè)備。
當(dāng)你想要深入了解預(yù)測如何發(fā)生,在哪兒發(fā)生時(shí),你就會發(fā)現(xiàn)CoreML的重要性。到目前為止,所有人都習(xí)慣于將機(jī)器學(xué)習(xí)整合到應(yīng)用程序中,預(yù)測過程則發(fā)生在托管服務(wù)器中。如果是對象識別應(yīng)用程序,則必須從設(shè)備中捕獲幀,將數(shù)據(jù)發(fā)送到預(yù)測引擎,然后等待圖像完全上傳到服務(wù)器,最后得到輸出。 這種方法主要有兩個(gè)問題——網(wǎng)絡(luò)延遲和用戶隱私?,F(xiàn)在,所有這些處理都可以簡單地發(fā)生在設(shè)備中,從而減少了這兩個(gè)問題。
在CoreML之前,架構(gòu)是這樣的:
我們可以嘗試使用CoreML,從而實(shí)現(xiàn)在一個(gè)簡單的設(shè)備上解決方案的設(shè)想。
我將重點(diǎn)介紹iOS以及Swift的基礎(chǔ)知識。首先我們要做的是獲得iOS 11設(shè)備和Xcode 9。如果你不熟悉機(jī)器學(xué)習(xí),可以先簡要了解一下機(jī)器學(xué)習(xí)的相關(guān)知識,以便進(jìn)一步探索該課題。
該技術(shù)使計(jì)算機(jī)能夠在沒有明確編碼問題解決方案的情況下學(xué)習(xí)。這里有兩個(gè)過程——訓(xùn)練和預(yù)測。訓(xùn)練是我們給模型不同的輸入集(和相應(yīng)的輸出)以便從模式中學(xué)習(xí)的過程。這個(gè)訓(xùn)練過的模型被饋送了一個(gè)之前沒有看到的輸入,然后從之前的觀察中預(yù)測出來。
所以我們要做的第一件事是為你的項(xiàng)目選擇一個(gè)很好的模型。有許多預(yù)訓(xùn)練的模型可用于圖像識別。或者你還可以訓(xùn)練自己的模型來獲得更好的體驗(yàn)。
Xcode模型查看器顯示的Inceptionv2.mlmodel
來自蘋果機(jī)器學(xué)習(xí)的CoreML有很多很好的模型(下載網(wǎng)址https://developer.apple.com/machine-learning/), 或者如果你有自己的模型,可以使用Apple提供的CoreML工具將其轉(zhuǎn)換為支持CoreML的模型(網(wǎng)址:https://pypi.python.org/pypi/coremltools)。我選擇了蘋果中提供的Inception V3庫。
Inception V3——從一組1000個(gè)類別(如樹木、動物、食物、車輛、人物等)中檢測出圖像中的目標(biāo)物體。
你可以使用帶有單視圖控制器的swift創(chuàng)建一個(gè)基本的iOS項(xiàng)目,包括視頻預(yù)覽圖層和標(biāo)簽。
我們可以像往常一樣獲取當(dāng)前幀,這是我們已經(jīng)知道的。這在這篇invasivecode的文章中有所解釋。
在提供輸入圖像時(shí),將我們的初始模型視為黑盒子,可以預(yù)測出其知道的一組類別中的一個(gè)概率。
從Apple的門戶下載模型,拖動它(Inceptionv3.mlmodel)到你的項(xiàng)目。你可以從Xcode中看到模型描述。
你可以看到該模型以299×299像素的圖像作為輸入,并給出輸出:
圖像最可能的類別;
每個(gè)類別的概率列表;
我們可以利用這些參數(shù)中的任何一個(gè)來確定類別。我使用的第一個(gè)是一個(gè)繩子,并直接打印在屏幕上。
你還可以看到,Xcode直接從mlmodel對象中創(chuàng)建一個(gè)swift模型(Inceptionv3.swift)。你不必為此做任何額外的更改。
我們可以利用Xcode生成預(yù)測API,如下所示:
預(yù)測則很簡單:
但它需要用CVPixelBuffer的對象而不是UIImage進(jìn)行預(yù)測,這是由hackingwithswift.com在“機(jī)器學(xué)習(xí)與遠(yuǎn)景”一節(jié)中精通這些的人介紹的,文章……(https://www.hackingwithswift.com/whats-new-inios-11)。
我已經(jīng)創(chuàng)建了UIImage類別,并將其與resize API一起進(jìn)行提取。
最后的架構(gòu)
該應(yīng)用程序能夠從幾乎所有提供的輸入中正確識別結(jié)果。
張含陽本刊編輯