如何用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 搭建介面請求頁面