• Aucun résultat trouvé

Expérimentations sur BarkNet 1.0

2.3.1 Séparation du jeu d’entraînement et de test

Il existe plusieurs façons pour séparer le jeu d’entraînement et le jeu de test. La façon la plus simple consiste à sélectionner des images au hasard parmi toutes celles disponibles. L’autre possibilité est de séparer au niveau des arbres. C’est-à-dire que toutes les images provenant d’un seul arbre se retrouve soit dans le jeu d’entraînement, soit dans le jeu de test. Il n’y a pas de mélange entre les deux. Pour cette expérience, nous avons pris deux réseaux de types densenet121 pré-entraîné sur ImageNet et avons entraîné les modèles sur deux cas de tests différents. Dans le premier, les images ont été séparées aléatoirement entre le jeu d’entraînement et le jeu de test. Dans le deuxième, les arbres ont été séparés entre les deux jeux. Encore une fois, les deux réseaux ont été entraînés en utilisant les mêmes hyper-paramètres, soit pendant 60 epochs avec un taux d’apprentissage de lr = 0.0001 qui était réduit par un facteur 5 à chaque 20 epochs.

Type Entraînement Test

Séparation des images 97,24% 98,98% Séparation des arbres 97,36% 93,54%

TABLE2.8 – Résultats selon différentes méthodes de séparation des images

Le tableau2.8montre les résultats obtenus. Comme on peut le constater, les deux réseaux ont obtenu une performance similaire en entraînement, ce qui était attendu. Toutefois, il est intéressant de consta- ter que dans le cas de la séparation des images de façon aléatoire, le réseau a obtenu 98,98% en test comparativement à 93,54% lors de la séparation des arbres. Cette différence entre les deux résultats n’est pas négligeable.

En regardant uniquement ces chiffres, il serait facile de dire que la méthode de séparation des images est la meilleure. Toutefois, il y a certains indices qui laissent sous-entendre que ce n’est pas le cas. Premièrement, la performance en test est excessivement bonne ce qui porte à croire le réseau a réussi à apprendre par coeur les arbres du jeu d’entraînement au lieu d’apprendre à vraiment reconnaître les essences. Deuxièmement, ce qu’on souhaite toujours obtenir après un entraînement, c’est un modèle qui va bien généraliser sur des données inconnues. Dans le cas du problème de classification d’essence d’arbres, ce sont de nouveaux arbres. Avec la méthode de séparation des images, on ne peut pas connaître la vraie performance de ce modèle sur un arbre inconnu, car tous les arbres ont déjà été vus

en entraînement. C’est pourquoi, la valeur indiquée par le deuxième modèle est beaucoup plus fiable. Par conséquent, cette façon de procéder a été utilisée dans notre méthodologie.

2.3.2 Effet du pré-entraînement

Une des premières questions que nous nous sommes posées était de savoir si utiliser un réseau de neurones pré-entraîné sur ImageNet serait bénéfique pour notre problème. En effet, dans la littérature, il est fréquemment rapporté que le pré-entraînement donne de bons résultats (Sun et collab.(2017)). Toutefois, les images de notre problème étant très différentes de toutes celles présentes dans ImageNet, nous nous sommes posé la question à savoir si les caractéristiques extraites par un réseau pré-entraîné seraient vraiment bénéfiques pour la classification d’écorce d’arbres.

Pour vérifier l’effet du pré-entraînement, nous avons entraîné 2 modèles distincts. Les deux modèles utilisent exactement la même architecture, soit un resnet18. Toutefois, ils ont été initialisés diffé- remment. Le premier utilise les poids qui ont été pré-entraînés sur ImageNet. Seule la couche de classification utilise de nouveaux poids, qui ont été initialisés avec la méthode Kaiming uniforme. Le deuxième modèle utilise l’initialisation par défaut du resnet implémenté dans la librairie PyTorch. C’est-à-dire une initialisation Kaiming normale pour les poids des couches de convolution et une initialisation Kaiming uniforme pour la couche linéaire.

De plus, les deux modèles ont été entraînés en utilisant exactement les mêmes hyper-paramètres. Ils ont été entraînés pendant 100 cycles avec une taille de lot de 64. Le taux d’apprentissage initial était de lr = 0.0001 et il était divisé par 5 à chaque 20 cycles. Le tableau2.9montre les résultats obtenus par chacun des modèles.

Initialisation Précision en entraînement Précision en test

Pré-entraîné 97,5% 95,50%

Par défaut 87,86% 90,96%

TABLE2.9 – Résultat avec et sans pré-entraînement

Comme on peut le constater, pré-entraîner le réseau permet d’accélérer énormément l’entraînement. En effet, dans la figure 2.7, le réseau pré-entraîné atteint une performance en entraînement de près de 90% en moins de 10 cycles alors que le réseau initialisé par défaut n’atteint même pas cette per- formance après 100 cycles. La performance finale de ce dernier était d’ailleurs encore loin d’être intéressante. De plus, le réseau utilisant l’initialisation par défaut n’obtenait plus beaucoup de gain malgré la réduction du taux d’apprentissage. Cela signifie que, même en continuant l’entraînement pendant très longtemps, le réseau n’aurait probablement pas atteint le taux de performance du réseau pré-entraîné. La différence entre les deux courbes étant d’ailleurs relativement constante après environ 50 cycles.

Un point intéressant à remarquer est que le réseau initialisé par défaut a étrangement obtenu une performance supérieure en test. Deux hypothèses peuvent expliquer ce phénomène. Tout d’abord,

FIGURE2.7 – Courbe d’entraînement selon l’initialisation

l’entraînement n’était pas encore terminé et le réseau n’avait pas encore eu le temps de faire du sur- apprentissage. Cependant, l’hypothèse la plus probable est que cette différence est causée par la façon dont les deux résultats ont été obtenus. Pendant l’entraînement, la performance est calculée en utilisant une seule crop aléatoire dans l’image alors qu’en test, un vote de majorité est fait sur toutes les crops de l’image ce qui améliore les résultats (voir section3.3.1).

2.3.3 Architecture

Une des questions qu’il est important de se poser lors du développement d’un algorithme utilisant l’apprentissage profond est celui de choisir l’architecture la mieux adaptée pour le problème. Comme les performances de chaque architecture peuvent varier en fonction du problème, il est important d’en tester quelques-unes pour savoir laquelle devrait être utilisée. En quelque sorte, l’architecture est une forme (vague) d’hyper-paramètres.

C’est pourquoi nous avons entraîné une autre architecture sur nos données, afin de savoir si elle per- mettrait d’obtenir de meilleurs résultats. Cependant, étant donné qu’utiliser un réseau pré-entraîné permet d’accélérer l’entraînement et d’obtenir de meilleurs résultats tels que montré dans la section

2.3.2, nous avons seulement considéré les architectures dont PyTorch fournissait un modèle pré- entraîné sur ImageNet. De plus, afin de comparer les modèles sur un même pied d’égalité, nous avons uniquement utilisé deux modèles qui fournissaient des performances similaires en test sur ImageNet.

Pour ce faire, nous avons consulté la page web de PyTorch répertoriant les modèles3. Parmi les meilleurs modèles disponibles, trois semblaient prometteurs : resnet, densenet et inception v3. Au final, nous n’avons pas pu tester le modèle inception v3 , car son implémentation différait grandement des autres et il n’était pas compatible avec le reste du code. Les modèles testés ont donc été le resnet50 et le densenet121.

Modèle Précision en entraînement Précision en test Temps d’entraînement

resnet 50 96.87 95.96 ∼4h45m

densenet 121 97.44 96.06 ∼4h40m

TABLE2.10 – Comparaison entre différents modèles.

Le tableau2.10présente les résultats que nous avons obtenus. Dans les deux cas, les performances en test sont très impressionnantes. Les deux résultats sont aussi très similaires, avec densenet qui semble être légèrement supérieur. Toutefois, les résultats sont si proches que cela peut possiblement être expliqué par la variance présente lors de l’entraînement. C’est pourquoi, nous n’avons pas considéré ces différences comme significatives. Il en va de même pour les temps d’entraînement. Au final, nous avons choisi l’architecture resnet, car d’autres versions plus petites étaient disponibles, soit resnet18 ou resnet34. Ceux-ci nous permettaient d’accélérer le temps d’entraînement lorsque des tests étaient à effectuer ce qui représente un avantage non-négligeable lors du développement, en permettant de sauver plusieurs heures, voire plusieurs jours, sur les temps d’entraînement.

2.3.4 Normalisation des données

Pour toutes nos expériences, nous n’avons pas fait de normalisation générale de nos données. Cela s’explique par le fait que nous n’avons pas remarqué de difficultés à entraîner les réseaux, même sans cette normalisation. Une hypothèse est qu’avec la normalisation par lot, il n’est plus nécessaire de pro- céder à cette normalisation générale des données. De plus, calculer les valeurs pour la normalisation est un processus qui prend considérablement de temps. Comme la composition de BarkNet 1.0 chan- geaient fréquemment, en particulier au début de la conception, il était fastidieux de toujours refaire cette normalisation.

Le réseau ayant été pré-entraîné sur ImageNet, nous nous sommes demandés s’il était possible d’uti- liser directement les paramètres de normalisation d’ImageNet. La table 2.11montre les paramètres de cette normalisation, tirée directement du code de Pytorch (Paszke et collab.(2017)). La table2.12, quant à elle, montre les résultats obtenus. Comme on peut le remarquer, il ne semble pas y avoir une différence marquée reliée à la normalisation des images en entrée. Par conséquent, nous avons opté de ne pas l’utiliser.

R G B Moyenne 0,485 0,456 0,406 Écart-type 0,229 0,224 0,225

TABLE2.11 – Coefficient de normalisation d’ImageNet

Normalisation Précision en entraînement Précision en test

ImageNet 96,78 95,89

Aucune 97,16 96,31

TABLE2.12 – Comparaison entre différents modèles

2.3.5 Introduction d’erreurs dans les étiquettes

Parmi les images que nous avons récupérées dans le jeu de données, il y a une certaine probabilité d’erreurs d’annotations. En effet, à plusieurs étapes au cours de la collecte de données, il y a eu des possibilités pour que des erreurs s’infiltrent dans le processus. Deux endroits semblent susceptibles de provoquer de telles erreurs d’étiquetage. Premièrement, lors de l’identification des arbres et deuxiè- mement, lors de la transcription de l’étiquette écrite sur le tableau blanc vers les images elles-mêmes. C’est pourquoi nous nous sommes intéressés à savoir quel était l’impact d’avoir des erreurs d’éti- quette dans le jeu de données. Pour ce faire, avant l’entraînement, nous avons aléatoirement modifié les étiquettes pour un certain pourcentage des données. La table2.13détaille les résultats obtenus.

Erreur Précision en entraînement Précision en test Perte de performance

0% 96,64% 95,73% 0,00%

5% 92,02% 94,35% 1,38%

10% 87,54% 93,96% 1,77%

50% 53,91% 86,55% 9,18%

100% 23,67% 5,40% 90,33%

TABLE2.13 – Résultats avec une perturbation des étiquettes

Du côté de l’entraînement, la première observation que l’on remarque est que la performance en entraînement se dégrade sensiblement au même rythme que la dégradation de la qualité des étiquettes. Cependant, lorsque le taux d’erreur approche et dépasse les 50%, le réseau semble être capable de contrer, en partie, la perturbation des étiquettes et de conserver jusqu’à 23,67% de précision avec 100% d’erreur. Cela s’explique par le fait que les étiquettes ont simplement été modifiées une fois avant l’entraînement et que le réseau a réussi à apprendre par coeur la classe modifiée de certains arbres du jeu de données. Si la perturbation avait été faite aléatoirement sur chaque lot d’entraînement, on peut prévoir que le réseau aurait obtenu une performance similaire à celle obtenue en test.

perturber les étiquettes en entraînement a un effet négatif sur les résultats. Toutefois, son effet est bien moins important que ce qui était prévu. Par exemple, une perturbation de 10% des étiquettes d’entraînement se traduit en une perte de moins de 2% sur la précision en test alors qu’on pourrait penser que celle-ci serait aussi d’environ 10%. Encore plus impressionnant, avec 50% d’erreur, la performance ne se dégrade que de 9,18%. En fait, pour tous les résultats avec 50% ou moins de perturbation, la perte de performance en test semble être environ 5 fois plus petite que la valeur de la perturbation.

Un autre aspect à remarquer est que, avec un taux d’erreur de 100%, le réseau n’a rien pu apprendre et a obtenu une précision d’environ 5% en test ce qui est équivalent à une classification aléatoire. Sans nécessairement être surprenant, cela nous confirme que notre méthodologie pour cette expérimentation ne comportait pas d’erreur.

Finalement, ces résultats nous indiquent que les erreurs qui sont probablement présentes dans le jeu de données ont probablement un effet moins important que ce à quoi on s’attendait. Cela est encourageant et montre qu’il ne faut pas trop s’en faire à avoir un jeu de données parfait, car la grande quantité de données correctes compensent très bien.

Documents relatifs