Un guide complet de l’architecture UNET | Maîtrise de la segmentation d’images
Guide complet architecture UNET | Maîtrise segmentation images
Introduction
Dans le domaine passionnant de la vision par ordinateur, où les images renferment de nombreux secrets et informations, distinguer et mettre en évidence les éléments est crucial. La segmentation d’image, le processus de découpage des images en régions ou objets significatifs, est essentielle dans diverses applications allant de l’imagerie médicale à la conduite autonome et à la reconnaissance d’objets. La segmentation précise et automatique a longtemps été un défi, les approches traditionnelles étant souvent insuffisantes en termes de précision et d’efficacité. C’est là qu’intervient l’architecture UNET, une méthode intelligente qui a révolutionné la segmentation d’images. Grâce à sa conception simple et à ses techniques novatrices, UNET a ouvert la voie à des résultats de segmentation plus précis et robustes. Que vous soyez un nouveau venu dans le domaine passionnant de la vision par ordinateur ou un praticien expérimenté cherchant à améliorer vos compétences en segmentation, cet article de blog approfondi dévoilera les complexités d’UNET et vous fournira une compréhension complète de son architecture, de ses composants et de son utilité.
Cet article a été publié dans le cadre du Data Science Blogathon.
Compréhension du réseau neuronal à convolution
Les CNN (réseaux neuronaux à convolution) sont un modèle d’apprentissage profond fréquemment utilisé dans les tâches de vision par ordinateur, notamment la classification d’images, la reconnaissance d’objets et la segmentation d’images. Les CNN sont principalement utilisés pour apprendre et extraire des informations pertinentes à partir d’images, ce qui les rend extrêmement utiles dans l’analyse de données visuelles.
Les composants essentiels des CNN
- Couches de convolution : Les CNN sont constitués d’une collection de filtres apprenables (noyaux) convolués avec l’image d’entrée ou les cartes de caractéristiques. Chaque filtre applique une multiplication terme à terme et une sommation pour produire une carte de caractéristiques mettant en évidence des motifs spécifiques ou des caractéristiques locales dans l’entrée. Ces filtres peuvent capturer de nombreux éléments visuels, tels que des contours, des coins et des textures.
- Une approche systématique pour choisir la meilleure technologie/fournisseur version MLOps
- 4 façons dont vous ne pouvez pas utiliser l’interpréteur de code ChatGPT qui perturberont vos analyses
- Top 18 constructeurs de sites Web basés sur l’IA en 2023
- Couches de pooling : Les cartes de caractéristiques créées par les couches de convolution sont réduites en utilisant des couches de pooling. Le pooling réduit les dimensions spatiales des cartes de caractéristiques tout en conservant les informations les plus importantes, ce qui réduit la complexité de calcul des couches suivantes et rend le modèle plus résistant aux fluctuations de l’entrée. L’opération de pooling la plus courante est le max pooling, qui prend la valeur la plus importante dans un voisinage donné.
- Fonctions d’activation : Introduire la non-linéarité dans le modèle CNN en utilisant des fonctions d’activation. Elles sont appliquées aux sorties des couches de convolution ou de pooling élément par élément, ce qui permet au réseau de comprendre des associations complexes et de prendre des décisions non linéaires. En raison de sa simplicité et de son efficacité pour résoudre le problème du gradient qui disparaît, la fonction d’activation Rectified Linear Unit (ReLU) est couramment utilisée dans les CNN.
- Couches entièrement connectées : Les couches entièrement connectées, également appelées couches denses, utilisent les caractéristiques extraites pour effectuer l’opération finale de classification ou de régression. Elles connectent chaque neurone d’une couche à chaque neurone de la couche suivante, ce qui permet au réseau d’apprendre des représentations globales et de prendre des décisions de haut niveau en fonction des entrées combinées des couches précédentes.
Le réseau commence par une pile de couches de convolution pour capturer des caractéristiques de bas niveau, suivies de couches de pooling. Les couches de convolution plus profondes apprennent des caractéristiques de plus haut niveau à mesure que le réseau évolue. Enfin, une ou plusieurs couches entièrement connectées sont utilisées pour l’opération de classification ou de régression.
Nécessité d’un réseau entièrement connecté
Les CNN traditionnels sont généralement destinés à des tâches de classification d’images dans lesquelles un seul label est attribué à l’ensemble de l’image d’entrée. En revanche, les architectures CNN traditionnelles présentent des problèmes avec des tâches plus fines telles que la segmentation sémantique, dans laquelle chaque pixel d’une image doit être classé dans différentes classes ou régions. C’est là que les réseaux entièrement convolutionnels (FCN) entrent en jeu.
Limitations des architectures CNN traditionnelles dans les tâches de segmentation
Perte d’informations spatiales : Les CNN traditionnels utilisent des couches de pooling pour réduire progressivement la dimensionnalité spatiale des cartes de caractéristiques. Bien que ce sous-échantillonnage aide à capturer des caractéristiques de haut niveau, il entraîne une perte d’informations spatiales, rendant difficile la détection et la segmentation précises des objets au niveau des pixels.
Taille d’entrée fixe : Les architectures CNN sont souvent conçues pour accepter des images de taille spécifique. Cependant, les images d’entrée peuvent avoir des dimensions variables dans les tâches de segmentation, ce qui rend difficile la gestion des entrées de taille variable avec des CNN classiques.
Précision de localisation limitée : Les CNN traditionnels utilisent souvent des couches totalement connectées à la fin pour fournir un vecteur de sortie de taille fixe pour la classification. Parce qu’ils ne conservent pas d’informations spatiales, ils ne peuvent pas localiser précisément les objets ou les régions dans l’image.
Les réseaux entièrement convolutifs (FCN) comme solution pour la segmentation sémantique
En travaillant exclusivement sur les couches convolutives et en conservant les informations spatiales dans tout le réseau, les réseaux entièrement convolutifs (FCN) répondent aux contraintes des architectures classiques de CNN dans les tâches de segmentation. Les FCN sont destinés à effectuer des prédictions pixel par pixel, chaque pixel de l’image d’entrée étant attribué à une étiquette ou une classe. Les FCN permettent de construire une carte de segmentation dense avec des prévisions au niveau des pixels en suréchantillonnant les cartes de caractéristiques. Les convolutions transposées (également appelées déconvolutions ou couches de suréchantillonnage) sont utilisées pour remplacer les couches totalement connectées après la conception du CNN. La résolution spatiale des cartes de caractéristiques est augmentée par les convolutions transposées, ce qui leur permet d’avoir la même taille que l’image d’entrée.
Pendant la suréchantillonnage, les FCN utilisent généralement des connexions de saut, contournant certaines couches et reliant directement les cartes de caractéristiques de bas niveau à celles de haut niveau. Ces relations de saut aident à préserver les détails fins et les informations contextuelles, augmentant ainsi la précision de localisation des régions segmentées. Les FCN sont extrêmement efficaces dans diverses applications de segmentation, notamment la segmentation d’images médicales, l’analyse de scènes et la segmentation d’instances. Ils peuvent maintenant traiter des images d’entrée de différentes tailles, fournir des prédictions au niveau des pixels et conserver les informations spatiales à travers le réseau en utilisant les FCN pour la segmentation sémantique.
Segmentation d’images
La segmentation d’images est un processus fondamental en vision par ordinateur dans lequel une image est divisée en plusieurs parties ou segments significatifs et distincts. Contrairement à la classification d’images, qui attribue une seule étiquette à une image complète, la segmentation ajoute des étiquettes à chaque pixel ou groupe de pixels, divisant essentiellement l’image en parties sémantiquement significatives. La segmentation d’images est importante car elle permet une compréhension plus détaillée du contenu d’une image. Nous pouvons extraire des informations considérables sur les limites des objets, les formes, les tailles et les relations spatiales en segmentant une image en plusieurs parties. Cette analyse détaillée est essentielle dans diverses tâches de vision par ordinateur, permettant d’améliorer les applications et de soutenir des interprétations de données visuelles de plus haut niveau.
Comprendre l’architecture UNET
Les technologies traditionnelles de segmentation d’images, telles que l’annotation manuelle et la classification pixel par pixel, présentent divers inconvénients qui les rendent coûteuses et difficiles pour des tâches de segmentation précises et efficaces. En raison de ces contraintes, des solutions plus avancées, telles que l’architecture UNET, ont été développées. Examinons les défauts des méthodes précédentes et pourquoi UNET a été créée pour surmonter ces problèmes.
- Annotation manuelle : L’annotation manuelle consiste à esquisser et marquer les limites de l’image ou les régions d’intérêt. Bien que cette méthode produise des résultats de segmentation fiables, elle est longue, nécessite beaucoup de travail et est sujette aux erreurs humaines. L’annotation manuelle n’est pas évolutive pour les grands ensembles de données et maintenir la cohérence et l’accord entre les annotateurs est difficile, en particulier dans les tâches de segmentation complexes.
- Classification pixel par pixel : Une autre approche courante est la classification pixel par pixel, dans laquelle chaque pixel d’une image est classé indépendamment, généralement à l’aide d’algorithmes tels que les arbres de décision, les machines à vecteurs de support (SVM) ou les forêts aléatoires. Cependant, la classification pixel par pixel a du mal à capturer le contexte global et les dépendances entre les pixels environnants, ce qui entraîne des problèmes de sur-segmentation ou de sous-segmentation. Elle ne peut pas tenir compte des relations spatiales et échoue fréquemment à fournir des limites d’objets précises.
Surmonter les défis
L’architecture UNET a été développée pour répondre à ces limitations et surmonter les défis auxquels les approches traditionnelles de segmentation d’images sont confrontées. Voici comment UNET aborde ces problèmes :
- Apprentissage de bout en bout : UNET adopte une approche d’apprentissage de bout en bout, ce qui signifie qu’il apprend à segmenter les images directement à partir de paires d’entrée-sortie sans annotation utilisateur. UNET peut extraire automatiquement des caractéristiques clés et effectuer une segmentation précise en s’entraînant sur un grand ensemble de données étiquetées, éliminant ainsi le besoin d’une annotation manuelle intensive en main-d’œuvre.
- Architecture entièrement convolutive : UNET est basée sur une architecture entièrement convolutive, ce qui signifie qu’elle est entièrement composée de couches convolutives et ne comprend aucune couche totalement connectée. Cette architecture permet à UNET de fonctionner sur des images d’entrée de n’importe quelle taille, augmentant sa flexibilité et son adaptabilité à différentes tâches de segmentation et variations d’entrée.
- Architecture en U avec des connexions de saut : L’architecture caractéristique du réseau comprend un chemin d’encodage (chemin contractant) et un chemin de décodage (chemin d’expansion), ce qui lui permet de collecter des informations locales et un contexte global. Les connexions de saut comblent le fossé entre les chemins d’encodage et de décodage, en conservant les informations critiques des couches précédentes et permettant une segmentation plus précise.
- Informations contextuelles et localisation : Les connexions de saut sont utilisées par UNET pour agréger des cartes de caractéristiques multi-échelles à partir de plusieurs couches, permettant au réseau d’absorber des informations contextuelles et de capturer des détails à différents niveaux d’abstraction. Cette intégration d’informations améliore la précision de localisation, permettant d’obtenir des limites d’objets exactes et des résultats de segmentation précis.
- Augmentation de données et régularisation : UNET utilise des techniques d’augmentation de données et de régularisation pour améliorer sa résilience et sa capacité de généralisation lors de l’entraînement. Pour augmenter la diversité des données d’entraînement, l’augmentation de données consiste à ajouter de nombreuses transformations aux images d’entraînement, telles que des rotations, des retournements, des mises à l’échelle et des déformations. Les techniques de régularisation telles que le dropout et la normalisation par lots empêchent le surajustement et améliorent les performances du modèle sur des données inconnues.
Aperçu de l’architecture UNET
UNET est une architecture de réseau de neurones convolutifs entièrement convolutifs (FCN) conçue pour les applications de segmentation d’images. Elle a été proposée pour la première fois en 2015 par Olaf Ronneberger, Philipp Fischer et Thomas Brox. UNET est fréquemment utilisé pour sa précision en matière de segmentation d’images et est devenu un choix populaire dans diverses applications d’imagerie médicale. UNET combine un chemin d’encodage, également appelé chemin de contraction, avec un chemin de décodage appelé chemin d’expansion. L’architecture est nommée d’après son aspect en forme de U lorsqu’elle est représentée dans un diagramme. Grâce à cette architecture en forme de U, le réseau peut enregistrer à la fois des caractéristiques locales et un contexte global, ce qui permet d’obtenir des résultats de segmentation précis.
Composants critiques de l’architecture UNET
- Chemin de contraction (chemin d’encodage) : Le chemin de contraction de UNET comprend des couches de convolution suivies d’opérations de max pooling. Cette méthode capture les caractéristiques à haute résolution et de bas niveau en réduisant progressivement les dimensions spatiales de l’image en entrée.
- Chemin d’expansion (chemin de décodage) : Des convolutions transposées, également appelées couches de déconvolution ou de suréchantillonnage, sont utilisées pour suréchantillonner les cartes de caractéristiques du chemin d’encodage dans le chemin d’expansion de UNET. La résolution spatiale des cartes de caractéristiques est augmentée pendant la phase de suréchantillonnage, ce qui permet au réseau de reconstituer une carte de segmentation dense.
- Connexions de saut : Les connexions de saut sont utilisées dans UNET pour connecter les couches correspondantes des chemins d’encodage et de décodage. Ces liens permettent au réseau de collecter à la fois des données locales et globales. Le réseau conserve des informations spatiales essentielles et améliore la précision de la segmentation en intégrant des cartes de caractéristiques provenant de couches antérieures avec celles du chemin de décodage.
- Concaténation : La concaténation est couramment utilisée pour mettre en œuvre des connexions de saut dans UNET. Les cartes de caractéristiques du chemin d’encodage sont concaténées avec les cartes de caractéristiques suréchantillonnées du chemin de décodage lors de la procédure de suréchantillonnage. Cette concaténation permet au réseau d’incorporer des informations multi-échelles pour une segmentation appropriée, exploitant le contexte de haut niveau et les caractéristiques de bas niveau.
- Couches entièrement convolutives : UNET comprend des couches de convolution sans couches entièrement connectées. Cette architecture convolutive permet à UNET de traiter des images de tailles illimitées tout en préservant les informations spatiales dans l’ensemble du réseau, le rendant flexible et adaptable à différentes tâches de segmentation.
Le chemin d’encodage, ou chemin de contraction, est un composant essentiel de l’architecture UNET. Il est chargé d’extraire des informations de haut niveau de l’image d’entrée tout en réduisant progressivement les dimensions spatiales.
Couches de convolution
Le processus d’encodage commence par un ensemble de couches de convolution. Les couches de convolution extraient des informations à plusieurs échelles en appliquant un ensemble de filtres apprenables à l’image d’entrée. Ces filtres fonctionnent sur le champ récepteur local, permettant au réseau de capturer des motifs spatiaux et des caractéristiques mineures. Avec chaque couche de convolution, la profondeur des cartes de caractéristiques augmente, permettant au réseau d’apprendre des représentations plus complexes.
Fonction d’activation
Après chaque couche de convolution, une fonction d’activation telle que la fonction linéaire rectifiée (ReLU) est appliquée élément par élément pour induire de la non-linéarité dans le réseau. La fonction d’activation aide le réseau à apprendre les corrélations non linéaires entre les images d’entrée et les caractéristiques extraites.
Couches de pooling
Les couches de pooling sont utilisées après les couches de convolution pour réduire la dimensionnalité spatiale des cartes de caractéristiques. Les opérations, telles que le max pooling, divisent les cartes de caractéristiques en régions non superposées et ne conservent que la valeur maximale à l’intérieur de chaque zone. Cela réduit la résolution spatiale en échantillonnant les cartes de caractéristiques, permettant au réseau de capturer des données plus abstraites et de plus haut niveau.
Le rôle du chemin d’encodage est de capturer des caractéristiques à différentes échelles et niveaux d’abstraction de manière hiérarchique. Le processus d’encodage se concentre sur l’extraction du contexte global et des informations de haut niveau à mesure que les dimensions spatiales diminuent.
Connexions de saut
La disponibilité de connexions de saut qui relient les niveaux appropriés du chemin d’encodage au chemin de décodage est l’une des caractéristiques distinctives de l’architecture UNET. Ces liens de saut sont essentiels pour conserver des données clés pendant le processus d’encodage.
Les cartes de caractéristiques provenant de couches antérieures collectent des détails locaux et des informations fines pendant le chemin d’encodage. Ces cartes de caractéristiques sont concaténées avec les cartes de caractéristiques suréchantillonnées dans le pipeline de décodage en utilisant des connexions de saut. Cela permet au réseau d’incorporer des données multi-échelles, des caractéristiques de bas niveau et un contexte de haut niveau dans le processus de segmentation.
En conservant les informations spatiales des couches antérieures, UNET peut localiser de manière fiable des objets et conserver des détails plus fins dans les résultats de segmentation. Les connexions de saut de UNET aident à résoudre le problème de perte d’informations causée par le sous-échantillonnage. Les liens de saut permettent une meilleure intégration des informations locales et globales, améliorant ainsi les performances de segmentation globales.
Pour résumer, l’approche d’encodage UNET est essentielle pour capturer les caractéristiques de haut niveau et réduire les dimensions spatiales de l’image d’entrée. Le chemin d’encodage extrait progressivement des représentations abstraites via des couches de convolution, des fonctions d’activation et des couches de pooling. En intégrant les caractéristiques locales et le contexte global, l’introduction de liens de saut permet de préserver les informations spatiales critiques, facilitant ainsi des résultats de segmentation fiables.
Chemin de décodage dans UNET
Un composant essentiel de l’architecture UNET est le chemin de décodage, également connu sous le nom de chemin d’expansion. Il est responsable de l’augmentation de la résolution spatiale des cartes de caractéristiques du chemin d’encodage et de la construction du masque de segmentation final.
Couches de suréchantillonnage (convolutions transposées)
Pour augmenter la résolution spatiale des cartes de caractéristiques, la méthode de décodage UNET comprend des couches de suréchantillonnage, souvent réalisées à l’aide de convolutions transposées ou de déconvolutions. Les convolutions transposées sont essentiellement l’opposé des convolutions régulières. Elles augmentent les dimensions spatiales au lieu de les diminuer, permettant ainsi le suréchantillonnage. En construisant un noyau peu dense et en l’appliquant à la carte de caractéristiques d’entrée, les convolutions transposées apprennent à suréchantillonner les cartes de caractéristiques. Le réseau apprend à combler les lacunes entre les emplacements spatiaux actuels au cours de ce processus, permettant ainsi d’augmenter la résolution des cartes de caractéristiques.
Concaténation
Les cartes de caractéristiques des couches précédentes sont concaténées avec les cartes de caractéristiques suréchantillonnées lors de la phase de décodage. Cette concaténation permet au réseau d’agréger des informations multi-échelles pour une segmentation correcte, en exploitant le contexte de haut niveau et les caractéristiques de bas niveau. En plus du suréchantillonnage, le chemin de décodage UNET comprend des connexions de saut provenant des niveaux comparables du chemin d’encodage.
Le réseau peut récupérer et intégrer des caractéristiques fines perdues lors de l’encodage en concaténant les cartes de caractéristiques provenant des connexions de saut. Cela permet une localisation et une délimitation plus précises des objets dans le masque de segmentation.
Le processus de décodage dans UNET reconstruit une carte de segmentation dense qui correspond à la résolution spatiale de l’image d’entrée en suréchantillonnant progressivement les cartes de caractéristiques et en incluant des liens de saut.
La fonction du chemin de décodage est de récupérer les informations spatiales perdues lors du chemin d’encodage et de raffiner les résultats de segmentation. Il combine les détails d’encodage de bas niveau avec le contexte de haut niveau acquis à partir des couches de suréchantillonnage pour fournir un masque de segmentation précis et complet.
UNET peut augmenter la résolution spatiale des cartes de caractéristiques en utilisant des convolutions transposées dans le processus de décodage, les suréchantillonnant ainsi pour correspondre à la taille de l’image d’origine. Les convolutions transposées aident le réseau à générer un masque de segmentation dense et détaillé en apprenant à combler les lacunes et à étendre les dimensions spatiales.
En résumé, le processus de décodage dans UNET reconstruit le masque de segmentation en améliorant la résolution spatiale des cartes de caractéristiques grâce aux couches de suréchantillonnage et aux connexions de saut. Les convolutions transposées sont essentielles dans cette phase car elles permettent au réseau de suréchantillonner les cartes de caractéristiques et de construire un masque de segmentation détaillé correspondant à l’image d’entrée d’origine.
Chemins de contraction et d’expansion dans UNET
L’architecture UNET suit une structure “encodeur-décodeur”, où le chemin de contraction représente l’encodeur et le chemin d’expansion représente le décodeur. Cette conception ressemble à l’encodage des informations sous une forme compressée, puis à leur décodage pour reconstruire les données d’origine.
Chemin de contraction (encodeur)
L’encodeur dans UNET est le chemin de contraction. Il extrait le contexte et compresse l’image d’entrée en diminuant progressivement les dimensions spatiales. Cette méthode comprend des couches de convolution suivies de procédures de pooling telles que le max pooling pour sous-échantillonner les cartes de caractéristiques. Le chemin de contraction est responsable de l’obtention de caractéristiques de haut niveau, de l’apprentissage du contexte global et de la diminution de la résolution spatiale. Il se concentre sur la compression et l’abstraction de l’image d’entrée, capturant efficacement les informations pertinentes pour la segmentation.
Chemin d’expansion (décodeur)
Le décodeur dans UNET est le chemin d’expansion. En suréchantillonnant les cartes de caractéristiques du chemin de contraction, il récupère les informations spatiales et génère la carte de segmentation finale. La route d’expansion comprend des couches de suréchantillonnage, souvent réalisées avec des convolutions transposées ou des déconvolutions pour augmenter la résolution spatiale des cartes de caractéristiques. Le chemin d’expansion reconstruit les dimensions spatiales d’origine via des connexions de saut en intégrant les cartes de caractéristiques suréchantillonnées avec les cartes équivalentes du chemin de contraction. Cette méthode permet au réseau de récupérer des caractéristiques fines et de localiser correctement les éléments.
La conception UNET capture le contexte global et les détails locaux en mélangeant les voies de contraction et d’expansion. Le chemin de contraction compresse l’image d’entrée dans une représentation compacte, décidée pour construire une carte de segmentation détaillée par le chemin d’expansion. Le chemin d’expansion se concentre sur le décodage de la représentation compressée en une carte de segmentation dense et précise. Il reconstruit les informations spatiales manquantes et affine les résultats de segmentation. Cette structure encodeur-décodeur permet une segmentation précise en utilisant un contexte de haut niveau et des informations spatiales fines.
En résumé, les routes de contraction et d’expansion de UNET ressemblent à une structure “encodeur-décodeur”. Le chemin d’expansion est le décodeur, récupérant les informations spatiales et générant la carte de segmentation finale. En revanche, le chemin de contraction sert d’encodeur, capturant le contexte et comprimant l’image d’entrée. Cette architecture permet à UNET d’encoder et de décoder les informations de manière efficace, permettant une segmentation d’image précise et approfondie.
Connexions de saut dans UNET
Les connexions de saut sont essentielles à la conception de UNET car elles permettent aux informations de circuler entre les chemins de contraction (encodage) et d’expansion (décodage). Elles sont cruciales pour maintenir les informations spatiales et améliorer la précision de la segmentation.
Préservation des informations spatiales
Certaines informations spatiales peuvent être perdues lors du cheminement de l’encodage car les cartes de caractéristiques subissent des procédures de rééchantillonnage telles que le pooling maximal. Cette perte d’informations peut entraîner une précision de localisation inférieure et une perte de détails fins dans le masque de segmentation.
En établissant des connexions directes entre les couches correspondantes dans les processus d’encodage et de décodage, les connexions de saut aident à résoudre ce problème. Les connexions de saut protègent les informations spatiales vitales qui seraient sinon perdues lors du rééchantillonnage. Ces connexions permettent aux informations du flux d’encodage d’éviter le rééchantillonnage et d’être transmises directement au chemin de décodage.
Fusion des informations à plusieurs échelles
Les connexions de saut permettent la fusion des informations à plusieurs échelles provenant de nombreuses couches du réseau. Les niveaux ultérieurs du processus d’encodage capturent le contexte de haut niveau et les informations sémantiques, tandis que les couches antérieures capturent les détails locaux et les informations fines. UNET peut combiner avec succès les informations locales et globales en connectant ces cartes de caractéristiques du chemin d’encodage aux couches équivalentes du chemin de décodage. Cette intégration des informations à plusieurs échelles améliore la précision de la segmentation dans l’ensemble. Le réseau peut utiliser des données de bas niveau provenant du chemin d’encodage pour affiner les résultats de segmentation dans le chemin de décodage, permettant une localisation plus précise et une meilleure délimitation des contours des objets.
Combinaison du contexte de haut niveau et des détails de bas niveau
Les connexions de saut permettent au chemin de décodage de combiner le contexte de haut niveau et les détails de bas niveau. Les cartes de caractéristiques concaténées des connexions de saut comprennent les cartes de caractéristiques rééchantillonnées du chemin de décodage et les cartes de caractéristiques du chemin d’encodage.
Cette combinaison permet au réseau de tirer parti du contexte de haut niveau enregistré dans le chemin de décodage et des caractéristiques détaillées capturées dans le chemin d’encodage. Le réseau peut incorporer des informations de plusieurs tailles, permettant une segmentation plus précise et détaillée.
UNET peut tirer parti des informations à plusieurs échelles, préserver les détails spatiaux et fusionner le contexte de haut niveau avec les détails de bas niveau en ajoutant des connexions de saut. En conséquence, la précision de la segmentation s’améliore, la localisation des objets s’améliore et les informations détaillées du masque de segmentation sont conservées.
En conclusion, les connexions de saut dans les UNET sont essentielles pour maintenir les informations spatiales, intégrer des informations à plusieurs échelles et améliorer la précision de la segmentation. Elles permettent un flux d’informations direct à travers les chemins d’encodage et de décodage, permettant au réseau de collecter des détails locaux et globaux, ce qui se traduit par une segmentation d’image plus précise et détaillée.
Fonction de perte dans UNET
Il est essentiel de sélectionner une fonction de perte appropriée lors de l’entraînement de UNET et de l’optimisation de ses paramètres pour les tâches de segmentation d’images. UNET utilise fréquemment des fonctions de perte favorables à la segmentation telles que le coefficient de Dice ou la perte de l’entropie croisée.
Perte du coefficient de Dice
Le coefficient de Dice est une statistique de similarité qui calcule le chevauchement entre les masques de segmentation anticipés et réels. La perte du coefficient de Dice, ou perte de Dice douce, est calculée en soustrayant un du coefficient de Dice. Lorsque les masques anticipés et les masques de vérité terrain sont bien alignés, la perte est minimisée, ce qui entraîne un coefficient de Dice plus élevé.
La perte du coefficient de Dice est particulièrement efficace pour les ensembles de données déséquilibrés dans lesquels la classe d’arrière-plan contient de nombreux pixels. En pénalisant les faux positifs et les faux négatifs, elle encourage le réseau à diviser avec précision les régions avant-plan et arrière-plan.
Perte de l’entropie croisée
Utilisez la fonction de perte de l’entropie croisée dans les tâches de segmentation d’images. Elle mesure la dissimilarité entre les probabilités de classe prédites et les étiquettes de vérité terrain. Traitez chaque pixel comme un problème de classification indépendant en matière de segmentation d’images, et la perte de l’entropie croisée est calculée pixel par pixel.
La perte de l’entropie croisée encourage le réseau à attribuer des probabilités élevées aux étiquettes de classe correctes pour chaque pixel. Elle pénalise les écarts par rapport à la vérité terrain, favorisant des résultats de segmentation précis. Cette fonction de perte est efficace lorsque les classes avant-plan et arrière-plan sont équilibrées ou lorsque plusieurs classes sont impliquées dans la tâche de segmentation.
Le choix entre la perte du coefficient de Dice et la perte de l’entropie croisée dépend des exigences spécifiques de la tâche de segmentation et des caractéristiques de l’ensemble de données. Les deux fonctions de perte présentent des avantages et peuvent être combinées ou personnalisées en fonction des besoins spécifiques.
1: Importation des bibliothèques
import tensorflow as tf
import os
import numpy as np
from tqdm import tqdm
from skimage.io import imread, imshow
from skimage.transform import resize
import matplotlib.pyplot as plt
import random
2: Dimensions de l’image – Paramètres
IMG_WIDTH = 128
IMG_HEIGHT = 128
IMG_CHANNELS = 3
3: Réglage de l’aléatoire
seed = 42
np.random.seed = seed
4: Importation du jeu de données
# Données téléchargées depuis - https://www.kaggle.com/competitions/data-science-bowl-2018/data
# Importation des jeux de données
TRAIN_PATH = 'stage1_train/'
TEST_PATH = 'stage1_test/'
5: Lecture de toutes les images présentes dans le sous-dossier
train_ids = next(os.walk(TRAIN_PATH))[1]
test_ids = next(os.walk(TEST_PATH))[1]
6: Entraînement
X_train = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)
Y_train = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)
7: Redimensionnement des images
print('Redimensionnement des images d'entraînement et des masques')
for n, id_ in tqdm(enumerate(train_ids), total=len(train_ids)):
path = TRAIN_PATH + id_
img = imread(path + '/images/' + id_ + '.png')[:,:,:IMG_CHANNELS]
img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)
X_train[n] = img #Remplir X_train vide avec les valeurs de img
mask = np.zeros((IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)
for mask_file in next(os.walk(path + '/masks/'))[2]:
mask_ = imread(path + '/masks/' + mask_file)
mask_ = np.expand_dims(resize(mask_, (IMG_HEIGHT, IMG_WIDTH), mode='constant',
preserve_range=True), axis=-1)
mask = np.maximum(mask, mask_)
Y_train[n] = mask
8: Test des images
# Images de test
X_test = np.zeros((len(test_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)
sizes_test = []
print('Redimensionnement des images de test')
for n, id_ in tqdm(enumerate(test_ids), total=len(test_ids)):
path = TEST_PATH + id_
img = imread(path + '/images/' + id_ + '.png')[:,:,:IMG_CHANNELS]
sizes_test.append([img.shape[0], img.shape[1]])
img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)
X_test[n] = img
print('Terminé !')
9: Vérification aléatoire des images
image_x = random.randint(0, len(train_ids))
imshow(X_train[image_x])
plt.show()
imshow(np.squeeze(Y_train[image_x]))
plt.show()
10: Construction du modèle
inputs = tf.keras.layers.Input((IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))
s = tf.keras.layers.Lambda(lambda x: x / 255)(inputs)
11: Chemins
# Chemin de contraction
c1 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu',
kernel_initializer='he_normal', padding='same')(s)
c1 = tf.keras.layers.Dropout(0.1)(c1)
c1 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu',
kernel_initializer='he_normal', padding='same')(c1)
p1 = tf.keras.layers.MaxPooling2D((2, 2))(c1)
c2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu',
kernel_initializer='he_normal', padding='same')(p1)
c2 = tf.keras.layers.Dropout(0.1)(c2)
c2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu',
kernel_initializer='he_normal', padding='same')(c2)
p2 = tf.keras.layers.MaxPooling2D((2, 2))(c2)
c3 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu',
kernel_initializer='he_normal', padding='same')(p2)
c3 = tf.keras.layers.Dropout(0.2)(c3)
c3 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu',
kernel_initializer='he_normal', padding='same')(c3)
p3 = tf.keras.layers.MaxPooling2D((2, 2))(c3)
c4 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu',
kernel_initializer='he_normal', padding='same')(p3)
c4 = tf.keras.layers.Dropout(0.2)(c4)
c4 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu',
kernel_initializer='he_normal', padding='same')(c4)
p4 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(c4)
c5 = tf.keras.layers.Conv2D(256, (3, 3), activation='relu',
kernel_initializer='he_normal', padding='same')(p4)
c5 = tf.keras.layers.Dropout(0.3)(c5)
c5 = tf.keras.layers.Conv2D(256, (3, 3), activation='relu',
kernel_initializer='he_normal', padding='same')(c5)
12: Chemins d’Expansion
u6 = tf.keras.layers.Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(c5)
u6 = tf.keras.layers.concatenate([u6, c4])
c6 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal',
padding='same')(u6)
c6 = tf.keras.layers.Dropout(0.2)(c6)
c6 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal',
padding='same')(c6)
u7 = tf.keras.layers.Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(c6)
u7 = tf.keras.layers.concatenate([u7, c3])
c7 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal',
padding='same')(u7)
c7 = tf.keras.layers.Dropout(0.2)(c7)
c7 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal',
padding='same')(c7)
u8 = tf.keras.layers.Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(c7)
u8 = tf.keras.layers.concatenate([u8, c2])
c8 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal',
padding='same')(u8)
c8 = tf.keras.layers.Dropout(0.1)(c8)
c8 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal',
padding='same')(c8)
u9 = tf.keras.layers.Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same')(c8)
u9 = tf.keras.layers.concatenate([u9, c1], axis=3)
c9 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal',
padding='same')(u9)
c9 = tf.keras.layers.Dropout(0.1)(c9)
c9 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal',
padding='same')(c9)
13: Sorties
outputs = tf.keras.layers.Conv2D(1, (1, 1), activation='sigmoid')(c9)
14: Résumé
model = tf.keras.Model(inputs=[inputs], outputs=[outputs])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
15: Point de Sauvegarde du Modèle
checkpointer = tf.keras.callbacks.ModelCheckpoint('model_for_nuclei.h5',
verbose=1, save_best_only=True)
callbacks = [
tf.keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'),
tf.keras.callbacks.TensorBoard(log_dir='logs')]
results = model.fit(X_train, Y_train, validation_split=0.1, batch_size=16, epochs=25,
callbacks=callbacks)
16: Dernière Étape – Prédiction
idx = random.randint(0, len(X_train))
preds_train = model.predict(X_train[:int(X_train.shape[0]*0.9)], verbose=1)
preds_val = model.predict(X_train[int(X_train.shape[0]*0.9):], verbose=1)
preds_test = model.predict(X_test, verbose=1)
preds_train_t = (preds_train > 0.5).astype(np.uint8)
preds_val_t = (preds_val > 0.5).astype(np.uint8)
preds_test_t = (preds_test > 0.5).astype(np.uint8)
# Effectuer une vérification de cohérence sur des échantillons d'entraînement aléatoires
ix = random.randint(0, len(preds_train_t))
imshow(X_train[ix])
plt.show()
imshow(np.squeeze(Y_train[ix]))
plt.show()
imshow(np.squeeze(preds_train_t[ix]))
plt.show()
# Effectuer une vérification de cohérence sur des échantillons de validation aléatoires
ix = random.randint(0, len(preds_val_t))
imshow(X_train[int(X_train.shape[0]*0.9):][ix])
plt.show()
imshow(np.squeeze(Y_train[int(Y_train.shape[0]*0.9):][ix]))
plt.show()
imshow(np.squeeze(preds_val_t[ix]))
plt.show()
Conclusion
Dans cet article de blog complet, nous avons couvert l’architecture UNET pour la segmentation d’images. En abordant les contraintes des méthodologies précédentes, l’architecture UNET a révolutionné la segmentation d’images. Ses chemins d’encodage et de décodage, ses connexions de saut et d’autres modifications, telles que U-Net++, Attention U-Net et Dense U-Net, se sont révélés extrêmement efficaces pour capturer le contexte, maintenir les informations spatiales et améliorer la précision de la segmentation. Le potentiel de segmentation précise et automatique avec UNET offre de nouvelles voies pour améliorer la vision par ordinateur et au-delà. Nous encourageons les lecteurs à en savoir plus sur UNET et à expérimenter sa mise en œuvre pour maximiser son utilité dans leurs projets de segmentation d’images.
Points clés
1. La segmentation d’images est essentielle dans les tâches de vision par ordinateur, permettant la division des images en régions ou objets significatifs.
2. Les approches traditionnelles de segmentation d’images, telles que l’annotation manuelle et la classification pixel par pixel, présentent des limites en termes d’efficacité et de précision.
3. Développez l’architecture UNET pour répondre à ces limitations et obtenir des résultats de segmentation précis.
4. Il s’agit d’un réseau de neurones entièrement convolutif (FCN) combinant un chemin d’encodage pour capturer des caractéristiques de haut niveau et une méthode de décodage pour générer le masque de segmentation.
5. Les connexions de saut dans UNET préservent les informations spatiales, améliorent la propagation des caractéristiques et améliorent la précision de la segmentation.
6. Ont trouvé des applications réussies dans l’imagerie médicale, l’analyse d’images satellites et le contrôle de qualité industriel, atteignant des références notables et une reconnaissance dans les compétitions.
Questions fréquemment posées
Les médias présentés dans cet article ne sont pas la propriété d’Analytics Vidhya et sont utilisés à la discrétion de l’auteur.
We will continue to update IPGirl; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Implémentation de ParDo et DoFn dans Apache Beam en détails
- Révolutionner la robotique une pince imprimée en 3D qui fonctionne sans électronique
- Génération de données synthétiques avec Python
- Tous les grands modèles de langage (LLM) que vous devez connaître en 2023
- Votre modèle est-il bon? Une plongée approfondie dans les métriques avancées de Amazon SageMaker Canvas
- Une nouvelle recherche en IA propose le modèle PanGu-Coder2 et le cadre RRTF qui améliorent efficacement les modèles de langage pré-entraînés de grande taille pour la génération de code.
- Créez des flux de travail de repliement des protéines pour accélérer la découverte de médicaments sur Amazon SageMaker