Skip to main content
Mobile Apps

Machine Learning in native iOS App

By 26. März 2020Dezember 1st, 2023No Comments

Machine Learning in mobilen Apps

Machine Learning (ML / maschinelles lernen) wird in der digitalen Welt immer wichtiger. Wir wollten uns mit den State-of-the-art Technologien für automatische Bildanalysen beschäftigen. Diese haben wir in einem kleinen Projekt analysiert und umgesetzt.

Was war unser Ziel?

Wir wollten herausfinden wie gut maschinelles lernen auf den mobilen Geräten mit nativen Möglichkeiten bereits funktioniert. Selbst moderne Handys haben auf dem Papier noch deutlich weniger Rechenpower als die meisten Backendsysteme/Clouds. Unser Anspruch war, dass das ML ausschliesslich auf den mobilen Geräten ausgeführt wird, also sogar Offline funktioniert.

Das Ziel des Versuchs war die Startnummererkennung von Läufern auf Bilddaten, später haben wir diesen Ansatz erweitert, so dass auch die Analyse in einem Video-Feed (in Echtzeit!) möglich wäre.

Die erwartete Funktionalität unseres Versuches sah wie folgt aus:


Legende:
Obere Hälfte = Erwartung
Bild: Untere Hälfte = Originalbild

Wie kommen wir zu diesem Ziel?

Wir haben verschiedene technische Lösungsansätze verglichen und uns für die folgenden drei Variationen entschieden:

  • Was bietet Apple aktuell – Apple Vision Framework
  • Klassische ML Bildklassifizierung
  • Bildanalyse in Echtzeit

Variante 1: Apple Vision Framework

Seit iOS 12 gibt es bereits Komponenten im iOS Ökosystem die theoretisch eine Nummererkennung in Bildern ermöglichen. Hier gibt es zwei verschiedene Implementationen. Die Funktionalität ist mit und ohne ML verfügbar. Mit ML sind die Ergebnisse sehr gut (75% der Startnummern korrekt erkannt). Jedoch dauert die Auswertung pro Bild zwischen 3 und 5 Sekunden. Für die Echtzeitanalyse bietet das Framework die Möglichkeit das ML auszuschalten. Ohne ML dauert die Auswertung wenige Millisekunden, jedoch werden kaum Startnummern erkannt. Ohne ML hatte das Framework z.B. Probleme mit der Rotation und Krümmung der Startnummern in den Bildern.

Variante 2: Klassische ML Bildklassifizierung

In dieser Variante haben wir uns für einen klassischen Ansatz zur Bildklassifizierung entschieden (Convolutional Neural Networks oder CNN). Diese Variante besteht aus zwei Teilen:

  • 1. Teil: Lokalisierung der Zahlen (In welchen Bereichen eines Bildes könnte eine Zahl sein?)
  • 2. Teil: Erkennung der Zahlen (Enthält ein Bereich eine Zahl – falls ja, welche?)

Für die Zahlen Lokalisierung wird der MSER Algorithmus verwendet. Damit werden Pixelbereiche im Bild gefunden in denen sich eine Zahl befinden könnte. Diese Pixelbereiche werden anschliessend in das ML-Modell ‚gefüttert‘ um mögliche Zahlen zu erkennen. Das ML-Modell entscheidet anschliessend ob es in diesem Bereich eine Zahl erkannt hat.

Klassifizierung

Die vom Algorithmus erkannten Regionen mit Startnummern werden markiert. Für jede dieser Regionen gibt das ML-Modell eine Wahrscheinlichkeit pro Klasse an (in unserem Fall sind das alle möglichen Zahlen: 0 bis 9). Je nach Wahrscheinlichkeit einer bestimmten Ziffer können wir dies als wahrscheinlichstes Ergebnis anschauen.

Variante 3: Real-Time Bildanalyse

Die Erkennung in Echtzeit wird in der digitalen Welt immer wichtiger, so setzen z.B. selbstfahrende Autos auf solche Lösungen.

Wir haben uns für diesen Versuch für ein Yolo v3 (YOLO = You Only Look Once) ML Modell entschieden. Ml-Modelle dieses Typs erreichen je nach Konfiguration und Bildgrösse bis zu 245 FPS (Frames Per Seconds, also Bilder pro Sekunde).

Die Limitierung dieses Modelles ist jedoch, dass es mit kleinen Objekten im Bild nicht gut umgehen kann (Beispiel: Wenn ein Läufer noch zu weit weg von der Kamera ist). Deshalb haben wir uns nach einer kurzen Versuchsphase für einen 2-Stufigen Ansatz entschieden. Wir haben dafür zwei neue Modelle trainiert:

  • Modell 1: Zuständig für die Erkennung der Startnummern (wo sind im Bild die Startnummern Umrisse)
  • Modell 2: Welche Zahlen sind in diesem Bereich

Das erste Modell benötigte komplett neue Trainings- und Testdaten. Diese sind nötig, um dem System beizubringen, wie die Bilder aussehen könnten und welche Ziffern in diesen zu sehen sind. Für dieses Experiment haben wir nur eine kleine Anzahl solcher Daten erstellt. Trotz dieser Limitierung haben wir diesen Versuch erfolgreich abschliessen können. Mit einer nativen iOS-App haben wir Startnummern in Echtzeit erkennen und auswerten können.

Die Performance und Qualität der erkannten Startnummern waren erstaunlich gut. Anbei ein Screenshot der während der Entwicklung erstellt wurde. Auf diesem Screenshot wurde die Detektion der Startnummerposition getestet aus einem Live-Video Feed. In dieser Demo haben wir ohne grossen Fokus auf Performanceoptimierungen eine Bilverarbeitungsrate von rund 30 FPS erreicht.

Diese erkannten Regionen haben wir exportiert und in das zweite Modell geladen. In diesem haben wir Analog in der ersten Version nur noch die Zahlen gesucht. Die Erkennung der Zahlen hat in diesen kleineren Regionen sehr gut funktioniert. Auf diese Weise konnten wir das bereits trainierte Modell und Trainingsdaten für die Erkennung der Zahlen wiederverwenden.

Was haben wir gelernt?

Obwohl wir nicht überall optimale Trainingsdaten verwendet haben, sind die Ergebnisse bereits ansprechend. Wir sehen folgende Massnahmen zur Verbesserung der Resultate:

  • Die Trainingsbilder wurden alle von Hand annotiert. Dies ist zeitaufwändig und wurde für den Versuch nur im kleinen Rahmen gemacht. Hier könnte man mehr Bilder für das Training vorbereiten und bei der Annotation von Hand genauer arbeiten. Zusätzlich darauf achten, dass die Daten von verschiedenen Rennen, Nationalitäten und Tageszeiten sind und auch verschiedene Perspektiven enthalten.
  • Analyse von kleineren Modellen für noch mehr Performance (wir haben Yolo v3 verwendet, es gibt bereits Faktor 10 schnellere Modelle).
  • In der Echtzeit-Bildanalyse ist die Latenz der Bildverarbeitung entscheidend. Erkannte Zahlen können nicht erst nach ein paar Sekunden auf dem Screen dargestellt werden. Einer der wichtigsten Faktoren ist diese Latenz so niedrig wie möglich zu halten.

Bericht geschrieben von Florin Hardegger, approppo GmbH