Vous êtes sur la page 1sur 11

OUAMRANE Yanis

COMPREHENSION DE LA LANGUE DES SIGNES :


MODELES DE CLASSIFICATION ET DE TRADUCTION

Introduction
Les langues des signes sont des formes de communication visuelles et gestuelles
basées sur les gestes de la main, les expressions faciales et les mouvements du corps qui
permettent principalement aux personnes malentendantes de s’exprimer.
Il n’existe pas de langue des signes universelles, et la langue parlée dépend
énormément de la zone géographique et de la culture local. Par exemple, même si le
Royaume-Uni et les Etats-Unis sont deux régions du monde où l’on parle anglais, la langue
des signes britannique (BSL) et la langue des signes Américaine (ASL) sont totalement
différentes. En effet, les lettres de l’alphabet sont réalisées à une main en ASL et à deux mains
en BSL.
L’ASL est parlé par plus d’un demi-million de personne à travers le monde, cependant,
ces personnes rencontrent beaucoup de difficultés à se faire comprendre du grand public.
L’intelligence artificiel représente une véritable opportunité pour renforcer l’inclusion de ces
personnes en société et c’est pourquoi j’ai choisi de travailler sur ce sujet.
Initialement ce projet avait pour but de travailler sur des images et des vidéos de
langue des signes pour proposer des modèles de classifications et de traduction. Cependant,
après une étude de la faisabilité, la complexité des modèles et le prétraitement requis pour
l'utilisation de vidéos dans des modèles de classification, ainsi que les exigences en termes de
puissance de calcul qui me sont difficiles d’accès, m'ont conduit à conclure que ce projet était
d'une ambition excessive pour ma première expérience en apprentissage profond. Par
conséquent, j'ai choisi de me concentrer sur le traitement d'images.
C’est donc dans ce contexte que s’inscrit mon projet pour ce cours visant à développer
un modèle de classification permettant la traduction d’images de la langue ASL.
Ce rapport présentera en premier lieu une description précise du projet ainsi que les
base de données et les métriques qui seront utilisées. Ensuite, il fera une taxonomie des
différentes méthodes dans la classification d’image et en particulier dans le contexte de
l’ASL. Enfin, il conclura par la sélection des modèles qui seront utilisés dans la suite du
projet.

Description du projet
L'objectif principal de ce projet de session est de mettre en place un modèle de
classification basé sur l'apprentissage profond, développé en utilisant PyTorch. Ce modèle sera
conçu pour identifier une lettre de l'alphabet de la Langue des Signes Américaine (ASL) à partir
d'une image de la main qui représente une de ces lettres.
Pour permettre l’utilisation de ce modèle, l’utilisateur pourra prendre une photo de sa main à
l'aide de la webcam de son ordinateur en temps-réel. Cette photo sera ensuite soumise à un

1
OUAMRANE Yanis

processus de prétraitement et de redimensionnement en utilisant la bibliothèque OpenCV, avant


d'être introduite en tant qu'entrée dans le modèle. En sortie, le modèle devra être en mesure de
donner la lettre correspondante à l'image capturée. Le principe du projet est illustré dans la
figure 1.

Figure 1 - Schéma de fonctionnement du projet

Base de données
Deux bases de données ont été retenues dans le cadre de ce projet. Ces bases de données, qui
sont en accès libre et disponibles sur Kaggle, ont été sélectionnées car elles possèdent de
nombreuses données mais aussi pour l’équilibre des proportions de données des différentes
classes. Par conséquent, cela aura pour avantage de dédier la majeure partie du temps au
développement du modèle.
Les bases de données sont les suivantes :
• Sign Language MNIST TECPERSON
Base de données qui contient près de 30 000 images de l’alphabet ASL. La base est
formée sur le même format que le dataset MNIST avec des images de faible résolution
(28x28 pixels). Toutes les images sont étiquetées et forment 24 classes différentes
(absence de la lettre J et Z qui nécessitent le mouvement de la main).

Figure 2 - Lettre A Sign Language MNIST

• ASL Alphabet AKASH


Base de données contenant 87 000 images de 200x200 pixels. Reparti de manière
équilibré en 29 classes. 26 pour les lettres A-Z et 3 classes pour SPACE, DELETE et
RIEN (qui représente l’arrière-plan) (3000 images par classe). Pour les lettres « J » et « Z
», les images sont variées pour tenter de capturer toutes les positions nécessaires à la
réalisation du mouvement de ces lettres. Ces images sont des images plus réelles que les
images précédentes et sont davantage bruitées comme le montre la figure 3.

2
OUAMRANE Yanis

Figure 3 - Lettre A ASL Alphabet

Chacune de ces deux bases de données seront augmentées en effectuant une rotation de 180°
des images afin d’entrainer le modèle sans que celui-ci ne soit impacté par l’ambigüité liés à
l’orientation de la Webcam et que le modèle fonctionne aussi bien avec une main gauche
qu’avec une main droite.
Un modèle de classification sera ainsi développé pour chacune de ces deux bases de données.

Métrique d’évaluation
Pour la réalisation de nos modèles nous diviserons nos bases de données en une base
d’entrainement, une base de test et une base de validation.
Tout au long du processus d’entrainement et à chaque époque, le modèle sera évalué à travers
plusieurs métrique :
Nous tracerons dans un premier temps la courbe d’apprentissage du modèle qui donne le tracé
de la fonction de coût mesuré sur l’ensemble de la base de données en fonction du nombre
d’époque. Nous tracerons 3 courbes pour les 3 parties de notre base de données (train, test,
validation). Ces courbes ont pour but de surveiller que le modèle apprend bien et qu’il n’est pas
bloqué sur un plateau fixe.
Afin de mesurer la performance du modèle, la mesure principale qui sera utiliser sera l’«
accuracy ». Pour un problème de classification nous pouvons la définir ainsi :

𝑁𝑜𝑚𝑏𝑟𝑒 𝑑𝑒 𝑝𝑟é𝑑𝑖𝑐𝑡𝑖𝑜𝑛𝑠 𝑐𝑜𝑟𝑟𝑒𝑐𝑡𝑒𝑠 𝑇𝑃 + 𝑇𝑁


accuracy = 𝑁𝑜𝑚𝑏𝑟𝑒 𝑑𝑒 𝑑𝑜𝑛𝑛é𝑒𝑠
= 𝑇𝑃+𝐹𝑃+ 𝑇𝑁+𝐹𝑁

Nous tracerons la courbe de l’accuracy en fonction du nombre d’époque sur les 3 parties de
notre base de données afin de vérifier que notre modèle progresse d’une part et qu’il est capable
de généraliser d’autre part.
Pour chacune des classes, nous donnerons également les données métriques suivantes :
➢ La précision qui est définie comme « combien de personnes dans cette classe sont
correctement classées » et qui peut se calculer de la manière suivante :
𝑇𝑃
Précision = 𝑇𝑃+𝐹𝑃

➢ Le rappel est défini comme « le nombre d’éléments de cette classe que vous trouvez
sur le nombre total d’éléments de cette classe » et répond à la formule suivante :
𝑇𝑃
Rappel = 𝑇𝑃+𝐹𝑁

3
OUAMRANE Yanis

➢ Le f1-score qui est la moyenne harmonique des deux métriques précédentes :


𝑃𝑟é𝑐𝑖𝑠𝑖𝑜𝑛∗𝑅𝑎𝑝𝑝𝑒𝑙
f1-score =2* 𝑃𝑟é𝑐𝑖𝑠𝑖𝑜𝑛+𝑅𝑎𝑝𝑝𝑒𝑙

Pour rendre ces résultats plus visuels, nous donneront la matrice de confusion du modèle. Celle-
ci peut se définir de la manière suivante :

Vrai label
Classe Classe 2 … Classe N Total Précision
1
Classe 1
Classe 2

.
.
.

Classe N
Total
Précision

La matrice de confusion permet de représenter visuellement les performances du modèle. Elle


sera tracée seulement à la fin de l’entrainement. Elle permet de rentrer plus en détails sur les
résultats précédent en identifiant quelles sont les classes que le modèle confond et a du mal à
classifier. Si on remarque par exemple que le modèle se trompe sur une classe de données bien
précise, nous pourrons recourir à des techniques d’augmentation de données pour tenter de
corriger ce problème.

Taxonomie des méthodes


Dans cette partie, nous ferons une revue des différentes méthodes qui ont déjà été utilisées pour
résoudre des problèmes de classification similaires à celui des images de l’alphabet ASL. Deux
types de modèles ont retenues mon attention :
• Perceptron Multicouche (MLP)
Les MLP ("Multilayer Perceptron") sont le type de réseaux les plus basiques en apprentissage
profond. Ils constituent un type de réseau neuronal artificiel structuré en différentes couches.
Ce réseau comporte au minimum trois couches distinctes : une première couche dédiée à
l'entrée des données, une ou plusieurs couches intermédiaires, fréquemment appelées les
couches cachées, et enfin une couche de sortie. Chacune de ces couches est composée d'un
nombre variable de neurones. L'acheminement de l'information s'effectue exclusivement de la

4
OUAMRANE Yanis

couche d'entrée à la couche de sortie, obéissant ainsi à un schéma de transmission directe (ou
feedforward). Les neurones de la dernière couche fournissent la sortie du système.

Figure 4- Schéma de principe des MLP

Ces réseaux sont intéressants car ils sont très facilement programmables et sont donc un bon
début pour la programmation de réseaux de neurones. Ils permettent également d’obtenir des
résultats intéressants pour des problèmes de classifications d’images avec des images de
faibles résolutions. Dans l’article Lowe, D. (2020, November) un modèle MLP à 5 couches
cachées a été développée pour classifier les images de Sign Language MNIST et a permis
d’obtenir une précision de 94,93 % sur la base d’entrainement après 50 époques. Cependant,
celui-ci n’a obtenu qu’un score de 77,93% de précision sur la base d’entrainement, ce qui
représente une erreur trop importante.

• Réseaux de neurones convolutifs (CNN)


Les CNN sont un type de réseau de neurones artificiels spécialement conçu pour le traitement
d'images et de données structurées en forme de grilles en générales. Ils contiennent trois types
de couches différentes avec chacun un objectif différent. Ces trois couches sont les suivantes :
couches convolutives, couches de pooling et couches entièrements connectées.

Figure 5 - Schéma de principe des CNN

La couche de convolution est le premier élément des CNN. Elle représente la plus grande
charge de calcul. Cette couche consiste à extraire les caractéristiques (features) d’une image
comme les lignes, les formes, les couleurs etc... Pour cela, on fait glisser des filtres (ou
kernels) de petites tailles sur l'image d'entrée et on effectue un produit scalaire. Le résultat de
cette opération donne une nouvelle image appelée carte d'activation (feature map). Ici on ne
prédéfinies pas les features identifiables mais c’est le réseau lui-même qui apprend à les
identifier lors la phase d'entraînement.

5
OUAMRANE Yanis

La couche de pooling est une couche que l’on place entre deux couches de convolution.
L’objectif de la couche de pooling est de réduire la dimension de la carte d’activation, tout en
gardant les caractéristiques importantes de celle-ci. Pour cela, on découpe la feature map en
plusieurs petites parties régulières et on leurs appliquent une opération de pooling (maximum
par exemple).
Les dernières couches du CNN représente un réseau de neurones classique entièrement
connectées, elles permettent de liés les caractéristiques des images aux classes du problème de
classification grâce une dernière couche de Softmax.
Ce type de réseau a été retenue pour ce problème car il est celui qui permet d’obtenir les
meilleurs résultats en classification d’image. Dans le papier de Lowe, D. (2020, November) cité
précédemment, un modèle de CNN a 5 couches cachés a permis d’obtenir 99,94% de précision
sur les données d’entrainement et 99,55 % sur les données de test après seulement 25 époques.
Ce qui est beaucoup plus efficace que le MLP pour la même tâche.
Pour notre projet, nous nous concentrerons exclusivement sur les réseaux de neurones
convolutifs qui représentent l’état de l’art actuel en vision par ordinateur.
Dans la suite, nous examinerons donc de manière plus approfondie les divers modèles
de CNN disponibles, qui sont particulièrement efficaces pour aborder des problèmes de
classification d'images de résolution plus élevée, tels que ceux présents dans la base ASL
Alphabet.

Détails des différents réseaux convolutifs


Les modèles dont nous allons discuter sont des réseaux neuronaux convolutifs (CNN)
profonds (qui possèdent plus de 10 couches de convolution). Ils ont été pré-entraînés sur la
vaste base de données ImageNet, une collection de millions d'images étiquetées. Ces modèles
ont été retenues car ils peuvent être utilisés dans notre projet grâce au transfert d'apprentissage,
ce qui permet d'économiser considérablement en temps de calcul tout en obtenant d’excellent
résultats.

• VGGNet
VGG est une architecture de réseau de neurones convolutifs classique introduite en 2014 par
K. Simonyan et A. Zisserman de l'université d'Oxford. VGG s’est démarqué en obtenant
d'excellents résultats sur ImageNet. Une des caractéristiques marquantes de VGG est sa
facilité d'utilisation, car il nécessite très peu de prétraitement des images d'entrée. VGG se
distingue également par l'utilisation de noyaux de convolution de petite taille, 3x3 alors que
les architectures précédentes utilisaient des noyaux plus grands, tels que 11x11 ou 5x5. Il
existe deux variantes principales de VGG : VGG16 et VGG19, qui se différencient par le
nombre de couches de convolutions qu'elles contiennent. Nous pouvons voir la structure de
VGG16 dans la figure suivante :

6
OUAMRANE Yanis

Figure 6 - Architecture VGG16

Dans l’étude menée par Abu-Jamie et Abu-Naser (2022) un modèle VGG16 pré-entraîné sur
ImageNet a été utilisé pour réaliser la classification de la base de données ASL Alphabet.
Dans ce papier, le modèle utilisait un réseau de neurones MLP entièrement connecté composé
de trois couches. Les deux premières couches comprenaient 4096 neurones chacune, tandis
que la dernière en comptait 1000. Pour évaluer les performances du modèle, une méthode de
validation croisée k-fold a été utilisée, et les résultats ont été très intéressant en seulement 20
époques d'entraînement.

• DenseNet
Le réseau DenseNet est un réseau convolutif profond développé par des chercheurs de
l'Université Cornell en 2017 et qui possède une architecture en bloc qualifiée de réseaux de
neurones densément connectés. Ce qui rend cette architecture particulièrement unique, c'est sa
manière de combiner les données. En effet, dans ce réseau, l’entrée d’une couche est la
concaténation de toutes les sorties des couches précédentes, comme illustré dans le schéma
suivant :

Figure 7 - Architecture en bloc de DenseNet

Ce processus génère une carte de caractéristiques tout en conservant la même résolution ce


qui réduit le nombre de paramètre utilisés. DenseNet présente aussi des couches de
convolution 1x1 entre les blocs qui conservent la résolution spatiale tout en réduisant la
profondeur de la carte de caractéristiques.
Les réseaux DenseNet sont des réseaux très profonds puisqu’ils peuvent posséder plusieurs
centaines de couches de convolution. On pourrait penser que le simple fait d’ajouter des
couches de convolution permettrait à n’importe quel réseau d’améliorer ses performances.

7
OUAMRANE Yanis

Cependant, l’addition de nombreuses couches va démultipliés le nombre de dérivés partielles


lors de la rétropropagation, ce qui va avoir pour effet de faire tendre les gradients vers 0,
empêchant l’apprentissage, c’est le problème de disparition du gradient. L’architecture de
DenseNet permet de résoudre ce problème car toutes les couches sont directement connectées
entre elles, ce qui facilite grandement la circulation du gradient.
Un réseau DenseNet a été développé pour résoudre un problème de classification d’image de
l’alphabet ASL dans les travaux de Daroya, Peralta, et Naval (2018) et a permis d’obtenir des
résultats intéressants. En effet, le modèle a atteint une précision de 90,7% sur un dataset test
de près de 13 000 images. Il a même montré de très bons résultats dans de la classification
temps réel puisqu’il a été capable de produire un résultat toute les 20 ms. Ce réseau semble
donc adapté à notre projet puisqu’il a fait ses preuves pour des applications temps réel sur une
base de données similaire. De plus, de nombreux modèles DenseNet pré entrainées sont
disponibles avec la librairie Pytorch et ce qui pourrait être utile pour résoudre le problème du
temps de calcul dans la phase d’entrainement.

• ResNet
ResNet, abréviation de « Residual Network », est une puissante architecture de réseaux de
neurones convolutifs (CNN) profond. Elle a été conçue par Kaiming He, Xiangyu Zhang,
Shaoqing Ren et Jian Sun de Microsoft Research en 2015.
Resnet propose une autre architecture pour lutter contre le problème de disparition du
gradient. En effet dans l’architecture résiduel, on ajoute des « raccourcis » qui permettent aux
données de « sauter » certaines couches, accélérant ainsi l'apprentissage. En d'autres termes,
les données d'entrées sont ajoutées à la sortie, empêchant certaines couches de tendre vers une
valeur du gradient très faible comme le montre la figure suivante.

Figure 8 - Architecture de ResNet

Ce processus permet au modèle de gérer un très grand nombre de couches puisqu’il apprend à
conserver les couches utiles et à transformer les autres en « fonction identité » qui n’agisse
que très peu sur le modèle et n’engendre pas de calcul inutile.
Dans le papier de Wurangian (2022), un modèle de ResNet50 (50 couches) pré entrainé sur
ImageNet a été utilisé pour résoudre le problème de classification similaire avec des images
de moins grande résolution que celle dont nous disposons. L’architecture de ResNet50 débute
par une de convolution initiale avec 64 noyaux de 7x7 et un stride de 2. Ensuite, une opération
de pooling initiale est réalisée avec un pas de 2. Le réseau comporte ensuite différents blocs
de convolution résiduels. Une opération de pooling moyenne sont effectuées à la fin de
l’architecture juste avant la couche entièrement connectée de 1000 neurones et la couche
softmax.

8
OUAMRANE Yanis

Au cours de cette étude, l'utilisation du modèle ResNet a abouti à un taux de précision de près
de 99% sur les données de test après seulement trois époques d'entraînement. De plus, lors de
l'évaluation du modèle avec des images capturées en temps réel depuis une webcam, sans être
issues de la base de données, le modèle a présenté un taux de réponse satisfaisant dans plus de
90% des cas. Ces résultats démontrent que cette architecture de réseau pourrait convenir à
notre projet.

• MobileNet
MobileNet est une architecture de réseau de neurones convolutifs (CNN) qui a été introduite
en 2017 par Andrew G. Howard et son équipe chez Google Research. Elle a été développée
pour nécessiter très peu de puissance de calcul et de mémoire pour être adaptable aux
appareils mobiles tels que les smartphones ou autre système embarqué à ressources limitées.
La particularité de MobileNet repose sur des convolutions spéciales appelées "convolutions
profondes séparables". Plutôt que d'appliquer une seule convolution sur l'ensemble des canaux
de l’image d’entrée (souvent 3 canaux RVB), les convolutions profondes séparables divisent
le processus en deux étapes : d'abord une convolution sur chacun des canaux
individuellement, c’est la Depthwise Convolution. Puis la Pointwise Convolution consiste à
faire une convolution sur les sorties de la Depthwise Convolution. Cette approche réduit
drastiquement la complexité du modèle tout en préservant la détection des caractériques et
donc la performance.

Figure 9 - Convolution Séparable : DepthWise et PointWise Convolution

MobileNet a évolué depuis sa création pour offrir différentes versions. MobileNetV1, se


concentre sur l'efficacité en réduisant le nombre de paramètres et de calculs. MobileNetV2 a
introduit des améliorations en utilisant des blocs résiduels améliorant l'efficacité et la
profondeur. MobileNetV3 s’est davantage concentré sur l'optimisation de l'architecture pour
permettre à cette troisième version d’être 4,6% plus précise tout en réduisant le temps de
calcul de 5% par rapport à MobileNetV2 pour des tâches de classification sur ImageNet.
Dans leur recherche récente (Abu-Jamie & Abu-Naser, 2022), portant sur la classification de
la langue des signes en utilisant MobileNet, les auteurs ont obtenu des résultats de
classification très satisfaisant en exploitant un modèle pré-entraîné sur ImageNet de
MobileNetV1. Cette étude m'a particulièrement captivé, car elle m’a éclairé sur la faisabilité
de mon propre projet, même avec des architectures plus légères en capacité de calcul que
celles que j'avais envisagées précédemment.

9
OUAMRANE Yanis

Conclusion et choix pour le projet


En conclusion, ce projet vise à concevoir une intelligence artificielle capable de réaliser
des traductions en temps réel à partir d'images de l'alphabet de la langue des signes américaine
(ASL) prise par la webcam d’un ordinateur. Pour atteindre cet objectif, nous entreprendrons
l'entraînement de réseaux de neurones pour la classification d'images de cet alphabet. Après une
analyse approfondie des divers modèles existants, nous avons choisi de nous orienter vers
l'utilisation de Convolutional Neural Networks (CNN) pour nos deux bases de données. Ces
réseaux se sont avérés être les mieux adaptés à notre tâche de vision par ordinateur.
Pour la base de données Sign Language MNIST, nous opterons pour l'utilisation d'un
CNN classique. Cela permettra dans un premier temps d'acquérir une solide compréhension des
CNN et de maîtriser les subtilités de leur mise en œuvre. Cependant, si ce modèle initial ne
s'avérait pas suffisant pour effectuer des classifications en temps réel à partir de photo de la
webcam, nous envisagerions de développer un second modèle, plus profond et pré-entraîné, en
utilisant la base de données ASL Alphabet. MobileNetV3 sera notre choix pour cette étape, car
cette architecture ne nécessite que très peu de puissance de calcul. De plus, dans le cadre de
mes études à l’Ets, j’étudie également la programmation de systèmes embarqués, l’étude d'une
architecture telle que MobileNet, conçue pour des systèmes à puissance de calcul limitée est
donc très intéressante.
Dans l'éventualité où MobileNet ne serait pas suffisamment profond pour répondre à
nos besoins spécifiques, nous envisageons la possibilité de recourir à un modèle pré-entraîné
de type ResNet plus tard dans le projet.

10
OUAMRANE Yanis

Références
https://fr.wikipedia.org/wiki/Perceptron_multicouche
Lowe, D. (2020, November 12). Multi-Class Deep Learning Model for Sign Language MNIST using
TensorFlow Take 2. Daines Analytics. https://dainesanalytics.blog/2020/11/20/multi-class-deep-
learning-model-for-sign-language-mnist-using-tensorflow-take-2/
Découvrez les différentes couches d’un CNN. (n.d.). OpenClassrooms.
https://openclassrooms.com/fr/courses/4470531-classez-et-segmentez-des-donnees-
visuelles/5083336-decouvrez-les-differentes-couches-dun-cnn
Mishra, M. (2021, December 15). Convolutional neural networks, explained - towards data science.
Medium. https://towardsdatascience.com/convolutional-neural-networks-explained-9cc5188c4939
Team, D. (2023, October 5). VGG : en quoi consiste ce modèle ? Daniel vous dit tout ! Formation Data
Science | DataScientest.com. https://datascientest.com/quest-ce-que-le-modele-vgg
Abu-Jamie, T. N., & Abu-Naser, S. S. (2022). Classification of Sign-language Using VGG16. Department
of Information Technology, Faculty of Engineering and Information Technology, Al-Azhar University -
Gaza, Palestine.
User. (2023, March 31). Réseaux de neurones DenseNet : tout ce qu’il y a à savoir. Formation Data
Science | DataScientest.com. https://datascientest.com/reseaux-de-neurones-
densenet#:~:text=Les%20r%C3%A9seaux%20DenseNet%20sont%20des,est%20l'optimisation%20des
%20performances.
Daroya, R., Peralta, D., & Naval, P. (2018). Alphabet Sign Language Image Classification Using Deep
Learning, Department of Computer Science, University of the Philippines.
Team, D. S. (2020). Réseaux neuronaux résiduels – Ce que vous devez savoir. DATA SCIENCE.
https://datascience.eu/fr/apprentissage-automatique/un-apercu-de-resnet-et-de-ses-variantes/
Wurangian, M. (2022, January 7). American Sign Language Alphabet Recognition - MLearning.ai -
Medium. Medium. https://medium.com/mlearning-ai/american-sign-language-alphabet-recognition-
ec286915df12
Abu-Jamie, T. N., & Abu-Naser, P. Dr. S. (2022). Classification of Sign-Language Using MobileNet - Deep
Learning. Department of Information Technology, Faculty of Engineering and Information Technology,
Al-Azhar University - Gaza, Palestine
Redaction. (2020, September 10). MobileNet, optimisation de la convolution pour les réseaux de
neurones embarqués. - Quantmetry. Quantmetry. https://www.quantmetry.com/blog/mobilenet-
optimisation-de-la-convolution-pour-les-reseaux-de-neurones-
embarques/#:~:text=L'architecture%20des%20MobileNets%20est,une%20image%20de%20profonde
ur%201024.

11

Vous aimerez peut-être aussi