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.
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.
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.
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.
Das implementierte Modell kann grob in drei Verarbeitungsstufen unterteilt werden.
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.
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.
・ CPU Intel (R) Core (TM) i7-5820K 3,30 GHz ・ GPU NVIDIA Quadro RTX 6000 24 GB
・ 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
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
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.
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.
Die folgende Abbildung vergleicht ein vertikales Gaußsches Differentialfilter zwischen regulärer Faltung und erweiterter Faltung.
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.
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 $.
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}
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.
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.
Computer Vision : Semantic Segmentation Part1 - ImageNet pretraining VoVNet
Recommended Posts