Les modèles de vision basés sur les transformateurs évoluent progressivement et seraient aussi bons que les modèles convolutifs sur les tâches de classification, de segmentation et de reconnaissance d'action. Nous avons toute une gamme de modèles convolutifs pour les tâches de vision et sont plus populaires que ceux basés sur Transformer. Ce blog se penche sur le modèle SWin Transformer Vision qui a été présenté lors de la Conférence internationale sur la vision par ordinateur (ICCV) 2021 par l'équipe de recherche Microsoft. Il compare ses performances à plusieurs modèles basés sur SOTA Convolution sur la tâche de classification d'images de races de chiens.
Les modèles basés sur des transformateurs deviendront-ils la prochaine grande nouveauté de la vision par ordinateur ? Les transformateurs étant une solution efficace pour les tâches linguistiques, unifieront-ils les différents sous-domaines de l'IA et présenteront-ils des solutions puissantes à des problèmes plus complexes ? Donc retrousser mes manches pour évaluer à quel point ils sont bons sur la tâche de classification pour commencer.
La myriade de races de chiens avec des changements subtils dans leur apparence physique a été un défi pour les vétérinaires, les propriétaires de chiens, le personnel des refuges pour animaux et les propriétaires potentiels de chiens pour identifier leur bonne race. Ils doivent identifier la race afin de fournir une formation et un traitement appropriés et de répondre à leurs besoins nutritionnels. Les données proviennent du Stanford Dog Dataset qui contient environ 20 000 images de 120 races de chiens à travers le monde. Ces données ont été divisées presque également en train et ensemble de test pour une identification de race de chien de compétition Kaggle.
L'objectif de la solution est de construire un système d'identification de races de chiens capable d'identifier correctement les races de chiens avec un minimum de données et d'identifier correctement même les races de chiens d'apparence similaire. Il s'agit d'une tâche de classification multi-classes et pour chaque image, le modèle doit prédire la probabilité pour les 120 races. Celui avec la probabilité la plus élevée est la race la plus probable du chien dans l'image.
Bien qu'il n'y ait pas de déséquilibre de classe, les données peuvent être insuffisantes pour entraîner le réseau de neurones. L'augmentation d'image utilisant des perturbations d'image aléatoires et des modèles pré-entraînés permettra de contourner ce problème.
Les 5 races avec le plus d'images sont le scottish_deerhound, le maltese_dog, l'afghan_hound, l'entlebucher et le bernese_mountain_dog. Les 5 dernières races avec le moins d'images sont golden_retriever, brabancon_griffon, komondor, eskimo_dog et briard.
Une analyse rapide des dimensions spatiales des images d'entraînement est effectuée pour comprendre la distribution de la hauteur, de la largeur et de leurs rapports d'aspect.
Les images avec des rapports d'aspect très faibles (<0,5) et très élevés (>2,3) sont considérées comme des images anormales. 1,5 est considéré comme un bon format d'image.
En analysant diverses races de chiens, les paires de races ci-dessous se ressemblaient généralement.
Cette architecture est basée sur "Swin Transformer: Hierarchical Vision Transformer using Shifted Windows" développé par Microsoft Research Team. Cet article traite d'une architecture ViT améliorée qui produit une représentation hiérarchique des cartes de caractéristiques réduisant la complexité de calcul du mécanisme d'auto-attention de quadratique à linéaire. Il est prouvé qu'il donne des résultats identiques à ceux des réseaux de convolution SOTA comme EfficientNet sur le problème de classification Imagenet.
Les éléments constitutifs de cette architecture sont expliqués dans les notes ci-dessous :
En NLP, les jetons qui sont les éléments de traitement d'un modèle sont les mots d'une phrase où la taille de 1 jeton est 1 (seulement 1 mot). ViT ( Vi sion T ransformers) traite les « patchs d'image » comme des jetons où chaque patch est une partition d'une image constituée d'un groupe de pixels voisins. Chaque patch d'image est un jeton. La taille d'un jeton dans n'importe quel ViT est patch_height * patch_width * nombre de canaux. Sur la base des dimensions du patch, nous obtenons un certain nombre de patchs ou de jetons pour une seule image. Si la taille de l'image (H*W*3) est de 224 * 224 * 3 pixels et la taille du patch est de 4 * 4, alors nous obtenons 224/4 * 224/4 = 56 * 56 patchs ou 3136 jetons de l'image. Chaque jeton ou patch sera de taille 4*4*3 = 48 dimensions ou 48 pixels de données. Ainsi, l'entrée de l'architecture pour cette image se compose de 3136 jetons chacun de taille 48 dimensions.
Le mécanisme sous-jacent du transformateur SWIN est analogue à toute architecture basée sur CNN où les dimensions spatiales de l'image sont réduites et le nombre de canaux est augmenté. Transformateur SWIN à chaque étape de l'architecture hiérarchique, réduit également le nombre de patchs d'image ou le nombre de jetons tout en augmentant les dimensions des jetons. Avec ce mécanisme à l'esprit, il est plus facile de comprendre facilement l'architecture SWIN.
À chaque étape de l'architecture, nous pouvons voir le nombre de jetons diminuer tandis que la taille des jetons augmente.
L'architecture SWIN-T, outre le " Patch Partitioner", est également composée de 3 autres blocs de construction - Linear Embedding, Swin Transformer Block, Patch Merging. Ces blocs de construction sont répétés et traitent les cartes d'entités de manière hiérarchique.
Les 3136 jetons de 48 dimensions chacun provenant du "Patch Partitioner" sont acheminés vers une couche d'alimentation en aval pour intégrer le jeton de 48 vecteurs de caractéristiques dans un vecteur de caractéristiques de taille "C". "C" agit ici comme la capacité du transformateur et l'architecture SWIN a 4 variantes basées sur celle-ci.
Le patch d'image et l'intégration linéaire sont implémentés conjointement dans une seule convolution dont la taille du noyau et la longueur de la foulée sont identiques à la taille du patch. Le nombre de canaux dans la convolution sera 'C'.
Le bloc transformateur SWin est différent du bloc transformateur standard dans l'architecture ViT. Dans SWin Transformers, le
Stage1 se compose de 2 blocs de transformateur SWIN-T (voir l'image) où le premier bloc de transformateur a une fenêtre MSA (W-MSA) et le deuxième bloc de transformateur a un module de fenêtre décalée MSA (SW-MSA). Dans le SWin Transformer Block, les entrées et les sorties des couches W-MSA et SW-MSA sont transmises via des couches de normalisation. Il est ensuite soumis à un réseau Feed Forward à 2 couches avec activation des unités linéaires d'erreur gaussienne (GELU). Il existe des connexions résiduelles au sein de chaque bloc et entre ces 2 blocs.
Modules Window MSA (W-MSA) et Shifted Window MSA (SW-MSA)
La couche d'attention standard dans ViT était une couche globale calculant l'attention d'un patch avec tous les autres patchs de l'image, conduisant ainsi à une complexité quadratique proportionnelle aux dimensions de l'image. Cela ne s'adapte pas très bien aux images haute résolution.
Le mécanisme d'auto-attention dans le module W-MSA ou SW-MSA est un mécanisme local qui calcule l'auto-attention uniquement entre les patchs dans la même fenêtre de l'image et non à l'extérieur des fenêtres.
Les fenêtres sont comme des partitions plus grandes de l'image où chaque fenêtre comprend des patchs M*M. Le remplacement de l'auto-attention globale par l'auto-attention locale a réduit la complexité de calcul de quadratique à linéaire.
La principale différence entre les modules d'attention W-MSA et SW-MSA réside dans la manière dont les fenêtres de l'image sont configurées.
Dans le module W-MSA, une stratégie de partitionnement de fenêtre régulière est suivie. L'image est répartie uniformément en fenêtres qui ne se chevauchent pas à partir du pixel supérieur gauche de l'image, et chaque fenêtre contient des patchs M*M ou M2 .
Dans le module SW-MSA, la configuration des fenêtres est décalée de celle de la couche W-MSA, en déplaçant les fenêtres de (M/2, M/2) correctifs par rapport à la stratégie de partitionnement habituelle.
Étant donné que l'attention est restreinte localement dans une fenêtre dans W-MSA, la fenêtre décalée permet à l'attention inter-fenêtres de continuer à produire les avantages de l'attention globale. Cela est possible car les limites de la fenêtre 1 dans la couche W-MSA sont partagées avec les fenêtres W2, W4 et W5 dans la couche SW-MSA. Par conséquent, l'attention globale se produit indirectement via "l'attention locale sur les fenêtres décalées".
La couche Patch Merging réduit le nombre de jetons à mesure que le réseau devient de plus en plus profond. La première couche de fusion de patchs concatène les caractéristiques de chaque groupe de 2×2 patchs voisins.
Le package tfswin dans PyPI contient des variantes TF-Keras pré-entraînées des transformateurs SWIN et est construit sur la base de l' implémentation officielle de pytorch . Son code est disponible sur github . tfswin est utilisé pour former les images de race de chien.
from tfswin import SwinTransformerBase224, preprocess_input def build_model1(swintransformer): tf.keras.backend.clear_session() inputs = Input(shape=(resize_height, resize_width, 3)) outputs = Lambda(preprocess_input)(inputs) outputs = swintransformer(outputs) outputs = Dense(num_classes, activation='softmax')(outputs) swin_model = Model(inputs=inputs, outputs=outputs) return swin_model #build the model swintransformer = SwinTransformerBase224(include_top=False,pooling='avg') swin_model1 = build_model1(swintransformer) #set the layers of the pretrained model as non-trainable for layer in swin_model1.layers[2].layers: layer.trainable = False swin_model1.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),loss='categorical_crossentropy',metrics=['accuracy'])
#Logloss of the test set using various ResNet variants +------------+---------------+-------------------------+----------+ | Model Name | Retrained | Top Layers Replacement | Log_Loss | +------------+---------------+-------------------------+----------+ | ResNet50 | None | ConvBlock_FC_Output | 0.96463 | | ResNet50 | None | GlobalAvgPooling_Output | 0.58147 | | ResNet50 | last 4 layers | ConvBlock_FC_Output | 2.10158 | | ResNet50 | last 4 layers | GlobalAvgPooling_Output | 0.57019 | +------------+---------------+-------------------------+----------+
Code correspondant au modèle ResNet50 avec le moins de perte de log
from tensorflow.keras.layers import Input,Conv2D,Dense,BatchNormalization,Flatten,Concatenate, Dropout,MaxPooling2D from tensorflow.keras.models import Model from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input def build_model(): tf.keras.backend.clear_session() inputs = Input(shape=(resize_height, resize_width, 3)) #added preprocess_input method as a layer to convert input images to those expected by Resnet processed_inputs = preprocess_input(inputs) #use the pretrained ResNet model (Parameter pooling = 'avg' will take care of the Gobal Average Pooling of the ResNet model features) base_model = ResNet50(weights="imagenet", include_top=False,pooling='avg')(processed_inputs) #output layer output = Dense(units=num_classes,activation='softmax',name='Output')(base_model) resnet_model = Model(inputs=inputs, outputs=output) return resnet_model #build the model resnet_model = build_model() #set the layers of the resnet pretrained model as non-trainable except for its last 4 layers which needs to be re-trained for this data for layer in resnet_model.layers[3].layers[:-4]: layer.trainable = False #compile the model resnet_model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),loss='categorical_crossentropy',metrics=['accuracy']) print(resnet_model.summary()) history = resnet_model.fit(train_ds, epochs=50, validation_data=val_ds, callbacks=callbacks_list)
#Logloss of the standalone model variants +----------------------------+-------------+ | Model Name | Log_Loss | +----------------------------+-------------+ | EfficientNetV2M | 0.28347 | | Inception ResNet | 0.28623 | | NasNetLarge | 0.33285 | | Xception | 0.34187 | | Inception_V3 | 0.54297 | | EfficientNetV2M_GlobalAveg | 0.50423 | | InceptionV3_GlobalAveg | 0.46402 | +----------------------------+-------------+
+--------------------------------------------------------------------------+-----------+ | Model Name | Log_Loss | +--------------------------------------------------------------------------+-----------+ | Ensemble1 - EfficientNEt,InceptionResNet,NasNet,Xception) | 0.17363 | | Ensemble2 - EfficientNEt,InceptionResNet,NasNet,Xception and InceptionV3 | 0.16914 | | Ensemble3 - Ensemble2 with 50% dropout. | 0.16678 | | Ensemble4 - Ensemble of various EfficientNet Architecture | 0.16519 | +--------------------------------------------------------------------------+-----------+
Each of these models accepts varied input formats and in Keras they have their own preprocessing functions.
Résultat de l'analyse comparative
+----------------------------------+------------+----------------------+----------+ | Model Name | Parameters | Train time (seconds) | Log_Loss | +----------------------------------+------------+----------------------+----------+ | EfficientNet_ConvBlock_Output | 54.7M | ~260s | 0.28347 | | InceptionResNet_ConvBlock_Output | 56.1M | ~260s | 0.28623 | | NASNetLarge_ConvBlock_Output | 89.6M | ~330s | 0.33285 | | XCeption_ConvBlock_Output | 23.3M | ~240s | 0.34187 | | InceptionV3_ConvBlock_Output | 24.2M | ~225s | 0.54297 | | EfficientNet_GlobalAvg | 53.3M | ~260s | 0.50423 | | InceptionV3_GlobalAvg | 22M | ~215s | 0.46402 | | swin_base224 | 86.8M | ~550s | 0.47289 | | swin_base384 | 87M | ~600s | 0.41902 | | swin_large384 | 195M | ~1000s | 0.42207 | +----------------------------------+------------+----------------------+----------+
Les transformateurs SWIN ont obtenu de meilleurs résultats que toutes les variantes ResNet50 et le modèle InceptionV3.
La perte de log de SWIN Transformer sur ces données est légèrement supérieure à celle des modèles InceptionResNet, EfficientNet, Xception et NasNet Large lorsque leurs sorties sont traitées ultérieurement par couche convolutive suivie de Maxpooling.
Cependant, SWIN fonctionne aussi bien que le modèle EfficientNet lorsque leurs sorties moyennes sont directement traitées par la couche de sortie.
Les modèles SWIN sont plus grands que tous les modèles convolutifs et auront donc un impact sur le débit et la latence du système.
Cette étude s'est avérée utile pour comprendre l'application des modèles basés sur les transformateurs pour la vision par ordinateur.
Vous pouvez trouver le code des notebooks sur mon Github et l'interface graphique pour ce cas d'utilisation ici.
https://www.kaggle.com/competitions/dog-breed-identification
https://arxiv.org/pdf/2103.14030.pdf