Crea TensorFlow Lite per iOS

Questo documento descrive come creare autonomamente la libreria iOS TensorFlow Lite. Normalmente, non è necessario creare localmente la libreria iOS TensorFlow Lite. Se vuoi semplicemente usarlo, il modo più semplice è utilizzare le versioni stabili o notturne predefinite di TensorFlow Lite CocoaPods. Consulta la guida rapida di iOS per ulteriori dettagli su come utilizzarli nei tuoi progetti iOS.

Costruire localmente

In alcuni casi, potresti voler utilizzare una build locale di TensorFlow Lite, ad esempio quando desideri apportare modifiche locali a TensorFlow Lite e testare tali modifiche nella tua app iOS o preferisci utilizzare il framework statico rispetto a quello dinamico fornito. Per creare un framework iOS universale per TensorFlow Lite localmente, devi crearlo utilizzando Bazel su un computer macOS.

Installa Xcode

Se non lo hai già fatto, dovrai installare Xcode 8 o versione successiva e gli strumenti che utilizzano xcode-select :

xcode-select --install

Se si tratta di una nuova installazione, dovrai accettare il contratto di licenza per tutti gli utenti con il seguente comando:

sudo xcodebuild -license accept

Installa Bazel

Bazel è il sistema di build principale per TensorFlow. Installa Bazel seguendo le istruzioni sul sito web di Bazel . Assicurati di scegliere una versione tra _TF_MIN_BAZEL_VERSION e _TF_MAX_BAZEL_VERSION nel file configure.py nella root del repository tensorflow .

Configura WORKSPACE e .bazelrc

Esegui lo script ./configure nella directory principale di pagamento di TensorFlow e rispondi "Sì" quando lo script ti chiede se desideri creare TensorFlow con il supporto iOS.

Una volta configurato correttamente Bazel con il supporto iOS, puoi creare il framework TensorFlowLiteC con il seguente comando.

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_framework

Questo comando genererà il file TensorFlowLiteC_framework.zip nella directory bazel-bin/tensorflow/lite/ios/ nella directory root di TensorFlow. Per impostazione predefinita, il framework generato contiene un file binario "fat", contenente armv7, arm64 e x86_64 (ma non i386). Per visualizzare l'elenco completo dei flag di build utilizzati quando si specifica --config=ios_fat , fare riferimento alla sezione delle configurazioni iOS nel file .bazelrc .

Costruisci il framework statico TensorFlowLiteC

Per impostazione predefinita, distribuiamo il framework dinamico solo tramite Cocoapods. Se invece desideri utilizzare il framework statico, puoi creare il framework statico TensorFlowLiteC con il seguente comando:

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_static_framework

Il comando genererà un file denominato TensorFlowLiteC_static_framework.zip nella directory bazel-bin/tensorflow/lite/ios/ nella directory root di TensorFlow. Questo quadro statico può essere utilizzato esattamente allo stesso modo di quello dinamico.

Costruisci selettivamente framework TFLite

Puoi creare framework più piccoli destinati solo a una serie di modelli utilizzando la creazione selettiva, che salterà le operazioni inutilizzate nel set di modelli e includerà solo i kernel operativi necessari per eseguire un determinato set di modelli. Il comando è il seguente:

bash tensorflow/lite/ios/build_frameworks.sh \
  --input_models=model1.tflite,model2.tflite \
  --target_archs=x86_64,armv7,arm64

Il comando precedente genererà il framework statico bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip per le operazioni integrate e personalizzate di TensorFlow Lite; e, facoltativamente, genera il framework statico bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip se i tuoi modelli contengono operazioni Select TensorFlow. Tieni presente che il flag --target_archs può essere utilizzato per specificare le architetture di distribuzione.

Utilizzare nella propria applicazione

Sviluppatori di CocoaPods

Esistono tre CocoaPod per TensorFlow Lite:

  • TensorFlowLiteSwift : fornisce le API Swift per TensorFlow Lite.
  • TensorFlowLiteObjC : fornisce le API Objective-C per TensorFlow Lite.
  • TensorFlowLiteC : pod di base comune, che incorpora il runtime core TensorFlow Lite ed espone le API C di base utilizzate dai due pod precedenti. Non pensato per essere utilizzato direttamente dagli utenti.

Come sviluppatore, dovresti scegliere il pod TensorFlowLiteSwift o TensorFlowLiteObjC in base alla lingua in cui è scritta la tua app, ma non entrambi. I passaggi esatti per l'utilizzo delle build locali di TensorFlow Lite differiscono a seconda della parte esatta che desideri creare.

Utilizzando API locali Swift o Objective-C

Se utilizzi CocoaPods e desideri testare solo alcune modifiche locali alle API Swift o alle API Objective-C di TensorFlow Lite, segui i passaggi qui.

  1. Apporta modifiche alle API Swift o Objective-C nel tuo checkout tensorflow .

  2. Apri il file TensorFlowLite(Swift|ObjC).podspec e aggiorna questa riga:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    essere:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Questo per garantire che stai creando le tue API Swift o Objective-C con l'ultima versione notturna disponibile delle API TensorFlowLiteC (creata ogni notte tra l'1 e le 4 del fuso orario del Pacifico) anziché con la versione stabile, che potrebbe essere obsoleta rispetto al tuo tensorflow locale guardare. In alternativa, puoi scegliere di pubblicare la tua versione di TensorFlowLiteC e utilizzare quella versione (vedi la sezione Utilizzo del core TensorFlow Lite locale di seguito).

  3. Nel Podfile del tuo progetto iOS, modifica la dipendenza come segue in modo che punti al percorso locale della directory root di tensorflow .
    Per Swift:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    Per Obiettivo-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. Aggiorna l'installazione del pod dalla directory root del tuo progetto iOS.
    $ pod update

  5. Riapri l'area di lavoro generata ( <project>.xcworkspace ) e ricostruisci la tua app all'interno di Xcode.

Utilizzando il core TensorFlow Lite locale

Puoi configurare un repository delle specifiche CocoaPods privato e pubblicare il tuo framework TensorFlowLiteC personalizzato nel tuo repository privato. Puoi copiare questo file podspec e modificare alcuni valori:

  ...
  s.version      = <your_desired_version_tag>
  ...
  # Note the `///`, two from the `file://` and one from the `/path`.
  s.source       = { :http => "file:///path/to/TensorFlowLiteC_framework.zip" }
  ...
  s.vendored_frameworks = 'TensorFlowLiteC.framework'
  ...

Dopo aver creato il tuo file TensorFlowLiteC.podspec , puoi seguire le istruzioni sull'utilizzo dei CocoaPod privati ​​per utilizzarlo nel tuo progetto. Puoi anche modificare TensorFlowLite(Swift|ObjC).podspec in modo che punti al tuo pod TensorFlowLiteC personalizzato e utilizzare il pod Swift o Objective-C nel progetto dell'app.

Sviluppatori di Bazel

Se utilizzi Bazel come strumento di creazione principale, puoi semplicemente aggiungere la dipendenza TensorFlowLite alla destinazione nel file BUILD .

Per Swift:

swift_library(
  deps = [
      "//tensorflow/lite/swift:TensorFlowLite",
  ],
)

Per Obiettivo-C:

objc_library(
  deps = [
      "//tensorflow/lite/objc:TensorFlowLite",
  ],
)

Quando crei il progetto della tua app, qualsiasi modifica alla libreria TensorFlow Lite verrà rilevata e incorporata nella tua app.

Modifica direttamente le impostazioni del progetto Xcode

Ti consigliamo vivamente di utilizzare CocoaPods o Bazel per aggiungere la dipendenza TensorFlow Lite al tuo progetto. Se desideri comunque aggiungere manualmente il framework TensorFlowLiteC , dovrai aggiungere il framework TensorFlowLiteC come framework incorporato al tuo progetto applicativo. Decomprimi il TensorFlowLiteC_framework.zip generato dalla build precedente per ottenere la directory TensorFlowLiteC.framework . Questa directory è il framework effettivo che Xcode può comprendere.

Dopo aver preparato TensorFlowLiteC.framework , devi prima aggiungerlo come binario incorporato alla destinazione dell'app. La sezione esatta delle impostazioni del progetto per questo può variare a seconda della versione di Xcode.

  • Xcode 11: vai alla scheda "Generale" dell'editor di progetto per la destinazione della tua app e aggiungi TensorFlowLiteC.framework nella sezione "Frameworks, librerie e contenuto incorporato".
  • Xcode 10 e versioni precedenti: vai alla scheda "Generale" dell'editor di progetto per la destinazione della tua app e aggiungi TensorFlowLiteC.framework in "Binari incorporati". Il framework dovrebbe anche essere aggiunto automaticamente nella sezione "Framework collegati e librerie".

Quando aggiungi il framework come binario incorporato, Xcode aggiorna anche la voce "Percorsi di ricerca del framework" nella scheda "Impostazioni di creazione" per includere la directory principale del framework. Nel caso in cui ciò non avvenga automaticamente, dovresti aggiungere manualmente la directory principale della directory TensorFlowLiteC.framework .

Una volta eseguite queste due impostazioni, dovresti essere in grado di importare e chiamare l'API C di TensorFlow Lite, definita dai file di intestazione nella directory TensorFlowLiteC.framework/Headers .