Utiliser des données synthétiques pour améliorer les performances de votre modèle de détection d'objets

Les contributeurs
Jules Talloen
Ingénieur en machine learning
Aucun élément trouvé.
S'abonner à la newsletter
Partager cet article

Un guide pratique pour générer des données artificielles avec Unity Perception

Quiconque a déjà entraîné un modèle d'apprentissage automatique vous dira que ce sont les données qui font le modèle et qu'en général, plus de données et d'étiquettes permettent d'obtenir de meilleures performances. La collecte de données et surtout leur étiquetage prennent du temps et sont donc coûteux. C'est pourquoi les professionnels de l'apprentissage automatique recherchent de plus en plus des moyens plus efficaces d'"augmenter" leur ensemble de données en utilisant des variations d'échantillons de données générées artificiellement, mais aussi de plus en plus l'utilisation de données hybrides ou entièrement synthétiques.

La société Unity, spécialisée dans les moteurs de jeu, propose un outil appelé Unity Perception qui vous permet de simuler des objets de différentes manières et de prendre des photos virtuelles de vos simulations. De cette manière, il devient possible de générer un grand nombre d'images étiquetées à partir de vos scans d'objets, qui peuvent être utilisées comme données d'entraînement.

Dans ce billet, je présente les résultats de mon stage chez ML6, au cours duquel j'ai étudié l'utilisation de Unity Perception pour générer des données d'entraînement pour un modèle de détection d'objets. Plus particulièrement, je décrirai comment j'ai :

  1. obtention de scans d'objets à l'aide d'une caméra Lidar
  2. a généré un ensemble de données synthétiques pour ces objets en utilisant Unity
  3. des modèles de détection d'objets entraînés à l'aide d'images synthétiques et réelles
  4. évaluer les avantages potentiels de l'ajout d'images synthétiques à l'ensemble d'entraînement

Numérisation des objets

Pour créer des maillages d'objets, j'ai utilisé une application appelée Scaniverse sur un téléphone équipé d'une caméra lidar. Pour bien faire, il y a quelques conditions à remplir. Vous devez être en mesure de capturer l'objet de tous les côtés et vous avez besoin d'un éclairage bon et égal sur tous les angles de l'objet.

J'ai donc placé les objets sur un piédestal avec un bon éclairage, j'ai scanné les objets à l'aide de l'application et j'ai ensuite pris une photo séparée de la surface inférieure pour l'ajouter au maillage de l'objet dans Blender. Avec Scaniverse, vous pouvez exporter vos objets sous forme de fichiers fbx ou obj, tous deux compatibles avec Blender et Unity.

Exemple de numérisation d'un objet dans Blender

Cependant, tous les objets n'ont pas été faciles à scanner. En particulier, les objets avec des surfaces réfléchissantes, des segments fins ou transparents ont été difficiles à scanner avec cette méthode. Si les scans ne sont pas excellents, il est toujours possible de les éditer après coup en utilisant Blender.

Principalement pour les recadrer et les recentrer ; ou pour les combiner avec une face inférieure afin d'obtenir un objet complet.

J'ai également effectué plusieurs scans pour chaque objet afin d'augmenter la variation des objets dans les images synthétiques, et j'ai pris environ 200 photos de chaque objet scanné dans différentes pièces et positions. J'ai essayé de placer les objets à différents endroits et j'ai pris des photos sous différents angles. J'ai veillé à ce que les photos soient parfois plus floues ou qu'elles ne montrent que partiellement l'objet afin d'accroître encore la variation.

Vous trouverez ci-dessous des scans des trois objets avec lesquels j'ai travaillé : une chaussure, une canette de Coca Cola et une boîte de céréales Kellogg's.

J'ai choisi ces objets pour les raisons suivantes

  1. Ils étaient faciles à déplacer et à photographier manuellement
  2. Ils s'intègrent dans les décors d'intérieur.
  3. Ils sont très différents en termes de couleur, de structure et de propriétés réfléchissantes
Exemple de scans d'objets dans la perception Unity

Générer des données synthétiques dans Unity Perception

Unity Perception est une boîte à outils permettant de générer des ensembles de données. Il est relativement nouveau et ne fonctionne pour l'instant que sur des cas d'utilisation basés sur des caméras. Il s'agit d'un plugin pour Unity, un moteur de jeu et un IDE multiplateforme.

Pour générer des images d'entraînement, j'ai utilisé une simulation qui place vos objets avec des rotations, des échelles et des positions aléatoires devant un arrière-plan et devant une source lumineuse et une caméra. Les objets ont été dessinés avec une probabilité égale ; chaque classe a été représentée de manière égale.

Unity perception UI

Pour plus de variation, j'ai randomisé l'intensité de l'éclairage et j'ai utilisé différentes propriétés de lissage pour les objets et différents types de génération d'arrière-plan. J'ai utilisé le même schéma de génération d'arrière-plan que celui utilisé par unity dans son tutoriel pour Unity Perception, consistant en des objets aléatoires avec des textures aléatoires comme arrière-plan. Cela permet d'obtenir un arrière-plan très différent pour chaque simulation, sans autres objets reconnaissables que les classes d'objets. En règle générale, il s'agit d'une bonne base de départ (cette situation est appelée Simulation 1 dans le graphique ci-dessous).

Tutoriel sur la simulation d'arrière-plan

Cependant, l'entraînement sur ces seules images n'a pas donné de très bons résultats, c'est pourquoi j'ai essayé de passer à une image d'arrière-plan aléatoire à la place. Ces images d'arrière-plan ont été échantillonnées à partir d'un ensemble de données en ligne de scènes d'intérieur. Cela a permis d'améliorer considérablement les résultats, comme le montre le graphique ci-dessous. L'ensemble de données à partir duquel ces images d'arrière-plan sont échantillonnées doit être choisi en fonction du contexte naturel de votre classe d'objets.

Simulation avec image de fond

Pour améliorer encore la scène, j'ai ajouté des objets aléatoires, mais en moins grand nombre et au premier plan. Ces objets masquent parfois partiellement les classes et rendent la scène plus diversifiée.

Simulation avec image de fond et objets aléatoires

Une autre amélioration que j'ai apportée est l'utilisation de plusieurs maillages d'objets pour la même classe d'objets. Cela permet d'améliorer les résultats pour les objets plus complexes.

Entraînement des modèles de détection d'objets

J'ai utilisé l'API de détection d'objets Tensorflow pour entraîner les modèles. J'ai importé des modèles pré-entraînés à partir du zoo de modèles Tensorflow et je les ai ensuite affinés sur mes données. J'ai choisi de travailler avec un mobilenet, car c'est un modèle relativement rapide qui me permet d'obtenir des résultats décents en peu de temps.

Lors de la prise de vue, j'ai déplacé les objets à un endroit différent pour chaque photo et j'ai pris des photos sous plusieurs angles. J'ai également pris des photos dans lesquelles les objets étaient soit partiellement masqués, soit pas entièrement dans le cadre ; toutes les photos ont été prises avec le même téléphone et dans la même qualité.

J'ai utilisé LabelImg pour étiqueter manuellement les images avant de les répartir dans un ensemble de formation (80 %), de validation (10 %) et de test (10 %). L'ensemble de validation a été utilisé pour choisir les hyperparamètres du modèle et l'ensemble de test pour l'évaluation finale. Les photos de l'ensemble de test ont été prises dans des pièces différentes de celles de l'ensemble d'entraînement ; il en va de même pour l'ensemble de validation.

J'ai veillé à ce que chaque classe soit représentée de manière égale dans toutes les partitions. J'ai ajouté les images synthétiques à l'ensemble d'apprentissage ; les ensembles de validation et de test étaient constitués uniquement d'images du monde réel.

Pour mesurer la performance des modèles, j'ai utilisé la précision moyenne (mAP) à 0,5 Intersection over Union score et le rappel moyen (AR) à 10 prédictions (Vrai positif lorsque l'objet est détecté dans les 10 premières prédictions).

Le mAP permet de mesurer la précision des détections. L'AR, quant à lui, mesure la capacité du modèle à trouver tous les positifs (voir aussi ici).

Expériences

J'ai entraîné des modèles en utilisant uniquement des images du monde réel, uniquement des images synthétiques ou un mélange des deux. En comparant les résultats, je montre l'avantage d'ajouter des images synthétiques et la meilleure répartition monde réel/synthétique dans les images d'entraînement à utiliser. Les modèles mixtes ont été entraînés en utilisant le même schéma d'échantillonnage pour les images réelles et synthétiques. Avec des schémas d'échantillonnage différents, vous pouvez probablement obtenir des modèles encore meilleurs. Cependant, j'ai utilisé le même échantillonnage pour des raisons de simplicité.

Une autre façon d'entraîner ces modèles consiste à les entraîner d'abord uniquement sur des données synthétiques, puis à les affiner sur des données réelles. Pour moi, cette méthode a donné des résultats similaires, mais légèrement moins bons. Cependant, les modèles étaient assez simples et je suis sûr qu'il est possible de les améliorer.

J'ai entraîné des modèles mixtes sur les 4 différents types de simulations d'arrière-plan présentés dans la section précédente. Le tableau ci-dessous résume les résultats de mAP/AR pour ces simulations :

Simulation 1 : simulation didactique ; simulation 2 : utilisation d'images d'arrière-plan ; simulation 3 : utilisation d'images d'arrière-plan avec des objets aléatoires ; simulation 4 : utilisation de maillages multiples pour chaque objet. modèles entraînés avec 1000 images synthétiques et 500 images du monde réel

Comparaison des performances entre différents fractionnements synthétiques/monde réel

Tout d'abord, je voulais voir quelle était la qualité des modèles synthétiques et quelle était la plus petite quantité d'images réelles nécessaire pour obtenir des résultats décents. J'ai entraîné les modèles uniquement synthétiques avec 1000/2000/5000/100000 images synthétiques ; tous ont eu à peu près le même score autour de 0,3 mAP@0.5IoU, ce qui n'est pas très bon. Quelques exemples de résultats pour les différents modèles peuvent être trouvés dans les images à la fin de ce billet.

J'ai ensuite entraîné les modèles avec 0, 30, 100, 300 et 530 images réelles en plus des 1000 images synthétiques et j'ai comparé les résultats.

Comparaison entre les modèles formés sur différentes quantités d'images du monde réel

J'ai remarqué que les scores mAP et AR augmentaient au fur et à mesure que j'ajoutais des images du monde réel à l'ensemble d'entraînement jusqu'à ce que j'aie ajouté 300 images du monde réel ; les 230 images supplémentaires dans le dernier modèle de 530 images d'entraînement du monde réel n'ont pas semblé beaucoup aider. Le modèle 1000 images synthétiques/300 images réelles a pu détecter la plupart des objets dans les images, manquant principalement certaines détections de chaussures.

Jusqu'à présent, j'ai seulement montré qu'un mélange des deux est meilleur que des données synthétiques uniquement, mais pas à quel point les données synthétiques améliorent nos modèles. J'ai donc entraîné un modèle uniquement sur les 300 images du monde réel. Les résultats ont été très médiocres, voire pires que ceux du modèle basé uniquement sur des données synthétiques. En évaluant ce modèle, j'ai remarqué qu'il détectait presque exclusivement les canettes de Coca-Cola, ce qui me montre que si 100 images suffisent pour entraîner un modèle de détection d'objets pour les canettes de Coca-Cola, ce n'est pas suffisant pour les deux autres classes. Cependant, à des fins de test, j'ai continué à utiliser le même ensemble d'entraînement d'environ 100 images pour chaque classe.

J'ai ensuite ajouté seulement 300 images synthétiques à l'ensemble d'apprentissage et j'ai déjà remarqué que les scores avaient plus que doublé. Cependant, lorsque j'ai continué à ajouter des données synthétiques, les modèles ont commencé à être moins performants. Peut-être que l'utilisation d'un schéma d'échantillonnage différent pour les données réelles pourrait me permettre d'ajouter davantage d'images synthétiques à l'ensemble d'entraînement.

Comparaison entre les modèles formés sur différentes quantités d'images synthétiques

Comparaison des performances des différentes classes

Lors de l'évaluation manuelle des modèles, j'ai remarqué des différences importantes dans la manière dont certains modèles détectaient les classes. Je les ai donc évalués pour chaque classe séparément et j'ai examiné les résultats.

modèles entraînés sur 5000 images synthétiques, 500 images du monde réel et un mélange de 2000 images synthétiques et 300 images du monde réel ; évalués sur chaque classe séparément

La classe des chaussures obtient de mauvais résultats dans la plupart des modèles ; c'est l'objet le plus complexe que j'ai utilisé et aussi le moins coloré, ce qui peut contribuer à ses faibles résultats. Par complexe, j'entends qu'il est différent sous tous les angles et qu'il comporte des segments minces qui peuvent être déplacés dans les lacets.

Les modèles du monde réel reconnaissent très bien les canettes de Coca-Cola, mais ils échouent pour les autres classes. En revanche, avec les modèles synthétiques, les canettes de Coca-Cola ne sont pas détectées aussi facilement. Cela peut être dû à leurs propriétés réfléchissantes, qui ne sont pas bien simulées dans Unity Perception. Cependant, il existe des options dans Unity pour mieux simuler les réflexions, que je n'ai pas entièrement utilisées mais qui pourraient certainement être utiles dans ce cas.

La boîte de céréales Kellogg's est un objet "plus simple" et obtient de très bons résultats avec les données synthétiques seules ; cela montre que pour ce type d'objets, un ensemble de données synthétiques seules peut déjà fournir d'excellents résultats.

Exemple de détection d'un modèle entraîné sur 300 images du monde réel
Exemple de détection d'un modèle entraîné sur 1000 images synthétiques
Exemple de détection d'un modèle entraîné sur 300 images réelles et 1000 images synthétiques

Conclusion

Dans cet article, j'ai montré que l'ajout d'images synthétiques aux modèles de détection d'objets peut grandement améliorer vos modèles. J'ai expliqué étape par étape comment procéder, depuis la numérisation des objets jusqu'à l'entraînement des modèles de détection d'objets. J'ai montré que les meilleurs résultats sont obtenus avec un modèle entraîné sur un mélange d'images réelles et synthétiques et que vous pouvez déjà obtenir des résultats décents avec peu d'images réelles si vous ajoutez des données synthétiques. J'ai également conclu que les objets simples, comme la boîte de Kellogg, bénéficient grandement de l'ajout d'images synthétiques. Il est plus difficile d'obtenir des maillages représentatifs d'objets comportant des segments minces, transparents ou réfléchissants ; cependant, même les modèles entraînés sur ces objets obtiennent de meilleurs résultats avec l'ajout de données synthétiques.

Il est possible que pour les modèles comportant un très grand nombre d'images qualitatives du monde réel, l'ajout de données synthétiques n'apporte pas d'améliorations. Toutefois, pour les modèles comportant peu d'images qualitatives du monde réel, comme dans mon exemple, l'ajout de données synthétiques améliore considérablement les résultats. En conclusion, je suis satisfait des résultats, car les améliorations apportées par l'ajout de données synthétiques ont été encore plus importantes que prévu. J'espère que ce billet vous sera utile et qu'il vous incitera à essayer cette méthode et à améliorer les simulations pour obtenir des résultats encore meilleurs !

Postes connexes

Voir tout le contenu
Aucun résultat n'a été trouvé.
Il n'y a pas de résultats correspondant à ces critères. Essayez de modifier votre recherche.
Grand modèle linguistique
Modèles de fondation
Entreprise
Personnes
Données Structurées
Chat GPT
Durabilité
Voix et son
Développement frontal
Protection des données et sécurité
IA responsable/éthique
Infrastructure
Hardware et capteurs
MLOps
IA générative
Natural Language Processing
Vision par ordinateur