[PYTHON] Vision par ordinateur: segmentation sémantique, partie 2 - segmentation sémantique en temps réel

Cible

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.

introduction

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.

ADEChallengeData2016.zip

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.

Structure du réseau neuronal

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.

rtss.png

Le modèle mis en œuvre peut être grossièrement divisé en trois étapes de traitement.

  1. Extraction de fonctionnalités avec VoVNet57 pré-formé comme backbone
  2. JPU qui reçoit des cartes de caractéristiques avec trois résolutions différentes et affine les caractéristiques pour la segmentation sémantique contextuelle.
  3. Décodeur qui obtient une carte de sortie prédite de la même taille que la résolution d'entrée après avoir concaténé la carte de caractéristiques cultivée par JPU et la carte de caractéristiques de bas niveau.

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.

Paramètres en formation

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.

la mise en oeuvre

Environnement d'exécution

Matériel

・ Processeur Intel (R) Core (TM) i7-5820K 3,30 GHz ・ GPU NVIDIA Quadro RTX 6000 24 Go

Logiciel

・ 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

Programme à exécuter

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


Commentaire

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.

depthwise_pointwise.png

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.

dilated_convolution.png

La figure ci-dessous compare un filtre différentiel gaussien vertical entre la convolution régulière et la convolution dilatée.

regular_dilated.png

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.

jpu.png

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 $.

focal_loss.png

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}

résultat

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.

rtss320x480_logging.png

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é.

rtss.gif

référence

ADE20K dataset

Computer Vision : Semantic Segmentation Part1 - ImageNet pretraining VoVNet

  1. Bolei Zhou, Hang Zhao, Xavier Puig, Sanja Fidler, Adela Barriuso, and Antonio Torralba. "Scene Parsing through ADE20K Dataset", the IEEE conference on computer vision and pattern recognition. 2017. pp 633-641.
  2. Huikai Wu, Junge Zhang, Kaiqi Huang, Kongming Liang, and Yizhou Yu. "FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation", arXiv preprint arXiv:1903.11816 (2019).
  3. Liang-Chieh Chen, Yukun Zhu, George Papandreou, Florian Schroff, and Hartwig Adam. "Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation", the European conference on computer vision (ECCV). 2018. p. 801-818.
  4. Francois Chollet. "Xception: Deep Learning with Depthwise Separable Convolutions", The IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2017, p. 1251-1258.
  5. Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, Kevin Murphy, and Alan L. Yuille. "DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs", IEEE transactions on pattern analysis and machine intelligence 40.4 (2017): 834-848.
  6. Ioffe Sergey and Christian Szegedy. "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift", arXiv preprint arXiv:1502.03167 (2015).
  7. Misra, Diganta. "Mish: A self regularized non-monotonic neural activation function." arXiv preprint arXiv:1908.08681 (2019).
  8. Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification", The IEEE International Conference on Computer Vision (ICCV). 2015, p. 1026-1034.
  9. Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, and Piotr Dollar. "Focal Loss for Dense Object Detection", the IEEE international conference on computer vision. 2017. p. 2980-2988.
  10. Carole H. Sudre, Wenqi Li, Tom Vercauteren, Sebastien Ourselin, and M. Jorge Cardoso. "Generalised Dice overlap as a deep learning loss function for highly unbalanced segmentations", Deep learning in medical image analysis and multimodal learning for clinical decision support. Springer, Cham, 2017. p. 240-248.
  11. Diederik P. Kingma and Jimmy Lei Ba. "Adam: A method for stochastic optimization", arXiv preprint arXiv:1412.6980 (2014).
  12. Leslie N. Smith. "Cyclical Learning Rates for Training Neural Networks", 2017 IEEE Winter Conference on Applications of Computer Vision. 2017, p. 464-472.

Recommended Posts

Vision par ordinateur: segmentation sémantique, partie 2 - segmentation sémantique en temps réel
Vision par ordinateur: segmentation sémantique, partie 1: pré-formation ImageNet VoVNet
Computer Vision: Object Detection Part1 - Prétraitement de la boîte englobante
Essayez la segmentation sémantique (Pytorch)
Ours ... pas de segmentation sémantique
Extraire uniquement la partie chat de l'image du chat (segmentation mat / semantig)