KI erlebbar machen
Erlebbar sollte sie aber nicht nur für uns selbst werden, sondern auch für BesucherInnen des CodeCamp:N. Der große blaue Billard-Tisch, der BesucherInnen des CodeCamp sofort ins Auge fällt, hat sich daher für dieses Projekt angeboten. Wir, das sind Samuel, Tobias und ich (Fabian) entschieden uns also für eine KI-Anwendung, die man beim Billard nutzen kann.
Wobei könnte uns KI beim Billard spielen unterstützen?
Du hast sicherlich schon mal ein Billard-Game auf dem Smartphone oder am PC gespielt. Hier bestimmst du, aus welcher Richtung und mit wie viel Stärke, die weiße Kugel angespielt werden soll. Dabei wirst du durch kleine Hilfslinien unterstützt, die dir die ausgerechnete Richtung der angespielten Kugel anzeigen.
Wir fragten uns, ob wir dieses Prinzip mit den Hilfslinien auf ein echtes Billardspiel übertragen könnten.
Minimum viable Product (MVP) definieren
Was einfach klingt, ist im Detail doch sehr komplex. Um das Anspielen der weißen Kugel berechnen zu können, mussten wir zunächst herausfinden, an welcher Position Kugeln auf dem Tisch liegen und welche Farbe sie jeweils haben könnten.
Für unser MVP benötigen wir also folgende Features:
• Ein Livestream des Billardtisches
• Den Einsatz von Computervision, um die Billardkugeln zu erkennen
• Ein neuronales Netz, das die Billardkugeln nach Farbe einordnet
• Eine Weboberfläche, die einen Livestream mit markierten Billardkugeln zeigt und anzeigt, welche Kugeln noch im Spiel sind
Dafür haben wir mit den folgenden Technologien gearbeitet:
• Für die Kommunikation mit der GoPro Kamera: Python SDK
• Für die Bildanalyse und Verarbeitung: OpenCV
• Für die Kugelbestimmung nach Farbe: Tensorflow
• Für die Kommunikation zwischen Backend und Frontend: Websocket
• Für das Frontend (Weboberfläche): Flutter
Die GoPro Kamera sprachen wir also mittels des Open GoPro Python SDK (Library für die Kommunikation mit der Schnittstelle der GoPro) an. Die Livebilder (Frames) analysierten und verarbeiteten wir dann mit OpenCV (Library mit Computer-Vision-Algorithmen) und Tensorflow (Framework für maschinelles Lernen). Die bearbeiteten Frames, sowie Zusatzinformationen wurden über einen Websocket-Stream an das Flutter-Frontend übertragen. Über diesen Stream konnten auch Daten zurück an das Backend geschickt werden.
Anlernen der Künstlichen Intelligenz
Unsere KI für das MVP muss folgendes Wissen:
1. Wo im Bild ist der Tisch und wo verlaufen seine Kanten?
2. Wo auf der Tischplatte liegen Kugeln?
3. Welche Kugeln sind das?
1. Tischerkennung
Die Tischerkennung war relativ einfach: Die größte blaue Fläche in dem Bild ist mit Sicherheit der Tisch. Mittels Segmentierung konnten wir das Bild auf diesen wesentlichen Teil für die weitere Analyse beschränken. Anhand der Abmessungen von dem Tisch konnten wir dann mit etwas Mathematik die Kanten um die erkannte blaue Fläche setzen.
2. Kugelerkennung
Gewagte These: Kugeln sind rund.
Daher gingen wir davon aus, dass es sich bei allen Kreisen (in einer bestimmten Größe), die sich auf unserer Tischplatte befanden, um eine unserer Kugeln handelt. Dafür verwendeten wir eine Methode von OpenCV, nämlich Circle Hough Transform. Damit lassen sich Kreise in einem Bild erkennen. So konnten wir die Position aller Kreise – also Kugeln in einem bestimmten Bereich herausfinden.
Welche Kugeln sind das?
Wir wussten jetzt also, wie viele Kugeln auf dem Tisch lagen und an welcher Position sie sich befanden. Für weitere Informationen mussten wir jetzt noch herausfinden, welche Kugeln tatsächlich an welcher Position lagen. Diese Arbeit sollte ein neuronales Netz für uns übernehmen.
Dazu mussten wir unsere KI erst einmal mit Daten füttern. Wir benötigten also sehr viele Beispielbilder, die wir für jede Kugel auszeichnen, also mit Labels versehen mussten.
Für jede Kugel nahmen wir ein Video auf, auf dem wir die Kugel auf unserem Tisch hin und her rollen ließen. Da wir bereits eine Methode hatten, um Kugeln auf dem Tisch zu erfassen, generierten wir dann, aus einem Video mit einer Kugel Referenzbilder, inklusive zugehörigen Labels. Bei einem Video von 120 Sekunden und 30 FPS (Bilder pro Sekunde), kommen so pro Billardkugel 3600 Einzelbilder zusammen. Dies haben wir dann für alle 17 Kugeln gemacht.
Mit dieser Menge an Referenzdaten konnte unsere KI nun auch neue Bilder in Echtzeit analysieren und die Kugeln einsortieren. Hier gilt allerdings: Rechenleistung is the limit!
Dürfen wir vorstellen: AI.Cue
Geschafft! Das MVP unseres intelligenten Billardassistenten steht. Wir tauften es auf den Namen AI.Cue.
Nochmal zusammengefasst, folgendes haben wir bisher umgesetzt:
• Livestreamübertragung durch die GoPro Kamera an unser Backend
• Analyse jedes Frames mithilfe des Backends von OpenCV. Erkennung der Tischplatte und aller darauf befindlichen Kugeln
• Einsortierung der Kugeln nach Farbe, bzw. Nummer, mittels neuronalen Netzes
• Anzeige im Frontend des Livestreams mit markierten Kanten und Kugeln, sowie eine Darstellung aller Kugeln mit ihrem jeweiligen Status (Aktiv/ Eingelocht)
Ausblick
Nachdem wir jetzt die Grundlage geschaffen haben, um mit Ai.Cue die nächsten Entwicklungsschritte zu gehen, arbeiten wir an einem Feature, das es ermöglicht auf dem Livebild einen virtuellen Cue einzuzeichnen. So ließe sich vom Backend die prognostizierte Laufbahn der angespielten Kugeln erhalten.
Dazu dann aber mehr in Part 2.