Deep Learning - nicht nur Siegel auf Mobiltelefonen oder wie wir Lokomotivenwagen diagnostizieren


Noch vor wenigen Tagen übergab Aurorai den Testbetrieb an ein Fehlererkennungs- und Wagenüberwachungssystem für Ermak-Lokomotiven. Die Aufgabe ist nicht trivial und sehr interessant. Der erste Schritt bestand darin, den Zustand der Bremsbeläge und die Breite der Strebe zu beurteilen. Wir haben es geschafft, das Problem mit einer Genauigkeit von 1 mm bei einer Lokgeschwindigkeit von bis zu 30 km / h zu lösen! Ich möchte darauf hinweisen, dass es aufgrund der Besonderheiten möglich war, „TTA (Test-Time Augmentation)“ zu verwenden - ein anschauliches Beispiel für einen Wettbewerbs-Hack im Kaggle-Stil, der nicht gut zur Prod- und Semantic-Segmentierung auf der Basis des se_resnext50- Encoders passt , der ein erstaunlich genaues Ergebnis bei der Maskenvorhersage liefert .

Aufgabenbeschreibung

Es ist erforderlich, einen Hardware-Software-Komplex zur Erkennung von Defekten der Bremsbeläge und zur Datenausgabe an den Schichtmeister zu erstellen.

Voraussetzungen für die Aufgabe

Wie sich herausstellte, ändert sich eine große Anzahl von Belägen, etwa 80%, in der PTL (Technische Inspektionspunkte der Lokomotive), und dies geschieht alle 72 Stunden für jede Lokomotive. Der Großteil der Kontrollen in der Zapfwelle ist eine Sichtprüfung des äußeren Teils des Lokwagens durch den Kapitän.



Plan zur Lösung des Problems:

  1. Geräteauswahl
  2. Datenerfassung
  3. Modelltraining
  4. Serverentwicklung mit REST-API
  5. Android Tablet Client-Entwicklung
  6. Design und Montage eines Racks zur Platzierung von Kameras und Licht
  7. Probebetrieb

Geräteauswahl

Eine der vielleicht schwierigsten, wenn nicht sogar schwierigsten Aufgaben war die Auswahl von Kameras, Objektiven und Licht in einem begrenzten Budget und einer begrenzten Zeit: MVP musste in anderthalb Monaten durchgeführt werden. In ein paar Tagen hat mich Google zu einem Experten für Hardware für die Bildverarbeitung gemacht. Die Wahl wurde bei Basler- Kameras und einer gepulsten Hintergrundbeleuchtung mit 6k Lumen getroffen, die mit der Kamera synchronisiert war. Für Basler (70 Bilder / Sek., Auflösung bis 1920x1024) sprach die Python-API, die die Integration aller Systemkomponenten erheblich erleichterte. Der einzige Nachteil ist der Preis für Kameras ~ 100 tr.

Die Wahl eines Objektivs für Kameras wurde durch ein mangelndes Verständnis der erforderlichen Brennweite und des Betrachtungswinkels erschwert. Ich musste Risiken eingehen, nahm jedoch einen Objektivrechner und eine Prise Glück heraus.

Hintergrundbeleuchtung: Die erforderliche Zeit zum Leuchten der LEDs, ihr Typ und die Linsenparameter wurden experimentell festgelegt. Ich habe 3 verschiedene Linsenmodifikationen für LEDs mit einem Winkel von 30, 45, 60 ausprobiert und mich schließlich für matte Linsen mit einem Winkel von 45 entschieden.





Zusammenbau und Test des Pulssteuersignals für die Kamera



Für die Serverhardware habe ich Intel Core i7-7740X Kaby Lake, 46 GB RAM, 1 TB SSD und 3x1080Ti verwendet - dies reicht aus, um zwei dreiteilige Lokomotiven in nicht mehr als 2 Minuten vorherzusagen.

Die kollektive Farmkühlung eines Sandwichs von Grafikkarten bläst 10 Grad.



Datenerfassung

Das Erstellen eines Datensatzes ist ein separates Lied, niemand kann mit diesem Ereignis betraut werden, und deshalb wurde ich in eine entfernte, wenig bekannte Stadt in den Tiefen unserer riesigen Heimat geschickt. Ich habe ungefähr 400 Pads auf meinem Handy fotografiert (!!!) . Mit Blick auf die Zukunft werde ich sagen, dass die tapferen Depotmitarbeiter, anscheinend erschrocken vom Auditor aus Moskau, alle Beläge der Lokomotiven gegen völlig neue ausgetauscht und sie mit einem frischen Anstrich bemalt haben. Es war lustig und beängstigend, sie anzusehen. Ich freute mich auf das Schlimmste, obwohl es immer noch ungefähr 400 Fotos von völlig unterschiedlichen Blöcken gab, die ich im Moskauer Depot gemacht hatte.

Es blieb nur, an ein Wunder zu glauben, sich auf Augmentationen zu stapeln und Heuristiken zu entwickeln, um fehlerhafte Segmente zu entfernen, von denen es viele gab, da ich nicht an Anti-Beispiele dachte.

Warten:



Realität:





Hier muss gesagt werden, dass es kein einziges Beispiel für stark abgenutzte Blöcke gab.

Modelltraining

Das Modell mit dem Codierer se_resnext50 und der Decodierer mit dem scse- Block aus diesem Repository zeigten sich am besten, aber scse (Implementierung für pytorch) musste aus Gründen der Beschleunigung des Vorhersageprozesses entfernt werden, weil musste in einer Minute vorhergesagt werden. Für das Modelltraining wurde das Pytorch 1.0.1- Framework verwendet , mit einer großen Anzahl von Erweiterungen aus Albumentationen und der selbstgeschriebenen Horizontal Flip-Erweiterung, um die Klasse beim Anzeigen zu ändern.

def train_transform(p=1): return Compose([ OneOf([ CLAHE(clip_limit=2), IAASharpen(), IAAEmboss(), RandomBrightnessContrast(brightness_limit=0.8, contrast_limit=0.8), HueSaturationValue(hue_shift_limit=50, sat_shift_limit=50, val_shift_limit=50), RGBShift(r_shift_limit=50, g_shift_limit=50, b_shift_limit=50), JpegCompression(quality_lower=30), RandomGamma(), GaussNoise() ], p=0.3), OneOf([ Blur(), MotionBlur(), MedianBlur(), ], p=0.3), ShiftScaleRotate(shift_limit=0.2, scale_limit=0.4, rotate_limit=5, p=0.5), Normalize(p=1) ], p=p) 

Als Verlustfunktion habe ich den Lovász-Softmax-Verlust gewählt . Er hat sich fast genauso verhalten wie bce + jaccard, aber besser als BCE , was zu sehr auf das Markup passt. Die Wahl eines Algorithmus zur Bestimmung der Seriennummer eines Paares von Rädern und Blöcken war ebenfalls eine Herausforderung. Es gab Optionen für das metrische Lernen , aber ich musste das Ergebnis schnell anzeigen, und es kam die Idee, die Blöcke in den Klassen 1 und 2 zu markieren, wobei 1 die Ausrichtung nach rechts und 2 ist nach links. Das Netzwerk begann nicht nur die Maske, sondern auch die Ausrichtung vorherzusagen. Mit einfachen Heuristiken war es möglich, die Seriennummern von Blöcken und Radsätzen zuverlässig zu bestimmen und dann die Vorhersagen zu mitteln. Tatsächlich ergab die Verwendung von TTA mit einer leichten Verschiebung des Objekts während der Bewegung und unterschiedlichen Beleuchtungswinkeln selbst bei einer Auflösung von 320 x 320 ein gutes Ergebnis bei der Maskengenauigkeit.

Separat bestand die Aufgabe darin, den keilförmigen Defekt der Blöcke zu bestimmen. Es gab viele Ideen aus der Huff-Transformation , um die Ecken / Ränder des Blocks mit Punkten / Linien verschiedener Klassen zu markieren. Am Ende hat sich die Option durchgesetzt, wie die Arbeiter es tun: Sie müssen 5 cm von der schmalen Kante zurücktreten und die Breite messen, wenn sie im normalen Bereich liegt, und dann den Block überspringen.

Die Trainingspipeline wurde von hier aus von der MICCAI 2017 Robotic Instrument Segmentation übernommen . Der Trainingsprozess besteht aus drei Phasen: Training mit einem eingefrorenen Encoder, Training des gesamten Netzwerks und Training mit CosineAnnealingLR . Die ersten beiden Stufen verwenden ReduceLROnPlateau .

Programmieren eines REST-Servers und -Clients unter Android

Für den REST-Server habe ich mich für flask entschieden. Es ist einfacher, innerhalb von 2 Minuten keinen Start zu erzielen. Ich beschloss, eine Datenbank für die Speicherung mit meinen eigenen Händen in Form einer einfachen Ordnerstruktur und einer aktuellen Statusdatei zu erstellen. Die Anwendung für das Tablet auf Android Studio, der Vorteil der neuesten Versionen, ist nur ein Paradies für den Entwickler.

Design und Montage eines Racks zur Platzierung von Kameras und Licht

Ich erinnerte mich an die alten Zeiten, als ich Ladestationen für Elektroautos herstellte, und diese Erfahrung war sehr praktisch - wir entschieden uns, sie aus strukturellen Aluminiumgestellen herzustellen, die auf einem 3D-Drucker gedruckt wurden.





Zum Test kommen!


Das Ergebnis hat alle Erwartungen übertroffen. Für Computer-Vision-Spezialisten mag die Aufgabe recht einfach und unkompliziert erscheinen. Ich hatte jedoch aus zwei Gründen einige Skepsis: Erstens war das Trainingsset klein und enthielt keine Grenzfälle wie sehr dünne Blöcke; Zweitens fanden die Tests unter sehr unterschiedlichen Aufnahme- und Lichtbedingungen statt.





Jaccard erreicht bei der Validierung 0,96, visuell sind die Pads sehr klar segmentiert, addieren eine Mittelung über mehrere Fotos und erhalten eine sehr gute Genauigkeit bei der Schätzung der Breite der Pads. Während der Tests stellte sich heraus, dass Sie mit den Karren anderer Lokomotiven arbeiten können, aber schnellere Kameras verwenden können:





Abschließend möchte ich sagen, dass sich die Technologie sehr gut bewährt hat und meiner Meinung nach ein großes Potenzial hat, den menschlichen Faktor zu eliminieren, die Ausfallzeiten einer Lokomotive zu reduzieren und Prognosen zu erstellen.

Danksagung

Dank der ods.ai- Community wäre ich ohne Ihre Hilfe nicht in der Lage, all dies in so kurzer Zeit zu tun! Vielen Dank an n01z3 , DL, der wollte, dass ich DL aufnehme, für seinen unschätzbaren Rat und seine außergewöhnliche Professionalität! Vielen Dank an den ideologischen Mastermind Vasily Manko (CEO, Aurorai Company), die beste Designerin Tatyana Brusova.

Wir sehen uns in der nächsten Folge der Geschichte!

Aurorai, llc

Source: https://habr.com/ru/post/de443016/


All Articles