https://www.pyimagesearch.com/2017/12/04/how-to-create-a-deep-learning-dataset-using-google-images/.
Il est possible de passer aussi par le package python google-images-download. Ce package permet de télécharger selon des mots clés et des filtres les images issues de Google Image, avec la limite de 100 images par requête. De cette manière, le dataset peut être créé en quelques minutes. Cependant, le choix des mots-clés est crucial.
Exemples d'utilisation du package google-images-download pour constituer un dataset d'images
L’avantage de cette méthode est une annotation immédiate pour une tâche de classification d’images. Néanmoins, en procédant de cette manière, certaines images ne correspondent pas à la recherche de photos prises par des plongeurs. Il faudrait exclure les photos provenant de pêcheurs ou les photos sans arrière-plan. Il existe aussi de nombreuses images dupliquées. Il est nécessaire d’affiner les mots clés et les filtres pour essayer d'obtenir un dataset assez proche du sujet initial. Les droits des photos et leur source sont à prendre en compte, l’accès aux photos de Google Images est libre mais pour certaines leur utilisation ne l’est pas.
Cette solution, pourtant facile à mettre en place pour une tâche de classification d’images, apparaît vite limitée en termes de diversité et nécessite un travail important de nettoyage.
Il est très rarement conseillé de mettre en place ce type de dataset à cause des limites citées précédemment. Dans de rares cas, par exemple en réponse à un appel d’offre où les données client ne sont pas accessibles, cette méthode peut apporter une solution.
La Data Science s’est démocratisée ces dernières années grâce à l’ouverture de milliers de datasets annotés pour des compétitions de Data Science. Un moteur de recherche existe: https://datasetsearch.research.google.com/. Certains de ces datasets sont devenus des références comme le dataset MNIST ou Imagenet. En effectuant une recherche rapide sur un moteur de recherche, on peut accéder à des dizaines de datasets similaires aux données du cas d’usage.
Voici quelques exemples de datasets liés à des photos de poissons trouvés par cette méthode :
Dans le cadre du cas d’usage, ces images ne correspondent pas aux conditions d’acquisition souhaitées. Les photos de pêche sont très différentes des photos de plongée. Les datasets issus de Kaggle sont intéressants pour participer aux compétitions mais ils ne sont pas forcément pertinents pour des besoins client ou utilisateur. Ils sont également très utiles et adaptés pour des formations de Data Science. De nombreux exemples de leur utilisation et des modèles créés à partir de ces données sont partagés sur la plateforme.
Exemples d'images issues d'OzFish
Ces différents datasets sont pour la grande majorité créés par des laboratoires de recherche. Ces laboratoires ont une faible probabilité de rencontrer des problématiques similaires aux nôtres. Cette méthode paraît attirante pour commencer à créer son modèle mais elle va nous éloigner de l’objectif. Ces datasets donnent à la communauté scientifique un moyen simple de comparer les modèles issus de la recherche. Tout le monde utilise la même base, la comparaison des performances des modèles est facilitée. Il faut être vigilant à la licence associée à ces datasets, ces licences peuvent être sous condition et ainsi à la recherche ou payant pour un usage industriel .
Cette solution est à envisager dans un cadre de projet de recherche ou de POC (Proof of Concept/Preuve de Concept). Dans des projets de Deep Learning, ces datasets peuvent compléter l’existant et permettent de faire du Transfer Learning plus facilement (technique d’apprentissage permettant d’appliquer des connaissances et des compétences, apprises à partir de tâches antérieures, sur de nouvelles tâches ou domaines partageant des similitudes).
Cette partie va détailler une troisième solution pour avoir un dataset le plus proche possible du besoin du client ou des utilisateurs. Dans le cadre du cas d’usage de cet article, l’objectif est d’identifier des photos provenant des plongées et non de la pêche. Une des premières démarches est de demander au client la quantité de données qu’il a en sa possession. Dans le cadre où les données sont limitées, une des pistes est de lui proposer une démarche pour permettre de constituer un dataset proche de son objectif. Par exemple, il pourra se rapprocher d’associations de plongeurs ou de groupes de plongeurs dédiés pour leur demander une collecte de leurs images tirées de leurs archives.
Contacter en amont les futurs utilisateurs de l’application est une piste à considérer dès le début d’un projet. Des ateliers peuvent être fait pour travailler avec eux et organiser une collecte de leurs photos qu'ils ont pu faire lors de leurs plongées en Méditerranée. C'est une des étapes déterminantes d’un projet de Data Science où il est nécessaire de dépenser de l'énergie. Les données récoltées seront ainsi au plus proche de l’objectif de l’application finale.
Images provenant de plongeurs (comme les images de la 1ère partie)
Une autre manière de constituer un dataset est de créer les données de façon synthétique par des logiciels 3D. Le projet Hypersym (https://github.com/apple/ml-hypersim) est un exemple de dataset pour des scènes intérieures constitué par Apple.
Cette approche est difficilement adaptable pour notre cas d’usage pour modéliser toutes les espèces de poissons. Cependant, cette article (https://www.researchgate.net/publication/331940717_Fish_species_identification_using_a_convolutional_neural_network_trained_on_synthetic_data) exploite une approche de données synthétiques en générant des images synthétiques à partir des données réelles.
Les données synthétiques sont, dans leur usage, assez proches des données obtenus par un dataset de référence (Transfer Learning, R&D). Cependant, leur construction est plus coûteuse et nécessite des ressources ayant des connaissance dans les logiciels de création 3D.
Les méthodes de constitution d’un dataset d’images énoncé ci-dessus ont chacune leurs avantages et leurs limites qui sont résumés dans le tableau suivant :
On favorise dans tous les projets industriels de travailler sur les données réalistes qui correspondent à l’objectif du projet et à la réalité terrain (ground truth).
Selon les méthodes de collecte des données, il peut être nécessaire de passer par une étape d’annotation réalisée éventuellement par une équipe d’experts. De nombreux outils existent maintenant pour l’annotation d’images tels que LabelBox (https://labelbox.com/) ou Remo (https://remo.ai/). Ce dernier permet d’organiser, d’annoter ou de visualiser des datasets d’images dans une application Web de façon privée.
Démonstration de remo.ai
Cette étape qualifiée de manuelle ou de semi-automatique (si cela consiste seulement à vérifier les labels fournis par un premier modèle) est cruciale et est souvent négligée car elle est considérée coûteuse en temps et fastidieuse par le Data Scientist. Au contraire, l’annotation permet de constituer la matière première pour créer un modèle de Machine Learning. Pour en savoir plus sur l’importance de l’annotation, on peut se référer à l’article suivant : https://blog.octo.com/deep-learning-a-lechelle-mieux-annoter-pour-mieux-scaler/
Lors de la constitution d’un dataset, les utilisateurs (ou les plongeurs) ont sûrement envoyé leurs plus belles photos mais aussi quelques photos non pertinentes avec le sujet: photo floue, ou de mauvaise qualité, trop sombre, espèce non identifiable, espèce non concernée par l’objectif, ou non triée.
Exemples de photos floues, peu contrastées, non pertinentes, ou avec des espèces non identifiables
Ces cas limites ne doivent pas être ignorés. En effet, le modèle doit aussi pouvoir traiter des cas similaires lors de l’utilisation de l’application. Il est nécessaire de définir une stratégie, des contraintes et des règles de rejet interprétables par l’utilisateur. Plusieurs stratégies peuvent être appliquées dans l’exemple de l’UC :
Un déséquilibre des classes peut apparaître dans tout dataset, car la réalité elle-même est déséquilibrée. Il est plus facile de photographier des mérous en Mer Méditerranée qu’un poisson-lune. Ce déséquilibre rend la modélisation du problème plus difficile. Le Data Scientist devra se méfier que le modèle ne sur-apprenne pas les classes majoritaires et ne sous-apprenne pas les classes minoritaires.
Des stratégies pour renforcer les classes sous-représentées peuvent être mises en place : acquisition dédiée pour une espèce ou Data Augmentation. La Data Augmentation consiste en la transformation des images initiales par des filtres et des transformations géométriques pour en créer des nouvelles. Il existe des packages Python dédiés à ce type de transformation tel que ImgAug (https://imgaug.readthedocs.io/en/latest/). Un article complet sur les données déséquilibrées est disponible sur le blog d’Octo: https://blog.octo.com/donnees-desequilibrees-que-faire/
Population déséquilibrée...
Concrètement, un dataset est souvent géré comme un dossier d’images et un dossier avec les annotations. C’est un format couramment utilisé par les datasets de référence en open-source. On peut trouver également des datasets découpés en trois parties : train/validation/test qui permet de séparer les données d’apprentissage des données d’évaluation.
La face cachée des datasets dans des projets industriels
Cependant, un dataset évolue au cours du temps pour différentes raisons. On peut en citer quatre exemples qui peuvent se présenter dans le cadre du cas d’usage:
Comme pour un code informatique, un dataset doit pouvoir suivre les règles de Semantic Versionning : https://semver.org/lang/fr/
Il existe différentes manières dont un dataset peut évoluer. Elles sont souvent passées sous silence dans la mise en place des architectures de Machine Learning ou de Deep Learning. Un des enjeux de suivi des explorations ou de mise en production d'un modèle est tout d'abord le suivi de la matière première lors de la création d'un modèle c'est-à-dire les données et leur annotation. Ces données vivent, changent et sont modulaires comme le code. Il est nécessaire de prendre conscience qu'elles doivent pouvoir évoluer. Les données issues des feedbacks lors de la mise en application du produit sont à prendre en compte dans les datasets.
SI les données n’évoluent pas, cela peut expliquer une des raisons d’obtenir des modèles biaisés. Ces modèles peuvent devenir discriminatoires et non adaptés à la problématique. Par exemple, le client veut une application qui permet d’identifier maintenant des espèces présentes en Mer Rouge en se basant sur le travail effectué pour la Mer Méditerranée. Par simplicité ou par économie, on pourra réutiliser des données issues de la collecte précédente**.** Néanmoins, il est fort probable que le modèle reconnaisse très mal les nouvelles espèces car elles vont rester minoritaires dans le dataset initial. Les espèces sont souvent plus colorées ou complètement différentes selon le contexte, on va introduire un biais inconscient au modèle.
Différence de 2 espèces de mérous: à gauche un mérou Corail (Mer Rouge) et un mérou Brun (Mer Méditerranée)
En ajoutant des cas acquis en Mer Rouge (donc en créant une nouvelle version du dataset), il est fort probable que la modélisation sera facilitée.
La capacité à faire évoluer les données va influencer les performances d’un modèle de Machine Learning.
En résumé, un dataset peut être vu de différentes manières :
Les données lors de la création d’un modèle de Machine Learning font partie du triplet code/model/data triplet comme énoncé dans l'article de Martin Fowler : https://martinfowler.com/articles/cd4ml.html. Il est important de suivre l’évolution des données et de les suivre en version, comme si les données devenaient une dépendance du code informatique.
Versionner son dataset permet :
Triplet Data/Model/Code extrait de https://martinfowler.com/articles/cd4ml.html
Lorsqu'un Data Scientist commence à créer son premier modèle, la solution la plus simple consiste à mettre ces données dans un dossier, avec un dossier données brutes et un autre avec l’annotation. Il peut y avoir sur certain projet un dossier pour séparer le dataset en Train/Test/Validation. Si des données doivent être ajoutées, cette méthode de suivi des données apparaît très limitée.
Il existe d’autres techniques qui permettent d’avoir un suivi des versions. Toutes ces techniques se basent sur Git, qui est un outil qui a fait ses preuves pour suivre les versions de code:
Créer des listes des chemins (avec des chemins Cloud ou local) vers les données, ajouter ces fichiers texte à un dépôt Git: technique assez simple qui permet de garder un suivi, de le versionner facilement, adaptable et modifiable. Il est ainsi facile de relancer un apprentissage avec une version du code, une version du dataset, et de pouvoir comparer les résultats avec une autre version.
Une méthode plus évoluée consiste à stocker les informations de chemins des données (et pas forcément les données) et leur annotation dans une base de données (BDD). Cette méthode a l’avantage de pouvoir stocker des informations annexes à l’annotation : nom de l’annotateur, date d’ajout, date d’annotation, session, version … Le stockage en BDD permet de créer aussi facilement des filtres à partir de requêtes SQL. Ces requêtes SQL sont stockées au niveau du code et de la création du modèle, ce qui permet de relancer facilement un apprentissage dans les mêmes conditions.
Des outils dédiés au suivi de version des données commencent à apparaître dans les outils du Data Scientist, tel que DVC (https://dvc.org/). DVC est conçu pour rendre les modèles ML partageables et reproductibles. Il est conçu pour traiter les fichiers volumineux, les jeux de données, les modèles d’apprentissage automatique, les mesures ainsi que le code. Un article complet est disponible sur le blog d'Octo : https://blog.octo.com/mise-en-application-de-dvc-sur-un-projet-de-machine-learning/
À travers cet article, plusieurs aspects sur la constitution d’un dataset ont été détaillés et mis en valeur : la création, la gestion et le suivi. Un dataset est la matière première de tout projet de Data Science.
Plusieurs méthodes de constitution d’un dataset ont été expliquées avec chacune leurs avantages et leurs limites. Un premier objectif est de collecter un maximum de données au plus proche de la cible finale. Pour cela, des ateliers pour créer un dataset sont nécessaires en amont, avant même les réflexions liées au modèle à mettre en place. Nous avons également vu que l’annotation du dataset et la gestion des cas limites sont des étapes souvent inévitables.
Toutes ces approches ont comme enjeu de favoriser l’apprentissage du modèle. L’apprentissage d’un modèle, tout comme le niveau des performances obtenues, dépendent en effet de la qualité des données et des annotations.
Finalement, un dataset doit avoir la possibilité d’évoluer et de se transformer. La démarche que nous préconisons consiste à traiter un dataset comme du code informatique avec des versions et un suivi de version associé.