當前位置:
首頁 > 科技 > 如何用CoreML和Swift在蘋果上開發「實時對象識別器」

如何用CoreML和Swift在蘋果上開發「實時對象識別器」

GIF/1.7M

原文來源:medium

作者:Lazim Mohammed

「機器人圈」編譯:BaymaxZ

CoreML是2017年蘋果WWDC發布的最令人興奮的功能之一。它可用於將機器學習整合到應用程序中,並且全部離線。

以下是來自蘋果的官方機器學習文檔:(https://developer.apple.com/machine-learning)

CoreML允許你將各種機器學習模型類型集成到你的應用程序中。除了支持30多種類型的廣泛的深度學習外,它還支持諸如樹集成、SVM(支持向量機)和廣義線性模型之類的標準模型。由於它是建立在像Metal和Accelerate這樣的低級技術之上的,所以Core ML無縫利用CPU和GPU,以提供最高的性能和效率。你可以在設備上運行機器學習模型,因此數據不需要離開要進行分析的設備。

當深入了解預測如何發生,在哪兒發生,你就會發現CoreML的重要性。到目前為止,所有人都習慣於將機器學習整合到應用程序中,預測過程則發生在託管伺服器中。如果是對象識別應用程序,則必須從設備中捕獲幀,將數據發送到預測引擎,等待圖像完全上傳到伺服器,最後得到輸出。 這種方法主要有兩個問題——網路延遲和用戶隱私。現在,所有這些處理都可以簡單地發生在設備中,從而減少了這兩個問題。

在coreML之前,架構是這樣的

從零開始

我們可以嘗試使用CoreML,並為此實現一個簡單的設備上解決方案。

我將重點介紹iOS或Swift的基礎知識。首先我們要做的是獲得iOS 11設備和Xcode 9。如果你不熟悉機器學習,請在這裡看一下簡單介紹,或者你可以從這裡獲得高級別概述。

機器學習

該技術使計算機能夠在沒有明確編碼問題解決方案的情況下學習。這裡有兩個過程——訓練和預測。訓練是我們給模型不同的輸入集(和相應的輸出)以便從模式中學習的過程。這個訓練過的模型被傳送了一個從之前沒有看到的輸入,從之前的觀察中預測出來。

選擇模型

所以我們要做的第一件事是為你的項目選擇一個很好的模型。有許多預訓練的模型可用於圖像識別。或者你甚至可以訓練自己的模型來獲得更好的體驗。

來自蘋果機器學習的CoreML有很多很好的模型(下載網址https://developer.apple.com/machine-learning/), 或者如果你有自己的模型,可以使用Apple提供的CoreML工具將其轉換為支持CoreML的模型(網址:https://pypi.python.org/pypi/coremltools)。我選擇了蘋果中提供的Inception V3庫。

Inception v3——從一組1000個類別(如樹木、動物、食物、車輛、人物等)中檢測出圖像中的主要物體。

創建iOS項目

你可以使用帶有單視圖控制器的swift創建一個基本的iOS項目,包括視頻預覽圖層和標籤。

從視頻預覽中獲取幀

獲取當前幀照例是一樣的,我們已經知道了。這在這篇invasivecode的文章中有所解釋。

使用Inception V3進行預測

在提供輸入圖像時,將我們的初始模型視為黑盒子,可以將你作為其知道的一組類別中的一個概率。

從Apple的門戶下載模型,拖動它(Inceptionv3.mlmodel)到你的項目。你可以從Xcode中看到模型描述。

Xcode模型查看器顯示的Inceptionv2.mlmodel

你可以看到該模型以299x299像素的圖像作為輸入,並給出輸出:

圖像最可能的類別

每個類別的概率列表

我們可以利用任何這些參數來確定類別。我使用的第一個是一個繩子,並直接列印在屏幕上。

你還可以看到,Xcode直接從mlmodel對象創建一個swift模型(Inceptionv3.swift)。你不必為此做任何額外的更改。

用法

我們可以利用Xcode生成的預測API,如下所示:

/**

Make a prediction using the convenience interface

- parameters:

- image: Input image to be classified as RGB image buffer, 299 pixels wide by 299 pixels high

- throws: an NSError object that describes the problem

- returns: the result of the prediction as Inceptionv3Output

*/

func prediction(image: CVPixelBuffer) throws -> Inceptionv3Output {

let input_ = Inceptionv3Input(image: image)

return try self.prediction(input: input_)

}

/// Model Prediction Output Type

class Inceptionv3Output : MLFeatureProvider {

/// Probability of each category as dictionary of strings to doubles

let classLabelProbs: [String : Double]

/// Most likely image category as string value

let classLabel: String

// Class has other APIs and properties.

// ...

}

預測則很簡單:

var model = Inceptionv3()

let output = try? model.prediction(image: pixelBuffer)

let prediction = output?.classLabel ?? 「I don』t know! 」

但它需要一個CVPixelBuffer的對象而不是UIImage進行預測,這是由hackingwithswift.com在「機器學習與遠景」一節中精通這些的人介紹的,文章(https://www.hackingwithswift.com/whats-new-in-ios-11)。

我已經創建了UIImage類別,並將其與resize API一起進行提取。

extension UIImage {

func buffer() -> CVPixelBuffer? {

return UIImage.buffer(from: self)

}

static func buffer(from image: UIImage) -> CVPixelBuffer? {

// as explained in https://www.hackingwithswift.com/whats-new-in-ios-11

// ...

}

func resizeTo(_ size: CGSize) -> UIImage? {

UIGraphicsBeginImageContext(size)

draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

let image = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()

return image

}

}

最後的架構

結果

該應用程序能夠從幾乎所有提供的輸入中正確識別結果。

點擊此處鏈接獲取完整的代碼資源。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器人圈 的精彩文章:

你離識別這些AI謊言有多遠?科普綜藝來補位
LR-GAN如何生成圖像?這裡有篇Pytorch教程
實時風格遷移原來這麼酷!用PyTorch分分鐘搞定
Salesforce AI最新研究,如何情境化詞向量進行翻譯
如何使用深度神經網路進行圖像分類?其中用到的技術哪些?

TAG:機器人圈 |

您可能感興趣

如何開發一個基於 Docker 的 Python 應用
研發實戰:現在開始,用Unity為Magic Leap One開發MR內容
谷歌仍然在開發Fuchsia OS 用來替代Android等系統的大殺器
從技術對比Magic Leap One與HoloLens,開發者急速下單收貨後的體驗手記
如何使用 Docker Compose 來構建一套開發環境
使用C#開發Android應用之WebApp
適用於Android和iPhone的Swype鍵盤停止開發
Surface Phone正在開發中,有證據!
如何在Windows下開發Python:在cmd下運行Python腳本
HoloLens開發者:Magic Leap One確實比HoloLens好
C#開發Android應用之WebApp
開發者再爆料:LCD版的iPhone就是iPhoneSE2
微軟開發MRTouch技術在HoloLens上實現觸摸交互
LifeSignals推出與3M和意法半導體聯合開發的Life Signal?系列處理器
HoloLens開發者體驗報告:Magic Leap One確實比HoloLens好
Chrome即將登陸聯想Mirage Solo VR一體機;Oculus開發主管:開發者應考慮內容的全平台適用性
如何理解 Python Web 開發?
如果理解Python web開發技術
谷歌Google Pay正式登場;Spotify欲開發智能音箱
SpringMVC 開發 — 使用 Swagger 搭建介面請求頁面