[PYTHON] Computer Vision: Semantische Segmentierung Teil2 - Semantische Echtzeitsegmentierung

Ziel

Dies ist eine Fortsetzung der semantischen Segmentierung mit dem Microsoft Cognitive Toolkit (CNTK).

In Teil 2 wird die semantische Segmentierung unter Verwendung des in Teil 1 erstellten Vorschulungsmodells durchgeführt. Es wird davon ausgegangen, dass Sie NVIDIA GPU CUDA installiert haben und dass Sie eine SSD mit einer Kapazität von 500 GB oder mehr haben.

Einführung

In Computer Vision: Semantische Segmentierung Teil 1 - ImageNet-Pretraining VoVNet haben wir ein CNN-Pretraining-Modell unter Verwendung von aus ImageNet gesammelten Bildern trainiert.

In Teil 2 werden wir ein semantisches Segmentierungsmodell mit einem neuronalen Netzwerk erstellen und trainieren.

ADEChallengeData2016 Verwenden Sie ADEChallengeDate2016 [1] als semantischen Segmentierungsdatensatz. Laden Sie die Zip-Datei über den folgenden Link herunter und entpacken Sie sie. ADEChallengeDate2016 prognostiziert insgesamt 151 Kategorien mit 150 Kategorielabels und Hintergründen.

ADEChallengeData2016.zip

Das Eingabebild ist ein BGR-Farbbild mit einer Größe von 320 x 480 und die Ausgabekarte ist 151 x 320 x 480. Für die Informationen zur Kategoriebeschriftung habe ich ein ganzzahliges Array mit 151 x 320 x 480 als Numpy-Datei gespeichert.

Struktur des neuronalen Netzes

Dieses Mal habe ich ein Modell erstellt, das auf den Decodern von Joint Pyramid Upsampling (JPU) [2] und DeepLabv3 + [3] basiert. Der Umriss des implementierten neuronalen Netzwerks ist in der folgenden Abbildung dargestellt.

rtss.png

Das implementierte Modell kann grob in drei Verarbeitungsstufen unterteilt werden.

  1. Merkmalsextraktion mit vorab trainiertem VoVNet57 als Backbone
  2. JPU, die Feature-Maps mit drei verschiedenen Auflösungen empfängt und Features für die kontextbezogene semantische Segmentierung verfeinert.
  3. Decoder, der nach Verkettung der von JPU kultivierten Feature-Map und der Low-Level-Feature-Map eine vorhergesagte Ausgabekarte mit der gleichen Größe wie die Eingabeauflösung erhält.

Einige der hinzuzufügenden Faltungsschichten verwenden Separable Convolution [4], insbesondere JPU verwendet Dilated Separable Convolution in Kombination mit Dilated Convolution [5].

Wir haben die Batch-Normalisierung [6] unmittelbar nach der letzten 1x1-Faltungsschicht angewendet und Mish [7] für die Aktivierungsfunktion übernommen.

Einstellungen im Training

Der Anfangswert der Parameter der zu lernenden Faltungsschicht wurde auf die Normalverteilung von He [8] gesetzt.

Dieses Mal werden wir die Multitasking-Verlustfunktion verwenden. Verwenden Sie Focal Loss [9] für eine uneinheitliche Kategorisierung und Generalized Dice Loss [10] zur Minimierung der Vorhersageüberlappung.

Loss = Focal Loss + Generalized Dice Loss

Adam [11] wurde als Optimierungsalgorithmus verwendet. Adams Hyperparameter $ β_1 $ wird auf 0,9 und $ β_2 $ auf den Standardwert von CNTK gesetzt.

Verwenden Sie für die Lernrate die zyklische Lernrate (CLR) [12], die maximale Lernrate beträgt 1e-3, die Basis-Lernrate beträgt 1e-5, die Schrittgröße beträgt das 10-fache der Anzahl der Epochen und die Richtlinie ist Auf triangular2 setzen.

Das Modelltraining führte 100 Epochen mit einem Mini-Batch-Training der Mini-Batch-Größe 8 durch.

Implementierung

Ausführungsumgebung

Hardware-

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

Software

・ Windows 10 Pro 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

Programm zum Ausführen

Das Programm zum Erstellen von Trainingsdaten und das Programm zum Training sind auf [GitHub] verfügbar (https://github.com/sho-watari/ComputerVision/tree/master/RTSS).

rtss_ade20k.py


rtss_training.py


Kommentar

Ich werde den Hauptinhalt dieser Implementierung ergänzen.

Dilated Separable Convolution

Separable Convolution Die trennbare Faltung wendet für jeden Kanal nacheinander eine unabhängige Faltung (in der Tiefe) und eine Nur-Kanal-Faltung (in Punktrichtung) an, wie unten gezeigt.

depthwise_pointwise.png

Nach Xception [4] wird keine Aktivierungsfunktion zwischen Tiefen- und Punktrichtung angewendet.

Dilated Convolution Bei der erweiterten Faltung wird, wie in der folgenden Abbildung gezeigt, 0 zwischen die Faltungsfilter eingefügt, um die Filtergröße zu erhöhen, und der Faltungsprozess wird vom Faltungsfilter ausgeführt. Auf diese Weise können Sie das Sichtfeld des Faltungsfilters erweitern. Wenn $ r = 1 $ ist, ist es eine normale Faltung.

dilated_convolution.png

Die folgende Abbildung vergleicht ein vertikales Gaußsches Differentialfilter zwischen regulärer Faltung und erweiterter Faltung.

regular_dilated.png

Sie können sehen, dass das Ergebnis der erweiterten Faltung glatter ist als das normale Faltungsergebnis.

Joint Pyramid Upsampling (JPU) In dem diesmal implementierten Modell ist der Teil, der Informationen zur kontextuellen semantischen Segmentierung erhält, Joint Pyramid Upsampling. Die folgende Abbildung zeigt die interne Verarbeitung der JPU. Wobei 1/32, 1/16, 1/8 die Verkleinerung der Eingabegröße darstellen.

jpu.png

Die JPU verwendet Feature-Maps mit drei verschiedenen Auflösungen als Eingabe, faltet sie jeweils mit einem normalen 3x3-Format zusammen, führt dann ein Upsampling durch und verkettet sie auf eine Auflösung von 1/8. Als nächstes wird das Ergebnis der parallelen Ausführung von vier Arten von erweiterter trennbarer Faltung ausgegeben.

Multi-Task Loss

Focal Loss Unter der Annahme, dass die von Softmax als Wahrscheinlichkeit ausgegebene Vorhersage $ p $ ist, können Cross Entropy und Focal Loss durch die folgenden Gleichungen ausgedrückt werden.

CrossEntropy = -\log(p) \\
FocalLoss = -\alpha(1 - p)^\gamma \log(p)

Die folgende Abbildung zeigt einen Vergleich von Cross Entropy und Focal Loss. Die horizontale Achse repräsentiert $ p $ und die vertikale Achse repräsentiert Verlust. Focal Loss hält Verluste für gut klassifizierte Artikel wie 0,8-1,0 gering. In dieser Implementierung setzen wir $ \ alpha = 1, \ gamma = 2 $.

focal_loss.png

Generalized Dice Loss Wenn der Vorhersagebereich $ A $ und der richtige Bereich $ B $ ist, wird der Würfelkoeffizient häufig als Quantifizierungsindex für den Grad der Überlappung zwischen den beiden Bereichen verwendet.

Dice = \frac{2|A \cap B|}{|A| + |B|}

Wenn der Vorhersagebereich und der richtige Bereich genau übereinstimmen, hat der Würfelkoeffizient einen Maximalwert von 1. Unter der Annahme, dass die Vorhersage $ p $ ist und die richtige Antwort $ t $ ist, lautet der Würfelverlust daher wie folgt.

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)}

Dabei ist $ C $ die Anzahl der Kategorien und $ N $ die Gesamtzahl der Pixel. Allgemeiner Würfelverlust wendet $ w_c $ auf Würfelverlust an, um die Unveränderlichkeit zwischen Kategorien zu berücksichtigen.

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}

Ergebnis

Training loss and dice coefficient Die folgende Abbildung zeigt das Protokoll der Verlustfunktion und des Würfelkoeffizienten während des Trainings. Das Diagramm links ist die Verlustfunktion, das Diagramm rechts ist der Würfelkoeffizient, die horizontale Achse ist die Anzahl der Epochen und die vertikale Achse ist der Wert der Verlustfunktion bzw. des Würfelkoeffizienten.

rtss320x480_logging.png

Validation mIOU Score Nachdem wir das semantische Segmentierungsmodell trainiert haben, haben wir die Leistung anhand der Verifizierungsdaten bewertet.

Für diese Leistungsbewertung haben wir den mittleren Schnittpunkt über der Union (mIOU) berechnet. Die Verwendung der Validierung als Validierungsdaten führte zu folgenden Ergebnissen:

mIOU 3.0

FPS and Demo Ich habe auch FPS gemessen, was ein Index für die Ausführungsgeschwindigkeit ist. Die Messung verwendete die Standardzeit des Python-Moduls und die verwendete Hardware war die GPU NVIDIA GeForce GTX 1060 6GB. Wenn Sie die Ergebnisse nicht einfärben möchten, ist dies FPS 4.0.

FPS 2.4

Unten sehen Sie ein Video, in dem Sie versuchen, eine semantische Segmentierung an einem trainierten Modell durchzuführen.

rtss.gif

Referenz

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

Computer Vision: Semantische Segmentierung Teil2 - Semantische Echtzeitsegmentierung
Computer Vision: Semantische Segmentierung Teil1 - ImageNet-Vorschulung von VoVNet
Computer Vision: Objekterkennung Teil 1 - Bounding Box-Vorverarbeitung
Versuchen Sie es mit semantischer Segmentierung (Pytorch)
Bär ... keine semantische Segmentierung
Extrahieren Sie nur den Katzenteil aus dem Katzenbild (Mattierung / Semantig-Segmentierung).