Apple的Core ML3簡介——爲iPhone構建深度學習模型(附代碼)

概述

  • Apple的Core ML 3是一個爲開發人員和程序員設計的工具,幫助程序員進入人工智能生態
  • 你可使用Core ML 3爲iPhone構建機器學習和深度學習模型
  • 在本文中,咱們將爲iPhone構建一個全新的應用程序!

介紹

> 想象一下,在不須要深刻了解機器學習的狀況下,使用最早進的機器學習模型來構建應用程序。這就是Apple的Core ML 3!git

你是Apple的狂熱粉絲嗎?你用iPhone嗎?有沒有想過Apple是如何利用機器學習和深度學習來驅動其應用和軟件的?程序員

若是你對以上任何一個問題的回答是確定的,那麼你將會獲得一場盛宴!由於在本文中,咱們將使用深度學習和Apple的Core ML 3爲iPhone構建一個應用程序。下面是這款應用的快速瀏覽:github

軟件開發人員、程序員甚至數據科學家都喜歡Apple的人工智能生態。近年來,他們取得了一些驚人的進展,包括Core ML和我我的最喜歡的Swift編程語言。編程

Core ML 3是一個框架,支持iPhone的一些功能,好比FaceID、Animoji和加強現實AR。自從Core ML在2017年發佈以來,它已經走過了很長的路,如今它支持大量的工具,能夠幫助咱們快速構建基於機器學習的應用程序。swift

在這篇文章中,咱們將探索Apple應用程序的整我的工智能生態,以及如何使用Core ML 3豐富的生態,包括前沿的預訓練深度模型。xcode

目錄

  • Apple的人工智能生態
  • Core ML 3
  • Core ML 3有什麼新特性?
  • 使用ResNet50爲iPhone構建一個圖像分類應用
  • 分析Vidhya對Core ML的見解

Apple的人工智能生態

Apple在構建利用機器學習的工具和框架方面作得很好。構建人工智能應用程序有多種選擇,每種選擇都有其優缺點。服務器

讓咱們瞭解一下每一個工具或框架。網絡

1)Turi Create

這應該是你的首選框架,若是你想添加推薦,對象檢測,圖像分類,圖像類似性或活動分類等任務到你的應用程序。架構

使用這個工具你不須要成爲機器學習專家由於它已經爲每一個任務定義了模型。app

我喜歡Turi Create的一點是,咱們能夠在Python中使用它,就像咱們的常規工做流程同樣。當咱們對咱們的模型感到滿意時,只需將它導入到Core ML中,就能夠在iOS、macOS、watchOS和tvOS應用程序中使用!

如下是Turi Create的支持的一些任務:

2)CreateML

Create ML使咱們可以構建機器學習模型,而不須要編寫太多代碼。

我喜歡這個工具的地方是,你能夠拖放你的訓練數據,選擇你想要的模型類型(語音識別,對象檢測等),它會自動開始訓練模型!

下面是一個訓練貓狗圖像分類器的例子:

請注意,我只編寫了兩行代碼並拖拽訓練數據到目標文件夾,其他部分都由CreateML負責!

Turi Create能夠在Python中工做,而咱們可使用CreateML在Mac上構建程序。而且它支持在GPU上進行訓練

3)用於TensorFlow的Swift

Swift for TensorFlow有一個靈活、高性能的相似於TensorFlow/PyTorch的API來構建複雜的神經網絡架構。

這個框架最吸引人的地方是它的代碼和Python的代碼同樣易讀。如下是相同的模型在Swift和Python的不一樣表達(注意類似性):

當你須要模型的高性能並但願有效地部署它們時,能夠選擇Swift來使用TensorFlow。

4)語言和視覺框架

這些是Apple針對Python的spaCy和OpenCV框架建立的副本,可是增長了功能。這些框架容許咱們建立端到端管道來執行圖像處理和文本處理等。

若是你想執行圖像分析任務,如人臉或地標檢測、文本檢測、條形碼識別、圖像配準和通常特徵跟蹤,那麼視覺就是你的選擇。

相似地,若是你想執行諸如語言和腳本識別、分詞、lemmatization、詞性分析和命名實體識別等任務,那麼語言模塊將會頗有用。

除了這兩個,Apple還支持處理語音數據的框架(而且它們很容易與CoreML一塊兒工做)。我將在之後的文章中介紹這些工具。如今,讓咱們來看看最精彩的框架——ML 3!

Core ML 3

我喜歡Apple的Core ML 3框架。它不只支持咱們在上面看到的工具,並且還支持它本身的一些功能。

首先,CoreML3容許咱們導入主流的Python框架中訓練過的機器學習或深度學習模型:

咱們在前面的一篇文章中已經介紹了Core ML 3的這個功能。在這裏,咱們將看到CoreML3的另外一個有趣的功能,咱們如何利用CoreML3使用大量前沿的預訓練模型!

下面是Core ML 3支持的模型列表。注意其中的一些(好比Squeezenet, DeeplabV3, YOLOv3)是最近幾個月纔出現的:

全部這些模型實際上都通過了優化,以便在移動設備、平板電腦和電腦上提供最佳性能。這就是Apple的偉大之處。

這意味着,即便其中許可能是複雜的基於深度學習的模型,咱們也沒必要在部署和在應用程序中使用它們時過多地擔憂性能——這有多酷?

Core ML 3有什麼新特性?

你看了今年的WWDC大會了嗎?關於Apple設備對這個框架的支持,有一些有趣的公告。這裏有一個簡短的總結,以防你錯過。

1)設備內置的訓練

這是Core ML 3目前爲止最突出的功能。以前,咱們只支持「設備上的推理」。這基本上意味着咱們在其餘機器上訓練咱們的模型,而後利用訓練好的模型對設備自己進行實時預測。新功能致使了更好的用戶體驗,由於咱們不依賴互聯網來得到預測。

> Core ML 3如今也支持設備上的訓練!你可使用iPhone的CPU、GPU和神經引擎來訓練你的機器學習和深度學習模型。

你能夠將Core ML 3訓練視爲一種遷移學習或在線學習的形式,在這種形式中,你只須要調整現有的模型。

以Face ID爲例。當用戶的臉隨着時間變化(長鬍子、化妝、變老等)時,它須要保持模型的更新。基本思想是,首先擁有一個通用模型,它爲每一個人提供平均性能,而後爲每一個用戶定製一個副本。

隨着時間的推移,這個模型會變得很是適合特定的用戶:

這樣作有不少好處:

  1. 訓練將在用戶的我的設備上進行,這對用戶來講意味着很高的數據隱私
  2. 咱們不須要設置龐大的服務器來幫助數百萬應用程序用戶進行模型訓練
  3. 由於不涉及互聯網,這些模型預測時一直可用!

2)在Core ML 3中加入了新型的神經網絡層

除了爲不一樣的模型類型提供層外,Core ML 3還爲中間操做提供了100多個層,好比掩蔽、張量操做、布爾邏輯、控制流等等。

> 這些層類型中的一些已經被用在最早進的神經網絡架構中,Core ML 3已經爲咱們提供了支持。

這僅僅意味着咱們能夠很容易地爲咱們的應用程序當即構建這樣的模型。

若是你對整個包感興趣,能夠免費觀看整個WWDC視頻。出於本文的目的,咱們介紹了core ML 3的核心基礎知識。如今是時候構建一個iPhone應用程序了!視頻連接:https://developer.apple.com/videos/play/wwdc2019/704/

爲iPhone創建一個圖像分類應用

在咱們開始構建應用程序以前,咱們須要安裝一些東西。

系統設置

  1. macOS:我用的是macOS Catalina (10.15.1)
  2. Xcode:這是爲Apple設備開發應用的默認軟件。你能夠從Apple電腦上的App Store下載。我用的是11.2版
  3. Project:你能夠在你的終端使用下面的命令從GitHub下載項目的基本代碼:
git clone https://github.com/mohdsanadzakirizvi/CoreML3-Resnet50.git

注意:

  1. 對於本文,你須要一臺macOS機器,不然沒法實現該項目
  2. 任何爲Apple設備開發的應用程序都是用Swift編寫的

創建咱們的深度學習模型

一旦你下載項目,你會看到有兩個文件夾:

圖片上的完整版是應用程序的全功能版本,你能夠經過導入ResNet50模型來運行。練習版缺乏一些代碼。

在Xcode中運行如下命令打開項目:

open ImageClassifier.xcodeproj

我在Xcode窗口中突出顯示了三個主要區域:

  1. 左上角的play按鈕用於在模擬器上start the app
  2. 若是你看下面的play按鈕,有文件和文件夾的項目。這稱爲項目導航器。它幫助咱們在項目的文件和文件夾之間導航
  3. 在播放按鈕旁邊寫着iPhone 11 Pro Max。這表示要測試模擬器的目標設備

讓咱們先運行咱們的應用程序,看看會發生什麼。點擊左上角的播放按鈕,模擬器就會運行。 你看到了什麼?

目前,咱們的應用程序還作不了什麼。它只顯示一個圖像和一個按鈕來選擇其餘圖像-讓咱們作得更好!

若是你打開Pratice版本,你會發現如下文件夾結構:

在項目導航窗格中,選擇ViewController.swift。這個文件包含了不少控制咱們應用程序功能的代碼。

import CoreML
import Vision
import UIKit

class ViewController: UIViewController {

  @IBOutlet weak var scene: UIImageView!
  @IBOutlet weak var answerLabel: UILabel!


  override func viewDidLoad() {
    super.viewDidLoad()

    guard let image = UIImage(named: "scenery") else {
      fatalError("no starting image")
    }

    scene.image = image
  }
}

extension ViewController {

  @IBAction func pickImage(_ sender: Any) {
    let pickerController = UIImagePickerController()
    pickerController.delegate = self
    pickerController.sourceType = .savedPhotosAlbum
    present(pickerController, animated: true)
  }
}

// UIImagePickerControllerDelegate
extension ViewController: UIImagePickerControllerDelegate {

  func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    dismiss(animated: true)

    guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else {
      fatalError("couldn't load image from Photos")
    }

    scene.image = image
  }
}

//UINavigationControllerDelegate
extension ViewController: UINavigationControllerDelegate {
}

如今你已經熟悉了Xcode和項目代碼文件,讓咱們進入下一個階段。

在咱們的應用程序中添加一個預訓練模型

前往官方Core ML 3網站直接下載預訓練的模型:

https://developer.apple.com/machine-learning/models/

在image部分,你能夠找到ResNet50:

你能夠下載任何你想要的版本。尺寸越大,模型就越精確。一樣,尺寸越小,模型運行的速度越快。

  1. 拖拽Resnet50.mlmodel文件放入項目導航窗格中的文件夾
  2. 將彈出一個帶有一些選項的窗口。選擇默認選項,而後點擊「Finish」
  3. 當咱們將這樣的文件拖放到Xcode中時,它會自動建立對該文件的引用。經過這種方式,咱們能夠輕鬆地在代碼中訪問該文件

如下是整個流程供參考:

作出第一個預測

爲了進行第一次預測,咱們須要加載剛剛下載的ResNet50模型。而後,取一幅圖像,將它轉換成模型指望的格式並進行預測。

在ViewController.swift文件的IBActions(第33行)下面編寫如下代碼:

extension ViewController {

  func imageClassify(image: CIImage) {
    answerLabel.text = "detecting..."
  
    // 經過生成的類加載ML模型
    guard let model = try? VNCoreMLModel(for: Resnet50().model) else {
      fatalError("can't load Places ML model")
    }
    
    // 建立帶有處理程序的視覺請求
    let request = VNCoreMLRequest(model: model) { [weak self] request, error in
      let results = request.results as? [VNClassificationObservation]

      var outputText = ""
      
      for res in results!{
        outputText += "\(Int(res.confidence * 100))% it's \(res.identifier)\n"
      }
      DispatchQueue.main.async { [weak self] in
        self?.answerLabel.text! = outputText
      }
    }
    
    // 在全局調度隊列上運行CoreML3 Resnet50分類器
    let handler = VNImageRequestHandler(ciImage: image)
    DispatchQueue.global(qos: .userInteractive).async {
      do {
        try handler.perform([request])
      } catch {
        print(error)
      }
    }

  }
}

上面的代碼接收一個新圖像,根據ResNet50指望的格式對其進行預處理,而後將其傳遞到網絡中進行預測。

最重要的代碼行是:

// 經過生成的類加載ML模型
guard let model = try? VNCoreMLModel(for: Resnet50().model) else {
fatalError("can't load Places ML model")
}

咱們在這裏設置模型名稱。若是你想使用像BERT或YOLO這樣的框架,你只須要修改模型名,你的應用程序的其餘部分就能夠順利運行了

如今,咱們須要調用這個函數imageClassify()來得到對圖像的預測。將下面這段代碼添加到viewDidLoad()的末尾(第19行):

guard let ciImage = CIImage(image: image) else {
      fatalError("couldn't convert UIImage to CIImage")
    }

    classifyImage(image: ciImage)

如今,若是你運行這個應用程序,你會看到它已經開始預測當應用程序啓動時顯示的風景圖片:

在**imagePickerController()**中複製相同的代碼(第87行),而後應用程序將可以對你選擇的任何圖像作出相同的預測。

這是應用程序的最終版本:

恭喜你——你剛剛爲iPhone開發了第一款人工智能應用!

Vidhya對Core ML 3的分析

Apple公司利用最新的人工智能圖像、語音和文本研究,開發出使人印象深入的應用程序。你能夠當即開始,而沒必要對這些模型有太多的瞭解,並在此過程當中學習和探索。

我喜歡這個行業認真對待人工智能的方式,這讓更普遍的受衆可以接觸到它。

我鼓勵你進一步探索和嘗試最新的模型,如BERT,並建立更有趣的應用程序。若是想選擇其餘模型的話,你能夠嘗試在咱們這裏開發的同一個應用程序上使用SqueezeNet和MobileNet,看看不一樣的模型是如何在相同的圖像上運行的。

本文中使用的全部代碼均可以在Github上找到:https://github.com/mohdsanadzakirizvi/CoreML3-Resnet50

相關文章
相關標籤/搜索