1. Avant de commencer
Dans le premier atelier de programmation de cette série, vous avez créé une application très simple qui utilisait le libellé d'images pour analyser le contenu d'une image. Vous lui avez montré une photo de marguerite, et elle vous a dit qu'elle voyait des choses comme un pétale ou le ciel. Ensuite, dans le deuxième atelier de programmation, vous êtes passé à Python pour entraîner un nouveau modèle personnalisé qui reconnaît cinq types de fleurs différents.
Dans cet atelier de programmation, vous allez mettre à jour l'application du premier atelier avec le modèle du deuxième.
Pour obtenir le code source complet de cet atelier de programmation, clonez ce dépôt. Vous verrez des sous-répertoires pour Android et iOS. Le code de l'atelier de programmation précédent est disponible sous le nom ImageClassifierStep1 si vous souhaitez le suivre. Le code final de cet atelier de programmation est disponible sous le nom ImageClassifierStep2.
Prérequis
- Vous devez avoir terminé les deux premiers ateliers de programmation de ce parcours de formation.
Ce que vous allez créer et apprendre
- Intégrer un modèle personnalisé, entraîné dans l'atelier précédent, dans une application Android ou iOS
Prérequis
- Android Studio, disponible sur developer.android.com/studio pour la partie Android de l'atelier
- Xcode, disponible sur l'App Store d'Apple, pour la partie iOS de l'atelier
2. Télécharger l'application de démarrage
Vous aurez d'abord besoin de l'application de l'atelier de programmation "Créer votre première application de vision par ordinateur sur Android ou iOS". Si vous avez suivi l'atelier, il s'appellera "ImageClassifierStep1". Si vous ne souhaitez pas suivre l'atelier, vous pouvez cloner la version finale à partir du dépôt.
Ouvrez-le dans Android Studio, effectuez les mises à jour nécessaires, puis exécutez l'application pour vous assurer qu'elle fonctionne. L'écran qui s'affiche devrait ressembler à ce qui suit :

Il s'agit d'une application assez rudimentaire, mais elle présente des fonctionnalités très puissantes avec un peu de code. Toutefois, si vous souhaitez que cette fleur soit reconnue comme une marguerite et pas seulement comme une fleur, vous devrez mettre à jour l'application pour qu'elle utilise votre modèle personnalisé de l'atelier de programmation "Créer un modèle personnalisé pour votre classificateur d'images".
3. Mettre à jour build.gradle pour utiliser des modèles ML Kit personnalisés
- À l'aide d'Android Studio, recherchez le fichier
build.gradleau niveau de l'application. Le moyen le plus simple de le faire est d'utiliser l'explorateur de projet. Assurez-vous que l'option Android est sélectionnée en haut de l'écran. Vous verrez alors un dossier Scripts Gradle en bas de l'écran. - Ouvrez celui qui correspond au module, avec le nom de votre application suivi de ".app", comme indiqué ici : (Module : ImageClassifierStep1.app) :

- En bas du fichier, recherchez le paramètre dependencies. Vous devriez y voir cette ligne :
implementation 'com.google.mlkit:image-labeling:17.0.1'
Le numéro de version peut être différent. Vous trouverez toujours le dernier numéro de version sur le site ML Kit : https://developers.google.com/ml-kit/vision/image-labeling/android.
- Remplacez-le par la référence de la bibliothèque d'étiquetage d'images personnalisée. Le numéro de version est disponible à l'adresse suivante : https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android.
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
- Vous allez également ajouter un modèle .tflite que vous avez créé dans l'atelier précédent. Vous ne souhaitez pas que ce modèle soit compressé lorsqu'Android Studio compile votre application. Assurez-vous donc d'utiliser ce paramètre dans la section Android du même fichier
build.gradle:
aaptOptions{
noCompress "tflite"
}
Assurez-vous qu'il ne se trouve dans aucun autre paramètre. Elle doit être imbriquée directement sous la balise android. Exemple :

4. Ajouter le modèle TFLite
Dans l'atelier de programmation précédent, vous avez créé votre modèle personnalisé et l'avez téléchargé sous le nom model.tflite.
Dans votre projet, recherchez le dossier assets qui contient actuellement flower1.jpg. Copiez le modèle dans ce dossier comme suit :
- Effectuez un clic droit sur le dossier Assets dans Android Studio. Dans le menu qui s'affiche, sélectionnez Afficher dans le Finder. (Afficher dans l'Explorateur sous Windows et Afficher dans les fichiers sous Linux)

- Vous serez redirigé vers le répertoire du système de fichiers. Copiez le fichier
model.tflitedans ce répertoire, à côté deflower1.jpg..

Android Studio se met à jour pour afficher les deux fichiers dans votre dossier d'assets :

Vous êtes maintenant prêt à mettre à jour votre code.
5. Mettre à jour votre code pour le modèle personnalisé
La première étape consiste à ajouter du code pour charger le modèle personnalisé.
- Dans votre fichier
MainActivity, ajoutez ce qui suit à votreonCreate, juste en dessous de la lignesetContentView(R.layout.activity_main).
Un LocalModel sera utilisé pour créer l'élément à partir de l'asset model.tflite. Si Android Studio se plaint en affichant "LocalModel" en rouge, appuyez sur ALT+Entrée pour importer la bibliothèque. Il devrait ajouter une importation à com.google.mlkit.common.model.LocalModel pour vous.
val localModel = LocalModel.Builder()
.setAssetFilePath("model.tflite")
.build()
Auparavant, vous utilisiez le modèle par défaut dans votre gestionnaire btn.setOnClickListener. Il a été configuré avec ce code :
val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
Vous allez le remplacer pour utiliser le modèle personnalisé.
- Configurez un objet d'options personnalisées :
val options = CustomImageLabelerOptions.Builder(localModel)
.setConfidenceThreshold(0.7f)
.setMaxResultCount(5)
.build()
Cela remplace les options par défaut par un ensemble personnalisé. Le seuil de confiance définit un niveau de qualité pour les prédictions à renvoyer. Si vous revenez à l'exemple en haut de cet atelier de programmation, où l'image était une marguerite, vous aviez quatre prédictions, chacune avec une valeur à côté, comme "Ciel" qui était de 0,7632.
Vous pouvez filtrer efficacement les résultats de qualité inférieure en utilisant un seuil de confiance élevé. Si vous définissez cette valeur sur 0,9, par exemple, aucun libellé dont la priorité est inférieure ne sera renvoyé. setMaxResultCount() est utile dans les modèles comportant de nombreuses classes, mais comme ce modèle n'en comporte que cinq, vous pouvez le laisser à cinq.
Maintenant que vous disposez d'options pour le libellé, vous pouvez modifier l'instanciation du libellé comme suit :
val labeler = ImageLabeling.getClient(options)
Le reste de votre code s'exécutera sans modification. Faites le test !

Vous pouvez voir que cette fleur a maintenant été identifiée comme une marguerite avec une probabilité de 0,959.
Imaginons que vous ayez ajouté une deuxième image de fleur et que vous ayez relancé l'exécution :

Il l'identifie comme une rose.
Vous vous demandez peut-être pourquoi le terme roses est utilisé au lieu de "rose". En effet, dans l'ensemble de données, les libellés sont donnés par les noms de dossiers. Malheureusement, ces noms de dossiers sont un peu incohérents, car ils utilisent parfois le singulier (comme "marguerite") et parfois le pluriel (comme "roses"). Ne confondez pas cela avec la tentative du modèle de compter les éléments de l'image. Il s'agit d'une opération beaucoup plus primitive, qui ne peut identifier que les types de fleurs.
6. Télécharger l'application de démarrage iOS
- Vous aurez d'abord besoin de l'application du premier atelier de programmation. Si vous avez suivi l'atelier, il s'appellera "ImageClassifierStep1". Si vous ne souhaitez pas suivre l'atelier, vous pouvez cloner la version finale à partir du dépôt. Veuillez noter que les pods et le fichier .xcworkspace ne sont pas présents dans le dépôt. Par conséquent, avant de passer à l'étape suivante, assurez-vous d'exécuter "pod install" à partir du même répertoire que le fichier .xcproject.
- Ouvrez
ImageClassifierStep1.xcworkspacedans Xcode. Notez que vous devez utiliser le fichier .xcworkspace et non le fichier .xcproject, car vous avez regroupé ML Kit à l'aide de pods et l'espace de travail les chargera.
Pour le reste de cet atelier, j'exécuterai l'application dans le simulateur iPhone, qui devrait prendre en charge les cibles de compilation de l'atelier de programmation. Si vous souhaitez utiliser votre propre appareil, vous devrez peut-être modifier la cible de compilation dans les paramètres de votre projet pour qu'elle corresponde à votre version d'iOS.
Exécutez-le. Vous devriez obtenir un résultat semblable à celui-ci :

Notez les classifications très génériques : pétale, fleur, ciel. Le modèle que vous avez créé dans l'atelier de programmation précédent a été entraîné pour détecter cinq variétés de fleurs, dont celle-ci : une marguerite.
Pour le reste de cet atelier de programmation, vous allez examiner ce qu'il faudra faire pour mettre à niveau votre application avec le modèle personnalisé.
7. Utiliser des pods de classification d'images ML Kit personnalisés
La première application utilisait un fichier pod pour obtenir les bibliothèques et le modèle de base de ML Kit Image Labeler. Vous devrez le mettre à jour pour utiliser les bibliothèques de libellisation d'images personnalisées.
- Recherchez le fichier nommé
podfiledans le répertoire de votre projet. Ouvrez-le. Vous devriez obtenir ceci :
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabeling'
end
- Remplacez la déclaration du pod de
ImageLabelingparImageLabelingCustom, comme suit :
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabelingCustom'
end
- Une fois l'opération terminée, utilisez le terminal pour accéder au répertoire contenant le fichier Podfile (ainsi que le fichier .xcworkspace) et exécutez
pod install.

Après quelques instants, les bibliothèques MLKitImageLabeling seront supprimées et les bibliothèques personnalisées seront ajoutées. Vous pouvez maintenant ouvrir votre fichier .xcworkspace pour modifier votre code.
8. Ajouter le modèle TFLite à Xcode
Dans l'atelier de programmation précédent, vous avez créé un modèle personnalisé et l'avez téléchargé sous le nom model.tflite. Si vous ne l'avez pas sous la main, revenez en arrière et exécutez cet atelier de programmation, ou parcourez le code Colab ici. Si vous n'avez pas accès à Google Colab, le notebook est disponible sur ce lien.
- Une fois l'espace de travail ouvert dans Xcode, faites glisser le fichier model.tflite sur votre projet. Il doit se trouver dans le même dossier que le reste de vos fichiers, tels que
ViewController.swiftouMain.storyboard. - Une boîte de dialogue s'affiche avec des options pour ajouter le fichier. Assurez-vous que l'option Ajouter aux cibles est sélectionnée. Sinon, le modèle ne sera pas fourni avec l'application lorsqu'elle sera déployée sur un appareil.
Notez que l'entrée "Add to Targets" (Ajouter aux cibles) aura la valeur ImageClassifierStep1 si vous avez commencé par cette étape et que vous continuez cet atelier étape par étape, ou ImageClassifierStep2 (comme indiqué) si vous êtes passé directement au code final.

Cela vous permettra de charger le modèle. Vous verrez comment procéder à l'étape suivante.
9. Mettre à jour votre code pour le modèle personnalisé
- Ouvrez votre fichier
ViewController.swift. Une erreur peut s'afficher sur l'instruction "import MLKitImageLabeling" en haut du fichier. En effet, vous avez supprimé les bibliothèques d'étiquetage d'images génériques lorsque vous avez mis à jour votre fichier pod. N'hésitez pas à supprimer cette ligne et à la remplacer par ce qui suit :
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom
Il peut être facile de les lire rapidement et de penser qu'ils répètent le même code. Mais les deux derniers sont "Common" (Commun) et "Custom" (Personnalisé).
- Vous allez ensuite charger le modèle personnalisé que vous avez ajouté à l'étape précédente. Recherchez la fonction
getLabels(). Sous la lignevisionImage.orientation = image.imageOrientation, ajoutez les lignes suivantes :
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
- Recherchez le code permettant de spécifier les options de l'ImageLabeler générique. Il est probable qu'une erreur s'affiche, car ces bibliothèques ont été supprimées :
let options = ImageLabelerOptions()
Remplacez-le par ce code pour utiliser un CustomImageLabelerOptions et spécifier le modèle local :
let options = CustomImageLabelerOptions(localModel: localModel)
Et voilà ! Essayez d'exécuter votre application maintenant. Lorsque vous essayez de classer l'image, le résultat devrait être plus précis et vous indiquer que vous regardez une marguerite avec une forte probabilité.

Imaginons que vous ayez ajouté une deuxième image de fleur et que vous ayez relancé l'exécution :

L'application a correctement détecté que cette image correspondait au libellé "roses".
10. Félicitations !
Vous avez commencé par créer une application qui utilisait un modèle générique pour reconnaître le contenu d'une image. Vous avez ensuite créé votre propre modèle de ML pour reconnaître des éléments spécifiques, comme des fleurs, puis vous avez mis à jour votre application pour qu'elle utilise votre modèle personnalisé.
L'application obtenue est, bien sûr, très limitée, car elle s'appuyait sur des composants d'image groupés. Cependant, la partie ML fonctionne bien. Par exemple, vous pouvez utiliser AndroidX Camera pour prendre des images d'un flux en direct et les classer afin de voir quelles fleurs votre téléphone reconnaît.
À partir de là, les possibilités sont infinies. Si vous disposez de vos propres données pour autre chose que des fleurs, vous avez les bases nécessaires pour créer une application qui les reconnaît à l'aide de la vision par ordinateur. Ce ne sont que les premières étapes d'un monde beaucoup plus vaste. Nous espérons que vous avez apprécié de les parcourir !