Une cartographie des oiseaux (#53)

Pour introduire le propos à qui lira cet article, ouvre tes oreilles :

Dans l’avant-dernier article de ce blog, j’évoquais le cas de ChatGPT et de mon usage de l’outil pour transformer des scripts finalement assez sommaires (voir PDF, Gallica, Python et ChatGPT). Finalement, l’intelligence artificielle (IA), tel qu’elle s’offre à nous aujourd’hui, est fort utile pour éviter de traiter des données de manière automatique. Le passage de l’idée à la conception est plus court, c’est de cette manière que je conçois mon approche. Étape 1 : « je veux faire ça » → « il me faut ça » → « je demande à ChatGPT de faire ceci » → « OK, passons à l’étape 2 ». Étape 2 : « avec le résultat de Étape 1, je veux faire ça » → « ChatGPT, cette étape bloque, sais-tu pourquoi ? » etc. Et ça marche. Pour introduire les oreilles de qui lira cet article, voici ce bref morceau :

Avec ces compétences en programmation apprises sur le tas, une connaissance rapide de Python suffit pour arriver à ses fins. J’ai en tête plein d’outils, pas forcément utiles, mais que je veux faire fonctionner. Dans le précédent article, je parlais spécifiquement d’un téléchargement d’images en lot, mais il s’agit aussi de visualisation des données. Avec le travail effectué dans le cadre de mon mémoire de master, j’ai appris les rudiments du HTML/CSS ainsi que la projection de points sur des cartographies numériques.

Alors, où l’aventure des données va-t-elle donc me mener ? Dans les airs, je dirais. Pour suivre le battement des plumes des Aves, c’est le nom scientifique qui caractérise la classe des oiseaux, ça change, un peu. D’où viennent les données que je souhaite exploiter ? Pour m’éviter de trop parler et oublier de mettre en valeur le travail que je souhaite présenter, je l’affiche directement ici, j’expliquerai après, tada !

Carte des espèces d’Oiseaux (Alexandre Wa, 2022-2024)

Alors, par où commencer ? Je vais d’abord parler du fond, ce qui m’a motivé, avant toute chose. On peut aimer les oiseaux, les observer, les écouter, mais comment les enregistrer ? Finalement, c’est très difficile de les photographier sans appareil adéquat. J’en veux pour preuve celle prise ci-dessous : un pic vert capturé dans un jardin. Je n’avais jamais eu l’occasion d’en voir un hors de la cime des arbres. J’ai donc pris des jumelles et j’ai réalisé la photographie à travers l’une des lunettes. Le résultat est, il faut bien l’avouer, très mauvais.

Très mauvaise photographie d’un pic vert, mai 2020.

La photographie est moche, certes, mais au moins, je l’ai prise ! Je me rappelle d’autres oiseaux que je n’ai pas pu immortaliser par l’image : un martin-pêcheur qui longeait la Meuse avec moi, de nombreux hérons que je suis allé déranger par mon passage, plusieurs espèces visibles au parc du Marquenterre, ou encore un balbuzard pêcheur dans le Loiret. À mon sens, l’oiseau symbolise la beauté de la nature plus que beaucoup d’autres animaux. Je ne vois pas la majesté ni la liberté dans un pigeon qui fouille les poubelles d’un square parisien, mais je la trouve dans la singularité de l’oiseau qui s’en va quand je viens. Il y a quelque chose d’insaisissable visuellement, mais qui dérange moins les âmes volatiles quand on les écoute ? J’en profite pour couvrir ce texte d’un habillage sonore qui fera écho à la collection de sons produits par des oiseaux :

Capture d’écran de l’application BirdNET, 2024

Moins farouches quand on capture leurs sons, les oiseaux sont donc plus faciles à enregistrer avec un dictaphone. On entend plus aisément une mésange charbonnière, en distinguant le cri de son chant. Bon, j’ai établi le sujet, parlé du type de données que je vais bidouiller. Maintenant, il faut évoquer l’outil de capture sonore. Il s’agit de l’application BirdNET. C’est un outil de recherche conçu par le laboratoire d’ornithologie de Cornell et le Chemnitz University of Technology. BirdNET utilise des algorithmes de machine learning pour analyser les enregistrements audio et reconnaître les espèces d’oiseaux à partir de leurs sons. L’application est utilisée par les ornithologues amateurs et les scientifiques pour mieux comprendre la biodiversité aviaire. Elle aide à cartographier les populations d’oiseaux et à surveiller leur état de conservation.

Pour les amateurs, le principe est donc simple : on installe l’application sur son téléphone, on enregistre le son des oiseaux, BirdNET donne une conjecture pour établir de quelle(s) espèce(s) d’oiseau(x) il s’agit, avec un niveau de certitude établi.

Pour aller plus loin, j’ai vu qu’il était possible d’extraire les données créées à partir des enregistrements. On obtient alors deux fichiers pour chaque enregistrement : un fichier .wav, qui correspond à la piste sonore, et un fichier .txt contenant toutes les informations créées lors de cet enregistrement, notamment la date, le lieu, les conjectures ou encore la version de l’application utilisée. Ce fichier .txt, on n’y comprend rien. Il s’agit en réalité d’un fichier .json qu’il faut restructurer. Une fois que c’est fait, on obtient les informations présentées de cette manière :

Untitled1

Il y a donc plus d’informations que ce qu’affiche l’application. D’abord, le chemin d’accès au fichier, ou filepath, permet de connaître la date de l’enregistrement ainsi que l’identifiant qui lui a été attribué. Ensuite, il y a la liste des prédictions qui permettent à BirdNET d’établir le degré de certitude pour identifier les espèces d’oiseaux en fonction de l’enregistrement sonore. Lorsque le score affiche strictement « 1.0 », c’est que l’application est certaine, presque de manière infaillible, que l’espèce mentionnée est correctement identifiée. Les autres conjectures, plus relatives sur cet exemple, proposent d’autres espèces. Avec tous mes enregistrements exportés – un peu moins de 250 – j’ai choisi de ne retenir que ceux dans lesquels le fichier affichait un score de 1.0, histoire de faire du tri ! Sous le score, on trouve d’ailleurs les espèces détectées, avec leur nom vernaculaire anglophone ainsi que leur nom savant, en latin. L’autre information qui peut être utile, c’est « city », car l’application parvient à identifier la commune d’enregistrement, même si ce n’est pas toujours le cas. Enfin, informations les plus essentielles pour ce que j’ai voulu faire : les coordonnées GPS latitude (lat) et longitude (lon), qui permettent de localiser l’enregistrement sur une carte dynamique.

Kitagawa Utamaro, Myriades d’oiseaux, vue n°4/10, vers 1792, Bibliothèque de l’INHA, collections Jacques Doucet, NUM 4 EST 459 (1).

Je dois aussi convertir en lot chaque fichier .txt en fichier .json. Maintenant, je mets de côté les fichiers qui ne contiennent pas d’enregistrement avec un score correspondant à « 1.0 ». Toutes ces manipulations passent par des scripts Python qui, une fois exécutés localement, me permettent de reconstruire les données brutes telles que je souhaite qu’elles apparaissent dans la future carte.

Bon. J’ai plusieurs dizaines de fichiers .json.

Je souhaite alors les compiler dans un fichier tableur pour ne retenir, dans les colonnes, que la date, l’espèce, la ville et les coordonnées géographiques. C’est fait. J’ai désormais puisé dans ces fichiers .json les informations que je voulais. Finalement, est-ce suffisant ? Nécessaire, oui. Suffisant, pas vraiment. Pour les compléter, je demande également à l’intelligence artificielle de ne retenir que les noms latins des espèces, puis de me trouver le nom vernaculaire en français. Quitte à requérir à Wikidata, autant requêter un maximum : donne-moi aussi l’identifiant Wikidata de l’espèce et un lien d’illustration qui sera compressé dans une fenêtre d’affichage ! Jackpot. J’ai désormais toutes les informations dans mon tableur. Il ne reste plus qu’à construire ma carte en HTML.

La carte interactive que je souhaite montrer proposera une projection de 68 points à partir des coordonnées fournies. Les points correspondent donc au lieu des enregistrements, dont la couverture temporale va du 1er janvier 2022 au 14 septembre 2024. Pour convertir mon tableur en page HTML ayant intégré les données, j’utilise toujours l’IA et Python. L’idée est de créer un script qui analysera les colonnes de chaque cellule du tableur pour les intégrer à un modèle de page HTML préconfiguré, comportant déjà le fonds de carte, les paramètres de navigation et les informations qui figureront sur la boîte de dialogue lorsque l’on cliquera sur le point projeté. Après quelques perfectionnements, l’IA n’étant pas infaillible, la carte est fonctionnelle. J’ai choisi de la centrer sur la France puisqu’une large majorité des enregistrements y a été effectuée. Une fois que l’on clique sur le point bleu, on obtient les informations, comme sur cet exemple :

Exemple d’informations disponibles pour un enregistrement sonore.

À l’origine, je voulais avant tout rendre disponible les informations des fichiers json ainsi qu’insérer la piste son. Finalement, j’ai légèrement augmenté les informations disponibles en demandant à l’IA d’en trouver plus à partir de ce que j’avais à lui donner. Toutes les pistes mp3 ont été hébergées sur ce blog par souci de centralisation et de facilité. Je n’ai pas commenté les différentes espèces collectées à travers ces enregistrements : ça pourrait être le lieu, mais je préfère rendre l’outil disponible sans commenter le contenu. D’ailleurs, ce dernier a beau être varié en termes de localisation, il n’en demeure pas moins que les espèces sont loin d’être rares, hormis quelques-unes !

Quoi qu’il en soit, j’ai beaucoup apprécié ce rapide exercice de traitement des données. C’était un cas de figure intéressant qui m’a permis de voir si je pouvais faire confiance à l’IA pour mettre sur pied ce bidule qui s’apparente à un Pokédex. La réponse est oui, mais avec une certaine limite. Le squelette du code HTML a bien aidé, mais il faut avoir a minima en tête ce que l’on veut créer. Vient ensuite le dialogue avec la machine pour optimiser l’affichage et son ergonomie. Dernier point : le fonds de carte. ChatGPT proposait des contenus émanant d’OpenStreetMaps. Je souhaitais avoir une carte représentant le relief, mais elle était lente à l’affichage. J’ai donc opté pour un fonds assez sobre, mais rapide et précis une fois que l’on zoome sur une zone, à travers le thème Outdoors de Thunderforest.

The birds of America. 16, Plate 77, Belted Kingsfisher, Male 1 & 2. F[emale]. 3, John J. Audubon ; Engraved, Printed & Coloured by R. Havell Jun, Drawn from Nature and Published by John J. Audubon, 1830 (Gallica, BnF).

La carte ci-dessus est également disponible à l’adresse :

https://alexandrewa.com/oiseaux/

Image de couverture : Giuseppe Castiglione (郞世寧), détail d’une image de fleurs de pêchers de l’album Xian’e Changchun (仙萼長春冊, 桃花圖), entre 1722 et 1735, Musée national du palais, Taïwan (Wikimedia commons).

Alexandre Wauthier