Lernen Sie Die Implementierungsdetails Von MobileNetV3 in TorchVision in Einem Artikel Kennen

TorchVision v0.9 fügt eine Reihe mobilfreundlicher Modelle hinzu.Es kann zur Bewältigung von Aufgaben wie Klassifizierung, Zielerkennung und semantischer Segmentierung verwendet werden.
In diesem Artikel wird der Code dieser Modelle im Detail untersucht, wichtige Implementierungsdetails werden vorgestellt, die Konfigurations- und Trainingsprinzipien dieser Modelle erläutert und die wichtigen Kompromisse interpretiert, die die Behörden während des Modelloptimierungsprozesses eingegangen sind.
Ziel dieses Artikels ist es, technische Details des Modells vorzustellen, die in den Originaldokumenten und -archiven nicht dokumentiert sind.
Netzwerkarchitektur
Die Implementierung der MobileNetV3-Architektur folgt strikt den Einstellungen im Originalpapier.Unterstützt die Benutzeranpassung und bietet verschiedene Konfigurationen zum Erstellen von Backbones für Klassifizierung, Zielerkennung und semantische Segmentierung.Sein struktureller Aufbau ähnelt dem von MobileNetV2 und beide nutzen dieselben Bausteine.
Sofort einsatzbereit.Es sind zwei offizielle Varianten verfügbar: Groß und Klein. Beide werden mit demselben Code erstellt, der einzige Unterschied besteht in der Konfiguration (Anzahl der Module, Größe, Aktivierungsfunktion usw.).
Konfigurationsparameter
Obwohl Benutzer die InvertedResidual-Einstellung anpassen und direkt an die MobileNetV3-Klasse übergeben können, gilt für die meisten Anwendungen:Entwickler können vorhandene Konfigurationen anpassen, indem sie Parameter an die Modellerstellungsmethode übergeben.Einige wichtige Konfigurationsparameter sind wie folgt:
* Breite_mult Der Parameter ist ein Multiplikator, der die Anzahl der Modellpipelines bestimmt. Der Standardwert ist 1. Durch Anpassen des Standardwerts können Sie die Anzahl der Faltungsfilter ändern, einschließlich der ersten und letzten Ebene. Achten Sie bei der Implementierung darauf, dass die Anzahl der Filter ein Vielfaches von 8 ist. Dies ist ein Trick zur Hardwareoptimierung, der den Vektorisierungsprozess von Operationen beschleunigt.
* reduzierter Schwanz Der Parameter wird hauptsächlich zur Optimierung der Laufgeschwindigkeit verwendet, wodurch die Anzahl der Pipelines im letzten Modul des Netzwerks halbiert wird. Diese Version wird häufig in Modellen zur Objekterkennung und semantischen Segmentierung verwendet. Laut dem MobileNetV3-bezogenen Dokument kann die Verwendung des Parameters „reduced_tail“ die Latenz von 15% reduzieren, ohne die Genauigkeit zu beeinträchtigen.
* erweitert Die Parameter wirken sich hauptsächlich auf die letzten drei InvertedResidual-Module des Modells aus. Die tiefenweise Faltung dieser Module kann in eine atröse Faltung umgewandelt werden, die zur Steuerung der Ausgabeschrittgröße des Moduls und zur Verbesserung der Genauigkeit des semantischen Segmentierungsmodells verwendet wird.
Implementierungsdetails
Die MobileNetV3-Klasse ist für den Aufbau eines Netzwerks aus der bereitgestellten Konfiguration verantwortlich. Die Implementierungsdetails lauten wie folgt:
* Das letzte Faltungsmodul erweitert die Ausgabe des letzten InvertedResidual-Moduls um das Sechsfache. Diese Implementierung kann an verschiedene Multiplikatorparameter angepasst werden.
* Ähnlich wie beim MobileNetV2-Modell gibt es vor der letzten linearen Schicht des Klassifikators eine Dropout-Schicht.
Die Klasse InvertedResidual ist der Hauptbaustein des Netzwerks. Die zu beachtenden Implementierungsdetails sind wie folgt:
* Wenn die Eingabepipeline und die Erweiterungspipeline identisch sind, ist der Erweiterungsschritt nicht erforderlich. Dies geschieht im ersten Faltungsmodul des Netzwerks.
* Auch wenn die erweiterte Pipeline mit dem Ausgabekanal identisch ist, ist der Projektionsschritt immer erforderlich.
* Die Aktivierung des Depthwise-Moduls hat Vorrang vor der Squeeze-and-Excite-Ebene, was die Genauigkeit bis zu einem gewissen Grad verbessern kann.

Einstufung
Die Benchmarks sowie Konfigurations-, Trainings- und Quantisierungsdetails der vortrainierten Modelle werden hier erläutert.
Benchmarks
Initialisieren Sie das vortrainierte Modell:
large = torchvision.models.mobilenet_v3_large(pretrained=True, width_mult=1.0, reduced_tail=False, dilated=False)
small = torchvision.models.mobilenet_v3_small(pretrained=True)
quantized = torchvision.models.quantization.mobilenet_v3_large(pretrained=True)

Wie in der Abbildung gezeigt, wenn der Benutzer bereit ist, ein wenig Genauigkeit zu opfern, um die Geschwindigkeit um das Sechsfache zu erhöhen,Dann kann MobileNetV3-Large ein Ersatz für ResNet50 sein.
Beachten Sie, dass die Inferenzzeit hier auf der CPU gemessen wird.
Trainingsprozess
Alle vortrainierten Modelle sind als nicht-dilatierte Modelle mit Breitenmultiplikator 1 und vollen Enden konfiguriert und passen auf ImageNet. Sowohl die große als auch die kleine Variante werden mit denselben Hyperparametern und Skripten trainiert.
Schnelles und stabiles Modelltraining
Die korrekte Konfiguration von RMSProp ist entscheidend, um den Trainingsprozess zu beschleunigen und numerische Stabilität sicherzustellen. Die Autoren verwendeten TensorFlow in ihren Experimenten und verwendeten eine viel höhere rmsprop_epsilon .
Normalerweise wird dieser Hyperparameter verwendet, um Nullnenner zu vermeiden, daher ist sein Wert klein, aber in diesem speziellen ModellDie Wahl des richtigen Wertes ist wichtig, um numerische Instabilitäten bei Verlusten zu vermeiden.
Ein weiteres wichtiges Detail ist, dass sich die RMSProp-Implementierungen von PyTorch und TensorFlow im Allgemeinen zwar ähnlich verhalten, es in diesem Zusammenhang jedoch wichtig ist, die Unterschiede in der Handhabung des Epsilon-Hyperparameters durch die beiden Frameworks zu beachten.
Insbesondere fügt PyTorch Epsilon außerhalb der Quadratwurzelberechnung hinzu, während TensorFlow Epsilon darin hinzufügt.Dies bedeutet, dass Benutzer beim Transplantieren der Hyperparameter dieses Artikels den Epsilon-Wert anpassen müssen, der wie folgt ausgedrückt werden kann: PyTorch_eps=sqrt(TF_eps) um eine sinnvolle Näherung zu berechnen.
Verbessern Sie die Modellgenauigkeit, indem Sie Hyperparameter anpassen und den Trainingsprozess verbessern
Nachdem Sie den Optimierer für ein schnelles und stabiles Training konfiguriert haben, können Sie mit der Optimierung der Genauigkeit des Modells beginnen. Es gibt einige Technologien, die Benutzern dabei helfen können, dieses Ziel zu erreichen.
Erstens, um eine Überanpassung zu vermeiden,Sie können AutoAugment und RandomErasing verwenden, um die Daten zu erweitern.Darüber hinaus ist es auch von großer Bedeutung, Kreuzvalidierung zu verwenden, um Parameter wie den Gewichtsabfall anzupassen und die Gewichte verschiedener Epochen-Checkpoints nach dem Training zu mitteln. Schließlich kann die Verwendung von Methoden wie Label Smoothing, Random Depth und LR-Rauscheinspritzung die Gesamtgenauigkeit um mindestens 1,5% verbessern.


Beachten Sie, dass die Modellleistung anhand des Validierungssatzes überprüft wird, sobald die festgelegte Genauigkeit erreicht ist.Dieser Prozess hilft, Überanpassung zu erkennen.
Quantifizierung
Stellte quantisierte Gewichte für das QNNPACK-Backend der MobileNetV3-Large-Variante bereit, wodurch es 2,5-mal schneller ausgeführt wird. Um das Modell zu quantifizieren,Hier kommt Quantization Aware Training (QAT) zum Einsatz.
Beachten Sie, dass QAT die Modellierung der Auswirkungen der Quantisierung und die Anpassung von Gewichten ermöglicht, um die Modellgenauigkeit zu verbessern.Im Vergleich zu den quantisierten Ergebnissen des einfach trainierten Modells verbessert sich die Genauigkeit um 1,8%:

Zielerkennung
In diesem Abschnitt wird zunächst eine Basislinie veröffentlichter Modelle bereitgestellt und anschließend erläutert, wie MobileNetV3-Large Backbone mit dem FasterRCNN-Detektor im Feature Pyramid Network zur Objekterkennung verwendet wird.
Außerdem wird erklärt, wie das Netzwerk trainiert und abgestimmt wird und wo Kompromisse eingegangen werden müssen.(In diesem Abschnitt werden keine Einzelheiten zur Verwendung mit SSDlite behandelt.)
Benchmarks
Initialisieren Sie das Modell:
high_res = torchvision.models.detection.fasterrcnn_mobilenet_v3_large_fpn(pretrained=True)
low_res = torchvision.models.detection.fasterrcnn_mobilenet_v3_large_320_fpn(pretrained=True)

Wie Sie sehen, wenn der Benutzer bereit ist, ein wenig Genauigkeit für eine 5-fach schnellere Trainingsgeschwindigkeit zu opfern,Schnelleres R-CNN mit hoher Auflösung und MobileNetV3-Large FPN-Backbone, das das entsprechende ResNet50-Modell ersetzen kann.
Implementierungsdetails
Der Detektor verwendet ein Backbone im FPN-Stil, das Merkmale aus verschiedenen Faltungen des MobileNetV3-Modells extrahiert.Standardmäßig verwendet das vortrainierte Modell die Ausgabe des 13. InvertedResidual-Moduls und die Ausgabe der Faltung vor der Pooling-Schicht. Die Implementierung unterstützt auch die Verwendung mehrerer Ausgabestufen.
Alle aus dem Netzwerk extrahierten Feature-Maps werden vom FPN-Modul in 256 Pipelines projiziert.Dadurch kann die Netzwerkgeschwindigkeit erheblich erhöht werden.Diese vom FPN-Backbone bereitgestellten Feature-Maps werden vom FasterRCNN-Detektor verwendet, um Box- und Klassenvorhersagen in verschiedenen Maßstäben bereitzustellen.
Trainings- und Tuningprozess
Derzeit stellt der Beamte zwei vortrainierte Modelle bereit, die eine Zielerkennung mit unterschiedlichen Auflösungen durchführen können. Beide Modelle wurden mit denselben Hyperparametern und Skripten auf dem COCO-Datensatz trainiert.
Der hochauflösende Detektor wird mit Bildern von 800–1333 Pixeln trainiert, während der mobilfreundliche Detektor mit niedriger Auflösung mit Bildern von 320–640 Pixeln trainiert wird.
Der Grund für die Bereitstellung von zwei separaten Sätzen vortrainierter Gewichte besteht darin, dass das direkte Trainieren des Detektors anhand kleinerer Bilder effizienter ist, als die kleinen Bilder an ein vortrainiertes Modell mit hoher Auflösung weiterzugeben.Dies führt zu einer Genauigkeitssteigerung von 5 mAP.
Beide Backbones werden mit den Gewichten auf ImageNet initialisiert und die letzten drei Stufen ihrer Gewichte werden während des Trainings feinabgestimmt.
Für mobilfreundliche Modelle können zusätzliche Geschwindigkeitsoptimierungen vorgenommen werden, indem der RPN-NMS-Schwellenwert angepasst wird.Durch Einbußen bei der Genauigkeit von 0,2 mAP kann die CPU-Geschwindigkeit des Modells um etwa 45% erhöht werden. Die Optimierungsdetails sind wie folgt:


Semantische Segmentierung
Dieser Abschnitt bietet zunächst einige veröffentlichte Benchmarks für vorab trainierte Modelle und erläutert dann, wie das MobileNetV3-Large-Backbone mit Segmentierungsköpfen wie LR-ASPP, DeepLabV3 und FCN zur semantischen Segmentierung kombiniert wird.
Außerdem wird der Netzwerktrainingsprozess erläutert und es werden einige alternative Optimierungstechniken für geschwindigkeitskritische Anwendungen vorgeschlagen.
Benchmarks
Initialisieren Sie das vortrainierte Modell:
lraspp = torchvision.models.segmentation.lraspp_mobilenet_v3_large(pretrained=True)
deeplabv3 = torchvision.models.segmentation.deeplabv3_mobilenet_v3_large(pretrained=True)

Wie in der Abbildung zu sehen ist, ist DeepLabV3 mit MobileNetV3-Large-Backbone in den meisten Anwendungen eine praktikable Alternative zu FCN und ResNet50.Bei gleichbleibender Genauigkeit wird die Laufgeschwindigkeit um das 8,5-fache erhöht.Darüber hinaus übertrifft die Leistung des LR-ASPP-Netzwerks in allen Indikatoren die des FCN unter denselben Bedingungen.
Implementierungsdetails
In diesem Abschnitt werden wichtige Implementierungsdetails des getesteten Segmentierungskopfes erläutert. Beachten Sie, dass alle in diesem Abschnitt beschriebenen Modelle das erweiterte MobileNetV3-Large-Backbone verwenden.
LR-ASPP
LR-ASPP ist eine optimierte Version des von den Autoren des MobileNetV3-Papiers vorgeschlagenen Reduced Atrous Spatial Pyramid Pooling-Modells. Im Gegensatz zu anderen Segmentierungsmodellen in TorchVision,Es verwendet keinen zusätzlichen Verlust, sondern Low-Level- und High-Level-Funktionen mit Ausgabeschritten von 8 bzw. 16.
Anders als die im Dokument verwendete 49×49-AveragePooling-Schicht und variable Schrittweite wird hier die AdaptiveAvgPool2d-Schicht zur Verarbeitung globaler Features verwendet.
Dies kann Benutzern eine allgemeine Implementierungsmethode bieten, die auf mehreren Datensätzen ausgeführt werden kann.Abschließend wird vor der Rückgabe der Ausgabe immer eine bilineare Interpolation durchgeführt, um sicherzustellen, dass die Abmessungen der Eingabe- und Ausgabebilder genau übereinstimmen.
DeepLabV3 und FCN
Die Kombination von MobileNetV3 mit DeepLabV3 und FCN ist der Kombination anderer Modelle sehr ähnlich, und die Stufenbewertung dieser Methoden ist dieselbe wie bei LR-ASPP.
Es ist zu beachten, dass hier keine High-Level- oder Low-Level-Funktionen verwendet werden.Stattdessen wird den Feature-Maps ein normaler Verlust mit einer Ausgabeschrittweite von 16 und ein zusätzlicher Verlust mit einer Ausgabeschrittweite von 8 angehängt.
FCN ist LR-ASPP in Bezug auf Geschwindigkeit und Genauigkeit unterlegen und wird daher hier nicht berücksichtigt. Vortrainierte Gewichte sind mit nur geringfügigen Codeänderungen weiterhin verfügbar.
Trainings- und Tuningprozess
Hier sind zwei vortrainierte MobileNetV3-Modelle, die für die semantische Segmentierung verwendet werden können:LR-ASPP und DeepLabV3.Die Backbones dieser Modelle wurden mit ImageNet-Gewichten initialisiert und durchgängig trainiert.
Beide Architekturen wurden mit demselben Skript und ähnlichen Hyperparametern auf dem COCO-Datensatz trainiert.
Normalerweise wird die Größe von Bildern während der Inferenz auf 520 Pixel geändert. Eine optionale Geschwindigkeitsoptimierung besteht darin, eine Modellkonfiguration mit niedriger Auflösung unter Verwendung von vortrainierten Gewichten mit hoher Auflösung zu erstellen und die Inferenzgröße auf 320 Pixel zu reduzieren.Dadurch erhöht sich die CPU-Ausführungszeit um etwa 60%, wobei jedoch einige mIoU-Punkte verloren gehen.


Oben sind die Implementierungsdetails von MobileNetV3 aufgeführt, die in dieser Ausgabe zusammengefasst sind. Ich hoffe, dass diese Ihnen ein tieferes Verständnis und Wissen über dieses Modell vermitteln können.