Créer un modèle de classification audio personnalisé pré-entraîné

1. Avant de commencer

Dans l'atelier de programmation précédent, vous avez créé une application de base pour la classification de contenus audio.

Et si vous souhaitez personnaliser le modèle de classification de contenus audio afin qu'il reconnaisse les contenus audio de différentes classes ne figurant pas sur un modèle pré-entraîné ? Ou comment personnaliser le modèle à l'aide de vos propres données ?

Dans cet atelier de programmation, vous allez personnaliser un modèle de classification audio pré-entraîné pour détecter les oiseaux. Vous pouvez reproduire la même technique à l'aide de vos propres données.

Prérequis

Cet atelier de programmation s'adresse aux développeurs d'applications mobiles expérimentés qui souhaitent maîtriser le machine learning. Vous devez être au fait:

  • Développement Android à l'aide de Kotlin et Android Studio
  • Syntaxe Python de base

Points abordés

  • Effectuer l'apprentissage par transfert pour le domaine audio
  • Créer vos propres données
  • Déployer votre propre modèle dans une application Android

Prérequis

  • Une version récente d'Android Studio (version 4.1.2 ou ultérieure)
  • Appareil physique physique avec version d'Android sur l'API 23 (Android 6.0)
  • Exemple de code
  • Connaissances de base en développement Android en langage Kotlin

2. L'ensemble de données sur les oiseaux

Vous allez utiliser un ensemble de données Birdsong déjà prêt pour en faciliter l'utilisation. Tous les fichiers audio proviennent du site Web de Xeno-canto.

Cet ensemble de données contient des titres provenant des sources suivantes:

Nom: House moineau

Code: houspa

Image des espèces d'oiseaux de la maison des moines, par Alejandro Bayer Tamayo, en Arménie en Colombie.

[audio]

Nom: Croix-Rouge

Code: redcro

Image des espèces d'oiseaux de la Croix-Rouge d'Elaine Wilson.

[audio]

Nom: poignet en bois blanc à poitrine blanche

Code: wbwwre1

Image d'un poignet en bois blanc, auteur inconnu.

[audio]

Nom: Antpitta couronne

Code: chcant2

Image d'Antpitta couronnée de châtaigniers

[audio]

Name (Nom) : Azara's Spinetail

Code: azaspi1

Image d'un oiseau d'Azara.

[audio]

Cet ensemble de données se trouve dans un fichier ZIP, et son contenu est le suivant:

  • metadata.csv contenant toutes les informations sur chaque fichier audio, telles que la personne qui l'a enregistré, le lieu où il a été enregistré, la licence d'utilisation et le nom de l'oiseau.
  • Dossier d'entraînement et de test.
  • Dans les dossiers du train et du test, vous trouverez un dossier pour chaque code d'oiseau. Chacun d'entre eux contient tous les fichiers .wav pour cet oiseau.

Les fichiers audio sont tous au format wav et respectent cette spécification:

Cette spécification est importante, car vous utiliserez un modèle de base qui attend des données dans ce format. Pour en savoir plus, consultez cet article de blog.

Pour simplifier le processus, vous n'aurez pas besoin de télécharger l'ensemble de données sur votre machine. Vous l'utiliserez ensuite sur Google Colab (plus loin dans ce guide).

Si vous souhaitez utiliser vos propres données, tous vos fichiers audio doivent l'être également dans ce format.

3. Obtenir l'exemple de code

Télécharger le code

Cliquez sur le lien ci-dessous pour télécharger l'ensemble du code de cet atelier de programmation :

Ou, si vous préférez, clonez le dépôt:

git clone https://github.com/googlecodelabs/odml-pathways.git

Décompressez le fichier ZIP téléchargé. Cela permet de décompresser un dossier racine (odml-pathways) contenant toutes les ressources dont vous avez besoin. Pour cet atelier de programmation, vous n'aurez besoin que des sources dans le sous-répertoire audio_classification/codelab2/android.

Le sous-répertoire android du dépôt audio_classification/codelab2/android contient deux répertoires:

  • android_studio_folder.pngstarter : code de démarrage sur lequel s'appuie cet atelier de programmation.
  • android_studio_folder.pngfinal : code final de l'exemple d'application terminée

Importer l'application de départ

Commencez par importer l'application de départ dans Android Studio:

  1. Ouvrez Android Studio, puis sélectionnez Import Project (Gradle, Eclipse ADT, etc.) (Importer un projet (Gradle, Eclipse ADT, etc.)).
  2. Ouvrez le dossier starter (audio_classification/codelab2/android/starter) à partir du code source que vous avez téléchargé précédemment.

7c0f27882a2696ac.png

Pour vous assurer que toutes les dépendances sont disponibles pour votre application, vous devez synchroniser votre projet avec les fichiers Gradle une fois le processus d'importation terminé.

  1. Sélectionnez Sync Project with Gradle Files (Synchroniser le projet avec les fichiers Gradle) (B451AB2D04D835f9.png) dans la barre d'outils d'Android Studio.

4. Comprendre l'application de départ

Cette application est la même que celle construite dans le premier atelier de programmation sur la classification audio. Créez une application de base pour la classification audio.

Pour mieux comprendre le code en détail, nous vous recommandons de le suivre avant de continuer.

Tout le code figure dans la classe MainActivity (pour être le plus simple possible).

En résumé, le code examine les tâches suivantes:

  • Charger le modèle
val classifier = AudioClassifier.createFromFile(this, modelPath)
  • Créer l'enregistreur audio et commencer l'enregistrement
val tensor = classifier.createInputTensorAudio()

val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
       "Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs

val record = classifier.createAudioRecord()
record.startRecording()
  • Création d'un fil de discussion pour exécuter une inférence. Les paramètres de la méthode scheduleAtFixedRate indiquent le temps d'attente et le délai d'exécution des tâches successives. Dans le code ci-dessous, elle démarrera dans une milliseconde et s'exécutera de nouveau toutes les 500 millisecondes.
Timer().scheduleAtFixedRate(1, 500) {
...
}
  • Exécuter l'inférence sur le contenu audio capturé
val numberOfSamples = tensor.load(record)
val output = classifier.classify(tensor)
  • Classification des filtres pour les scores faibles
val filteredModelOutput = output[0].categories.filter {
   it.score > probabilityThreshold
}
  • Afficher les résultats à l'écran
val outputStr = filteredModelOutput.map { "${it.label} -> ${it.score} " }
   .joinToString(separator = "\n")

runOnUiThread {
   textView.text = outputStr
}

Vous pouvez à présent exécuter l'application et jouer avec l'application telle quelle, mais n'oubliez pas qu'elle utilise un modèle pré-entraîné plus générique.

5. Entraîner un modèle de classification audio personnalisé avec Model Maker

À l'étape précédente, vous avez téléchargé une application qui utilise un modèle pré-entraîné pour classer des événements audio. En revanche, vous devrez parfois personnaliser ce modèle en fonction d'événements audio qui vous intéressent ou le personnaliser davantage.

Comme indiqué précédemment, vous allez spécialiser le modèle en fonction des sons issus des oiseaux. Voici un ensemble de données contenant des données audio pour les oiseaux, sélectionné sur le site Web Xeno-canto.

Colaboratory

Passons maintenant à l'entraînement du modèle personnalisé dans Google Colab.

L'entraînement du modèle personnalisé prendra environ 30 minutes.

Si vous souhaitez ignorer cette étape, vous pouvez télécharger le modèle que vous avez entraîné sur Colab à l'aide de l'ensemble de données fourni, puis passer à l'étape suivante.

6. Ajouter le modèle TFLite personnalisé à l'application Android

Maintenant que vous avez entraîné votre propre modèle de classification de contenus audio et que vous l'avez enregistré en local, vous devez le placer dans le dossier des éléments de l'application Android.

La première étape consiste à déplacer le modèle téléchargé de l'étape précédente vers le dossier des éléments dans votre application.

  1. Dans Android Studio, accédez à la vue du projet Android, puis effectuez un clic droit sur le dossier des éléments.

7cca2c22ed8cf4c8.png

  1. Une fenêtre pop-up s'affiche avec les options disponibles. L'un de ces éléments consiste à ouvrir le dossier dans votre système de fichiers. Trouvez celui qui convient à votre système d'exploitation et sélectionnez-le. Sur un Mac,il s'agit de l'option Reveal in Finder (Afficher dans le Finder), puis de l'option Show in Files (Ouvrir dans les fichiers) sous Ubuntu dans Windows.

95e0eca881d35f6b.png

  1. Copiez le modèle téléchargé dans le dossier.

Ensuite, revenez dans Android Studio. Le fichier devrait s'afficher dans le dossier des éléments.

52bda66abe201fe5.png

7. Charger le nouveau modèle dans l'application de base

L'application de base utilise déjà un modèle pré-entraîné. Vous devrez le remplacer par celui que vous venez d'entraîner.

  1. TODO 1:Pour charger le nouveau modèle après l'avoir ajouté au dossier assets, modifiez la valeur de la variable modelPath:
var modelPath = "my_birds_model.tflite"

Le nouveau modèle produit deux sorties (têtes):

  • Résultat d'origine plus générique du modèle de base que vous avez utilisé (dans ce cas, YAMNet).
  • Résultat secondaire qui est spécifique aux oiseaux que vous avez utilisés pour l'entraînement.

Cet aspect est nécessaire, car YAMNet a réussi à reconnaître plusieurs classes courantes, telles que la fonctionnalité Silence. Ainsi, vous n'avez pas à vous soucier de toutes les autres classes que vous n'avez pas ajoutées à votre ensemble de données.

Maintenant, si la classification YAMNet affiche un score élevé pour la classe ornithologique, vous pouvez examiner quel oiseau fait partie de cette classe.

37c1c14e9e2d1b0.png

  1. TODO 2:Découvrez si le premier élément de classification a une grande probabilité d'être un oiseau. Vous allez modifier le filtre afin d'exclure ceux qui ne sont pas des oiseaux:
val filteredModelOuput = output[0].categories.filter {
   it.label.contains("Bird") && it.score > .3
}
  1. TODO 3:
if (filteredModelOutput.isNotEmpty()) {
   Log.i("Yamnet", "bird sound detected!")
   filteredModelOutput = output[1].categories.filter {
       it.score > probabilityThreshold
   }
}

Et voilà, Modifier le modèle pour utiliser celui que vous venez d'entraîner est très simple.

L'étape suivante consiste à le tester.

8. Tester l'application avec votre nouveau modèle

Vous avez intégré votre modèle de classification audio dans l'application. Testons-le.

  1. Connectez votre appareil Android, puis cliquez sur l'icône Exécuter ( execute.png) dans la barre d'outils d'Android Studio.

L'application devrait pouvoir prédire correctement le son des oiseaux. Pour faciliter les tests, lancez l'une des pistes audio de votre ordinateur (lors des étapes précédentes). Votre téléphone devrait pouvoir la détecter. Dans ce cas, il s'affiche à l'écran avec la probabilité qu'il soit correct.

Bec397de3c8aaf32.png

9. Félicitations

Dans cet atelier de programmation, vous avez appris à créer votre propre modèle de classification audio avec Model Maker et à le déployer dans votre application mobile à l'aide de TensorFlow Lite. Pour en savoir plus sur TFLite, consultez d'autres exemples TFLite.

Points abordés

  • Préparer votre propre ensemble de données
  • Utiliser l'apprentissage par transfert pour la classification de sons avec Model Maker
  • Utiliser votre modèle dans une application Android

Étapes suivantes

  • Essayer avec vos propres données
  • Racontez-nous ce que vous créez

En savoir plus

Vous avez une question ?

Signaler des problèmes