Il s'agit d'une continuation de la segmentation sémantique à l'aide du Microsoft Cognitive Toolkit (CNTK).
Dans la partie 2, la segmentation sémantique sera effectuée à l'aide du modèle de pré-formation préparé dans la partie 1. On suppose que vous avez installé NVIDIA GPU CUDA et que vous disposez d'un SSD d'une capacité de 500 Go ou plus.
Dans Computer Vision: Semantic Segmentation Part1 --ImageNet pretraining VoVNet, nous avons formé un modèle de pré-formation CNN à l'aide d'images collectées à partir d'ImageNet.
Dans la partie 2, nous allons créer et entraîner un modèle de segmentation sémantique avec un réseau de neurones.
ADEChallengeData2016 Utilisez ADEChallengeDate2016 [1] comme jeu de données de segmentation sémantique. Téléchargez le fichier zip à partir du lien ci-dessous et décompressez-le. ADEChallengeDate2016 prédit un total de 151 catégories avec 150 étiquettes de catégorie et arrière-plans.
L'image d'entrée est une image couleur BGR d'une taille de 320x480 et la carte de sortie est de 151x320x480. Pour les informations d'étiquette de catégorie, j'ai enregistré un tableau d'entiers 151x320x480 en tant que fichier numpy.
Cette fois, j'ai créé un modèle basé sur les décodeurs de Joint Pyramid Upsampling (JPU) [2] et DeepLabv3 + [3]. Le contour du réseau neuronal mis en œuvre est illustré dans la figure ci-dessous.
Le modèle mis en œuvre peut être grossièrement divisé en trois étapes de traitement.
Certaines des couches convolutives à ajouter utilisent la convolution séparable [4], en particulier JPU utilise la convolution séparable dilatée en combinaison avec la convolution dilatée [5].
Nous avons appliqué la normalisation par lots [6] immédiatement après tout sauf la dernière couche convolutive 1x1 et adopté Mish [7] pour la fonction d'activation.
La valeur initiale des paramètres de la couche convolutive à apprendre a été fixée à la distribution normale de He [8].
Cette fois, nous utiliserons la fonction de perte multitâche. Utilisez la perte focale [9] pour la classification de catégorie non uniforme et la perte généralisée de dés [10] pour minimiser le chevauchement des prédictions.
Loss = Focal Loss + Generalized Dice Loss
Adam [11] a été utilisé comme algorithme d'optimisation. L'hyperparamètre d'Adam $ β_1 $ est défini sur 0,9 et $ β_2 $ sur la valeur par défaut de CNTK.
Pour le taux d'apprentissage, utilisez le taux d'apprentissage cyclique (CLR) [12], le taux d'apprentissage maximal est de 1e-3, le taux d'apprentissage de base est de 1e-5, la taille de pas est 10 fois le nombre d'époques et la politique est Réglez sur triangular2.
La formation du modèle a effectué 100 Epoch avec une formation en mini-lot de taille mini-lot 8.
・ Processeur Intel (R) Core (TM) i7-5820K 3,30 GHz ・ GPU NVIDIA Quadro RTX 6000 24 Go
・ Windows 10 Professionnel 1909 ・ CUDA 10.0 ・ CuDNN 7.6 ・ Python 3.6.6 ・ Cntk-gpu 2.7 ・ Cntkx 0,1,50 ・ H5py 2.10.0 ・ Numpy 1.17.3 ・ Opencv-contrib-python 4.1.1.26 ・ Pandas 0.25.0
Le programme de création de données d'entraînement et le programme d'entraînement sont disponibles sur GitHub.
rtss_ade20k.py
rtss_training.py
Je compléterai le contenu principal de cette implémentation.
Dilated Separable Convolution
Separable Convolution La convolution séparable applique une convolution indépendante (en profondeur) et une convolution en canal uniquement (en un point) pour chaque canal dans l'ordre, comme indiqué ci-dessous.
Suite à Xception [4], aucune fonction d'activation n'est appliquée entre profondeur et point.
Dilated Convolution Dans la convolution dilatée, comme le montre la figure ci-dessous, 0 est inséré entre les filtres de convolution pour augmenter la taille du filtre, et le processus de convolution est effectué par le filtre de convolution. Cela vous permet d'élargir le champ de vision du filtre de convolution. Quand $ r = 1 $, c'est une convolution normale.
La figure ci-dessous compare un filtre différentiel gaussien vertical entre la convolution régulière et la convolution dilatée.
Vous pouvez voir que le résultat de la convolution dilatée est plus lisse que le résultat de la convolution normale.
Joint Pyramid Upsampling (JPU) Dans le modèle mis en œuvre cette fois, la partie qui acquiert des informations sur la segmentation sémantique contextuelle est le suréchantillonnage de pyramides conjointes. La figure ci-dessous montre le traitement interne du JPU. Où 1/32, 1/16, 1/8 représentent la réduction de la taille d'entrée.
Le JPU prend en entrée des cartes de caractéristiques de trois résolutions différentes, les convolve d'abord chacune avec un 3x3 normal, puis les suréchantillonne et les concatène à une résolution de 1/8. Ensuite, le résultat de l'exécution de quatre types de convolution séparable dilatée en parallèle est émis.
Multi-Task Loss
Focal Loss En supposant que la sortie de prédiction par Softmax en tant que probabilité est $ p $, l'entropie croisée et la perte focale peuvent être exprimées par les équations suivantes.
CrossEntropy = -\log(p) \\
FocalLoss = -\alpha(1 - p)^\gamma \log(p)
La figure ci-dessous montre une comparaison de l'entropie croisée et de la perte focale. L'axe horizontal représente $ p $ et l'axe vertical représente la perte. La perte focale maintient les pertes faibles pour les éléments bien classés tels que 0,8-1,0. Dans cette implémentation, nous définissons $ \ alpha = 1, \ gamma = 2 $.
Generalized Dice Loss Lorsque la zone de prédiction est $ A $ et la zone correcte est $ B $, le coefficient de Dice est souvent utilisé comme indice de quantification du degré de chevauchement entre les deux zones.
Dice = \frac{2|A \cap B|}{|A| + |B|}
Si la zone de prédiction et la zone correcte correspondent exactement, le coefficient de dés a une valeur maximale de 1. Par conséquent, en supposant que la prédiction est $ p $ et que la réponse correcte est $ t $, la perte de dés est la suivante.
Dice Loss = 1 - 2 \frac{\sum^C_{c=1}\sum^N_{i=1}p^c_i t^c_i}{\sum^C_{c=1}\sum^N_{i=1} \left( p^c_i + t^c_i \right)}
Où $ C $ est le nombre de catégories et $ N $ est le nombre total de pixels. La perte de dés généralisée applique $ w_c $ à la perte de dés pour tenir compte de l'immuabilité entre les catégories.
Generalized Dice Loss = 1 - 2 \frac{\sum^C_{c=1}w_c \sum^N_{i=1}p^c_i t^c_i}{\sum^C_{c=1}w_c \sum^N_{i=1} \left( p^c_i + t^c_i \right)} \\
w_c = \frac{1}{\left( \sum^N_{i=1} t^c_i \right)^2}
Training loss and dice coefficient La figure ci-dessous est une visualisation du journal de la fonction de perte et du coefficient de dés pendant l'entraînement. Le graphique de gauche est la fonction de perte, le graphique de droite est le coefficient de dés, l'axe horizontal est le nombre d'époques et l'axe vertical est la valeur de la fonction de perte et le coefficient de dés, respectivement.
Validation mIOU Score Maintenant que nous avons formé le modèle de segmentation sémantique, nous avons évalué les performances à l'aide des données de vérification.
Pour cette évaluation de la performance, nous avons calculé l'intersection moyenne sur union (mIOU). L'utilisation de la validation comme données de validation a donné les résultats suivants:
mIOU 3.0
FPS and Demo J'ai également mesuré le FPS, qui est un indice de vitesse d'exécution. La mesure utilisait le temps standard du module Python et le matériel utilisé était le GPU NVIDIA GeForce GTX 1060 6 Go. Si vous ne voulez pas colorer les résultats, c'est FPS 4.0.
FPS 2.4
Ci-dessous, une vidéo d'essayer la segmentation sémantique sur un modèle entraîné.
Computer Vision : Semantic Segmentation Part1 - ImageNet pretraining VoVNet
Recommended Posts