Riconosci i fiori con TensorFlow Lite su iOS

1. Introduzione

657431be3173fa86.png

TensorFlow è un framework di machine learning multiuso. TensorFlow può essere utilizzato ovunque, dall'addestramento di modelli enormi in cluster nel cloud all'esecuzione locale di modelli su un sistema incorporato come il tuo smartphone.

Questo codelab utilizza TensorFlow Lite per eseguire un modello di riconoscimento delle immagini su un dispositivo iOS.

Cosa imparerai a fare

  • Come ottimizzare il modello utilizzando il convertitore TFLite.
  • Come eseguirlo in un'app iOS predefinita utilizzando l'interprete TFLite.

Cosa creerai

Una semplice app per fotocamera che esegue un programma di riconoscimento delle immagini TensorFlow per identificare i fiori.

Prerequisiti

Se esegui questo codelab su un tuo hardware, assicurati di aver installato quanto segue:

  • Xcode 10 o superiore
  • CocoaPods 1.8.0 o versioni successive

c45ecd122998622e.png

Licenza: senza costi

2. Addestra un riconoscimento dei fiori con Colab

Questo codelab userà Colaboratory e Xcode.

Apri Colab che utilizza TensorFlow Lite Model Maker per addestrare un classificatore in modo che riconosca i fiori utilizzando il Transfer Learning ed esporta un modello TFLite da utilizzare nell'app mobile.

3. Configura la directory di lavoro

clona il repository Git

Il seguente comando clonerà il repository Git contenente i file richiesti per questo codelab:

git clone https://github.com/tensorflow/examples.git

Ora cd nella radice del progetto Xcode del clone appena creato. Lavorerai qui per il resto di questo codelab:

cd examples/lite/examples/image_classification/ios

4. Configura l'app per iOS

Installa le dipendenze

Con CocoaPods, installa le dipendenze dell'app per iOS (incluso TensorFlow Lite). Al termine del comando di installazione, apri ImageClassification.xcworkspace per aprire il progetto in Xcode.

pod install --repo-update
open ImageClassification.xcworkspace

5. Testare l'esecuzione dell'app

Per utilizzare la fotocamera, l'app deve essere eseguita su un dispositivo reale, poiché il simulatore iOS non ha accesso alla fotocamera del Mac. Per creare su un dispositivo iOS, devi essere iscritto all'Apple Developer Program o avere accesso a un dispositivo di cui qualcun altro ha eseguito il provisioning per te.

Se vuoi eseguire questo codelab nel simulatore, dovrai copiare le immagini da Safari nel simulatore stesso. Di seguito sono riportati i passaggi per elaborare un'immagine nel simulatore:

  1. Crea l'app per il simulatore di destinazione che preferisci.
  2. Nel simulatore iOS, premi Cmd+Maiusc+H per ridurre a icona l'app.
  3. Tocca Safari nella parte inferiore della schermata Home e cerca un'immagine.
  4. Nei risultati di ricerca di Google Immagini, tocca un risultato e premi a lungo l'immagine. Nella finestra di dialogo visualizzata, seleziona "Copia".
  5. Torna all'app TFL Classify. L'immagine copiata dovrebbe essere visualizzata automaticamente insieme ai risultati dell'inferenza. In caso contrario, assicurati di aver copiato i dati dell'immagine e non l'URL dell'immagine.

Testa la build e installa l'app

Prima di apportare modifiche all'app, eseguiamo la versione fornita con il repository. Seleziona il tuo dispositivo iOS dal menu a discesa in alto a sinistra:

275753d3a77a0df3.png

Poi premi Cmd+R o premi il pulsante Riproduci f96cf117245c0fa6.png in Xcode per creare l'app sul tuo dispositivo. L'app dovrebbe avviarsi automaticamente una volta installata sul dispositivo.

Questa versione dell'app utilizza MobileNet standard, preaddestrato sulle 1000 categorie ImageNet. Il sito dovrebbe avere il seguente aspetto:

d11436f0bb5a75db.jpeg

6. Esegui l'app personalizzata

La configurazione predefinita dell'app classifica le immagini in una delle 1000 classi ImageNet, utilizzando lo standard MobileNet.

Ora modifichiamo l'app in modo che utilizzi il nostro modello riaddestrato per le nostre categorie di immagini personalizzate addestrate in Colab.

7. Converti l'app per eseguire il modello

Aggiungi i file del tuo modello al progetto

Le risorse del modello del progetto si trovano in ImageClassification > Model nel navigatore dei progetti Xcode. Per sostituirli, elimina prima i due file esistenti nel gruppo Model. Quando richiesto, seleziona "Sposta nel cestino":

cf2f7fefb2e5075f.png

Quindi, trascina i file model.tflite e labels.txt che hai scaricato da Colab nel gruppo di modelli. Quando richiesto, assicurati che Copy items if needed e Add to targets siano entrambi selezionati.

281d7eb72635bb5f.png

Modificare il codice dell'app

Per far funzionare la nostra app, dobbiamo aggiornare il percorso della logica di caricamento del modello in modo che punti al nuovo modello che abbiamo aggiunto.

Apri ModelDataHandler.swift (percorso Xcode navigator: ImageClassification -> ModelDataGestori -> ModelDataGestori.swift) e cambia la ModelDataHandler.swift in

// before
static let modelInfo: FileInfo = (name: "mobilenet_quant_v1_224", extension: "tflite")

// after
static let modelInfo: FileInfo = (name: "model", extension: "tflite")

Assicurati di salvare tutte le modifiche.

8. Esegui l'app personalizzata

Premi Cmd+B o premi il pulsante Riproduci f96cf117245c0fa6.png in Xcode per creare l'app sul tuo dispositivo. Una volta avviata, l'app dovrebbe avere un aspetto simile al seguente:

c45ecd122998622e.png

Per fare uno screenshot, puoi tenere premuti contemporaneamente il tasto di accensione e il tasto Alza il volume.

Ora prova a cercare dei fiori sul web, inquadra con la fotocamera lo schermo del computer e controlla se le foto sono classificate correttamente.

Oppure chiedi a un amico di scattarti una foto per scoprire che tipo di TensorFlower sei \\uf339 \\uf33b \\uf337!

9. Come funziona?

Ora che l'app è in esecuzione, vediamo il codice specifico di TensorFlow Lite.

TensorFlowLiteSwift

Questa app usa la libreria Swift TensorFlowLite tramite CocoaPods. La libreria Swift è un wrapper sottile sull'API TFLite C, che a sua volta è un wrapper della libreria TFLite C++.

Le seguenti righe nel file Podfile del modulo estrae nel progetto la versione più recente del repository globale delle specifiche di CocoaPods.

Podfile

target 'ImageClassification' do
  use_frameworks!

  # Pods for ImageClassification
   pod 'TensorFlowLiteSwift'
end

Utilizzo dell'API TensorFlow Lite Swift

Il codice che interagisce con TensorFlow Lite è tutto contenuto in ModelDataHandler.swift.

Configurazione

Il primo blocco di interesse è l'inizializzatore di ModelDataHandler:

ModelDataHandler.swift

/// A failable initializer for `ModelDataHandler`. A new instance is created if the model and
/// labels files are successfully loaded from the app's main bundle. Default `threadCount` is 1.
init?(modelFileInfo: FileInfo, labelsFileInfo: FileInfo, threadCount: Int = 1) {
  let modelFilename = modelFileInfo.name

  // Construct the path to the model file.
  guard let modelPath = Bundle.main.path(
    forResource: modelFilename,
    ofType: modelFileInfo.extension
  ) else {
    print("Failed to load the model file with name: \(modelFilename).")
    return nil
  }

  // Specify the options for the `Interpreter`.
  self.threadCount = threadCount
  var options = InterpreterOptions()
  options.threadCount = threadCount
  do {
    // Create the `Interpreter`.
    interpreter = try Interpreter(modelPath: modelPath, options: options)
    // Allocate memory for the model's input `Tensor`s.
    try interpreter.allocateTensors()
  } catch let error {
    print("Failed to create the interpreter with error: \(error.localizedDescription)")
    return nil
  }
  // Load the classes listed in the labels file.
  loadLabels(fileInfo: labelsFileInfo)
}

Ci sono alcune righe che dovrebbero essere discusse più in dettaglio.

La seguente riga crea l'interprete TFLite:

ModelDataHandler.swift

interpreter = try Interpreter(modelPath: modelPath, options: options)

L'interprete è responsabile del passaggio degli input di dati non elaborati attraverso il grafico TensorFlow. Passiamo all'interprete il percorso del nostro modello su disco e l'interprete lo carica quindi come FlatBufferModel.

L'ultima riga carica l'elenco delle etichette:

loadLabels(fileInfo: labelsFileInfo)

Tutto ciò che fa è caricare stringhe da un file di testo in memoria.

Esegui il modello

Il secondo blocco di interesse è il metodo runModel. Richiede un CVPixelBuffer come input, esegue l'interprete e restituisce il testo da stampare nell'app.

ModelDataHandler.swift

try interpreter.copy(rgbData, toInputAt: 0)
// ...
try interpreter.invoke()
// ...
outputTensor = try interpreter.output(at: 0)

10. Passaggi successivi

Ecco alcuni link per saperne di più: