diff --git a/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Projektbeschreibung.odp b/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Projektbeschreibung.odp index eefcfcf..b7ac3b1 100755 Binary files a/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Projektbeschreibung.odp and b/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Projektbeschreibung.odp differ diff --git a/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Projektbeschreibung.pdf b/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Projektbeschreibung.pdf index eedf57c..8a209ff 100755 Binary files a/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Projektbeschreibung.pdf and b/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Projektbeschreibung.pdf differ diff --git a/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Workshopfolien.odp b/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Workshopfolien.odp index e3cf72c..9bcb37b 100755 Binary files a/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Workshopfolien.odp and b/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Workshopfolien.odp differ diff --git a/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Workshopfolien.pdf b/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Workshopfolien.pdf index a79b220..20205d9 100755 Binary files a/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Workshopfolien.pdf and b/Calliope-Rennspiel/Dokumentation/Calliope-Rennspiel - Kuenstliche Intelligenz leicht erklaert - Workshopfolien.pdf differ diff --git a/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Einzelspielmodus-Orange.md b/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Einzelspielmodus-Orange.md index 64fb7c0..ff24e5b 100644 --- a/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Einzelspielmodus-Orange.md +++ b/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Einzelspielmodus-Orange.md @@ -33,15 +33,15 @@ Pro Schüler wird 1 "Rennspiel-Calliope" benötigt, der direkt per USB an den Re Diesen Schritt muss jeder Schüler durchführen. -Hierzu muss ein Calliope Mini per USB an den Schülerrechner anschließen +Hierzu muss ein Calliope mini per USB an den Schülerrechner anschließen *MakeCode-Variante* -* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/Makecode/rennspiel-funkgruppe1-makecode.hex` auf den per USB angeschlossenen Calliope Mini kopieren. (Die Funkgruppe ist im Einzelspielmodus egal) +* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/Makecode/rennspiel-funkgruppe1-makecode.hex` auf den per USB angeschlossenen Calliope mini kopieren. (Die Funkgruppe ist im Einzelspielmodus egal) *OpenRoberta-Variante* -* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/OpenRoberta/rennspiel-openroberta.hex` auf den per USB angeschlossenen Calliope Mini kopieren. (Die Funkgruppe __muss__ beim Start auf __0__ gewählt bleiben, damit das USB-Logging aktiv ist) +* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/OpenRoberta/rennspiel-openroberta.hex` auf den per USB angeschlossenen Calliope mini kopieren. (Die Funkgruppe __muss__ beim Start auf __0__ gewählt bleiben, damit das USB-Logging aktiv ist) #### Schritt 2 - COM-Port des per USB angeschlossenen "Rennspiel-Calliopes" herausfinden @@ -49,7 +49,7 @@ Hierzu muss ein Calliope Mini per USB an den Schülerrechner anschließen * Linux: `ls -al /dev/ttyACM*` - ggf. Nutzer zur `dialout` Nutzergruppe hinzufügen, damit dieser auf den Calliope Mini auch zugreifen darf. + ggf. Nutzer zur `dialout` Nutzergruppe hinzufügen, damit dieser auf den Calliope mini auch zugreifen darf. `sudo usermod -aG dialout` @@ -107,9 +107,9 @@ Hierzu muss ein Calliope Mini per USB an den Schülerrechner anschließen * 50 Episoden werden durch die KI gespielt * Medianwert der erreichten Punktzahl wird angezeigt. -*Variante B: IQ-Test auf Calliope Mini* +*Variante B: IQ-Test auf Calliope mini* -Das trainierte neuronale Netzwerk kann auch direkt auf dem Calliope Mini getestet werden. Dies erfordert jedoch die Durchführung der optionalen letzten Teilschritte im Schritt 4, die Nutzung des Python-Skript-Knotens. Ein Nutzung der weiteren KI-Algorithmen, die mit Orange möglich sind (beispielsweise kNN, AdaBoost etc.) ist auf dem Calliope Mini nicht umgesetzt. +Das trainierte neuronale Netzwerk kann auch direkt auf dem Calliope mini getestet werden. Dies erfordert jedoch die Durchführung der optionalen letzten Teilschritte im Schritt 4, die Nutzung des Python-Skript-Knotens. Ein Nutzung der weiteren KI-Algorithmen, die mit Orange möglich sind (beispielsweise kNN, AdaBoost etc.) ist auf dem Calliope mini nicht umgesetzt. Projektziel ist es, die "Hirntransplantation" des trainierten KI-Modells für die SuS über die Oberfläche auf https://makecode.calliope.cc nachvollziehbar zu machen; Stand März 2021 verhinderte jedoch ein Bug in Makecode diese Variante. @@ -117,5 +117,5 @@ Daher wurde im Projekt ein temporärer Behelfsmechanismus implementiert: * Auf dem Schülergruppenrechner ins Verzeichnis wechseln: `ki-in-schulen-master/Calliope-Rennspiel/Python/iq-test-calliope/` * Auf dem Schülergruppenrechner ausführen: `python iq-test-erstellen.py -r ` (Die JSON-Modelldatei ist eine in Schritt 4 erzeugte Modelldatei, bspw. `sklearn-ows-modell-20210302221649.json`) -* Die erzeugte Calliope Hex-Datei `iq-test-calliope.hex` kann auf einen Calliope Mini kopiert werden +* Die erzeugte Calliope Hex-Datei `iq-test-calliope.hex` kann auf einen Calliope mini kopiert werden * Die trainierte KI übernimmt die Steuerung im Rennspiel (manuelle Steuerung ist zusätzlich möglich) diff --git a/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Einzelspielmodus.md b/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Einzelspielmodus.md index e374f20..3c16d4d 100644 --- a/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Einzelspielmodus.md +++ b/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Einzelspielmodus.md @@ -33,15 +33,15 @@ Die unten beschriebenen Schritte sind dann entsprechend über die Menüpunkte de Diesen Schritt muss jeder Schüler durchführen. -Hierzu muss ein Calliope Mini per USB an den Schülerrechner angeschlossen werden. +Hierzu muss ein Calliope mini per USB an den Schülerrechner angeschlossen werden. *MakeCode-Variante* -* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/Makecode/rennspiel-funkgruppe1-makecode.hex` auf den per USB angeschlossenen Calliope Mini kopieren. (Die Funkgruppe ist im Einzelspielmodus egal, da die Datensammlung über USB funktioniert) +* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/Makecode/rennspiel-funkgruppe1-makecode.hex` auf den per USB angeschlossenen Calliope mini kopieren. (Die Funkgruppe ist im Einzelspielmodus egal, da die Datensammlung über USB funktioniert) *OpenRoberta-Variante* -* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/OpenRoberta/rennspiel-openroberta.hex` auf den per USB angeschlossenen Calliope Mini kopieren. (Die Funkgruppe __muss__ beim Start auf __0__ gewählt bleiben, damit das USB-Logging aktiv ist) +* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/OpenRoberta/rennspiel-openroberta.hex` auf den per USB angeschlossenen Calliope mini kopieren. (Die Funkgruppe __muss__ beim Start auf __0__ gewählt bleiben, damit das USB-Logging aktiv ist) #### Schritt 2 - COM-Port des per USB angeschlossenen "Rennspiel-Calliopes" herausfinden @@ -49,7 +49,7 @@ Hierzu muss ein Calliope Mini per USB an den Schülerrechner angeschlossen werde * Linux: `ls -al /dev/ttyACM*` - ggf. Nutzer zur `dialout` Nutzergruppe hinzufügen, damit dieser auf den Calliope Mini auch zugreifen darf. + ggf. Nutzer zur `dialout` Nutzergruppe hinzufügen, damit dieser auf den Calliope mini auch zugreifen darf. `sudo usermod -aG dialout` @@ -87,9 +87,9 @@ Hierzu muss ein Calliope Mini per USB an den Schülerrechner angeschlossen werde * 50 Episoden werden durch die KI gespielt * Medianwert der erreichten Punktzahl wird angezeigt. -*Variante B: IQ-Test auf Calliope Mini* +*Variante B: IQ-Test auf Calliope mini* -Das trainierte neuronale Netzwerk kann auch direkt auf dem Calliope Mini getestet werden. +Das trainierte neuronale Netzwerk kann auch direkt auf dem Calliope mini getestet werden. Projektziel ist es, die "Hirntransplantation" des trainierten KI-Modells für die SuS über die Oberfläche auf https://makecode.calliope.cc nachvollziehbar zu machen; Stand März 2021 verhinderte jedoch ein Bug in Makecode diese Variante. @@ -97,5 +97,5 @@ Daher wurde im Projekt ein temporärer Behelfsmechanismus implementiert: * Auf dem Schülergruppenrechner ins Verzeichnis wechseln: `ki-in-schulen-master/Calliope-Rennspiel/Python/iq-test-calliope/` * Auf dem Schülergruppenrechner ausführen: `python iq-test-erstellen.py -r ` (Die JSON-Modelldatei ist eine in Schritt 4 erzeugte Modelldatei, bspw. `sklearn-py-modell-20210302220807.json`) -* Die erzeugte Calliope Hex-Datei `iq-test-calliope.hex` kann auf einen Calliope Mini kopiert werden +* Die erzeugte Calliope Hex-Datei `iq-test-calliope.hex` kann auf einen Calliope mini kopiert werden * Die trainierte KI übernimmt die Steuerung im Rennspiel (manuelle Steuerung ist zusätzlich möglich) diff --git a/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Gruppenspielmodus.md b/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Gruppenspielmodus.md index 6f4fc24..dc09475 100644 --- a/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Gruppenspielmodus.md +++ b/Calliope-Rennspiel/Dokumentation/Nutzeranleitung-Gruppenspielmodus.md @@ -15,25 +15,25 @@ Pro Schülergruppe wird 1 "Datensammler-Calliope" benötigt, zu dem mehrere "Ren #### GUI (Grafische Nutzeroberfläche) -Seit Release "Speedy" (19.12.2022) können die Schritte 1 bis 6A statt manuell bzw. via Kommandozeile auch via einer komfortablen grafischen Nutzeroberfläche (GUI) durchgeführt werden (Stand 19.12.2022 nur für Windows verfügbar). +Seit Release "Speedy" (19.12.2022) können die Schritte 1 bis 6A statt manuell bzw. via Kommandozeile auch via einer komfortablen grafischen Nutzeroberfläche (GUI) durchgeführt werden (Stand Oktober 2023 nur für Windows und Linux verfügbar). -Dazu im Unterverzeichnis `/ki-in-schulen-master/Calliope-Rennspiel/Python/` folgenden Befehl ausführen: `python ki-gui-win.py` +Dazu im Unterverzeichnis `/ki-in-schulen-master/Calliope-Rennspiel/Python/` folgenden Befehl ausführen: `python ki-gui-win.py` oder `python ki-gui-lin.py` Die unten beschriebenen Schritte sind dann entsprechend über die Menüpunkte des erscheinenden Fenster nutzbar. -#### Schritt 1 - Rennspiel auf den Calliope Minis der Schüler installieren +#### Schritt 1 - Rennspiel auf den Calliope minis der Schüler installieren Diesen Schritt mit angepasster Funkgruppe (__funkgruppe1__, __funkgruppe2__, ...) wiederholen, bis alle "Rennspiel-Calliopes" für alle Schüler aller Schülergruppen installiert sind. -Für die Installation wird pro Schüler der Schülergruppe jeweils ein Calliope Mini per USB an den Schülergruppenrechner angeschlossen und dann das Rennspiel installiert: +Für die Installation wird pro Schüler der Schülergruppe jeweils ein Calliope mini per USB an den Schülergruppenrechner angeschlossen und dann das Rennspiel installiert: *MakeCode-Variante* -* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/Makecode/rennspiel-funkgruppe1-makecode.hex` auf den per USB angeschlossenen Calliope Mini kopieren +* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/Makecode/rennspiel-funkgruppe1-makecode.hex` auf den per USB angeschlossenen Calliope mini kopieren *OpenRoberta-Variante* -* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/OpenRoberta/rennspiel-openroberta.hex` auf den per USB angeschlossenen Calliope Mini kopieren +* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/OpenRoberta/rennspiel-openroberta.hex` auf den per USB angeschlossenen Calliope mini kopieren #### Schritt 2 - Datensammler pro Schülergruppe installieren @@ -45,11 +45,11 @@ Der "Datensammler-Calliope" wird nun an einen USB-Port des Schülergruppenrechne *MakeCode-Variante* -* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/Makecode/datensammler-funkgruppe-makecode.hex` auf den per USB angeschlossenen Calliope Mini kopieren +* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/Makecode/datensammler-funkgruppe-makecode.hex` auf den per USB angeschlossenen Calliope mini kopieren *OpenRoberta-Variante* -* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/OpenRoberta/datensammler-openroberta.hex` auf den per USB angeschlossenen Calliope Mini kopieren +* Die Datei `/ki-in-schulen-master/Calliope-Rennspiel/OpenRoberta/datensammler-openroberta.hex` auf den per USB angeschlossenen Calliope mini kopieren #### Schritt 3 - COM-Ports der per USB angeschlossenen "Datensammler-Calliopes" herausfinden @@ -57,7 +57,7 @@ Der "Datensammler-Calliope" wird nun an einen USB-Port des Schülergruppenrechne * Linux: `ls -al /dev/ttyACM*` - Unter Linux ist ggf. der Projektnutzer zur `dialout` Nutzergruppe hinzufügen, damit dieser auf den Calliope Mini auch zugreifen darf. + Unter Linux ist ggf. der Projektnutzer zur `dialout` Nutzergruppe hinzufügen, damit dieser auf den Calliope mini auch zugreifen darf. `sudo usermod -aG dialout` @@ -95,9 +95,9 @@ Der "Datensammler-Calliope" wird nun an einen USB-Port des Schülergruppenrechne * 50 Episoden werden durch die KI gespielt * Medianwert der erreichten Punktzahl wird angezeigt. -*Variante B: IQ-Test auf Calliope Mini* +*Variante B: IQ-Test auf Calliope mini* -Das trainierte neuronale Netzwerk kann auch direkt auf dem Calliope Mini getestet werden. +Das trainierte neuronale Netzwerk kann auch direkt auf dem Calliope mini getestet werden. Projektziel ist es, dies für die SuS über die Oberfläche auf https://makecode.calliope.cc nachvollziehbar zu machen; Stand März 2021 verhinderte jedoch ein Bug in Makecode diese Variante. @@ -105,5 +105,5 @@ Daher wurde im Projekt ein temporärer Behelfsmechanismus implementiert: * Auf dem Schülergruppenrechner ins Verzeichnis wechseln: `ki-in-schulen-master/Calliope-Rennspiel/Python/iq-test-calliope/` * Auf dem Schülergruppenrechner ausführen: `python iq-test-erstellen.py -r ` (Die JSON-Modelldatei ist eine in Schritt 5 erzeugte Modelldatei, bspw. `sklearn-py-modell-20210302220807.json`) -* Die erzeugte Calliope Hex-Datei `iq-test-calliope.hex` kann auf einen Calliope Mini kopiert werden +* Die erzeugte Calliope Hex-Datei `iq-test-calliope.hex` kann auf einen Calliope mini kopiert werden * Die trainierte KI übernimmt die Steuerung im Rennspiel (manuelle Steuerung ist zusätzlich möglich) diff --git a/Calliope-Rennspiel/Makecode/README.md b/Calliope-Rennspiel/Makecode/README.md index d04f7be..61130e1 100644 --- a/Calliope-Rennspiel/Makecode/README.md +++ b/Calliope-Rennspiel/Makecode/README.md @@ -10,4 +10,4 @@ In diesem Verzeichnis sind die Calliope mini Codeanteile für Microsoft Makecode * funkgruppe1 ... funkgruppe5 sind vorkonfiguriert auf die entsprechenden Funkkanäle des Calliope * Verzeichnis `KI-Erweiterung` * siehe separate README.md - * Diese Dateien stellen den Entwicklungsstand für die Projektvarianten 1A und 2- "IQ-Test auf dem Calliope Mini" dar, die aktuell aufgrund eines Bugs in Makecode nicht fortgeführt werden kann. + * Diese Dateien stellen den Entwicklungsstand für die Projektvarianten 1A und 2- "IQ-Test auf dem Calliope mini" dar, die aktuell aufgrund eines Bugs in Makecode nicht fortgeführt werden kann. diff --git a/Calliope-Rennspiel/Python/iq-test-calliope/README.md b/Calliope-Rennspiel/Python/iq-test-calliope/README.md index 1f8a234..5cb16cd 100644 --- a/Calliope-Rennspiel/Python/iq-test-calliope/README.md +++ b/Calliope-Rennspiel/Python/iq-test-calliope/README.md @@ -1,3 +1,3 @@ # Erläuterung des Verzeichnisses und Verzeichnisinhalts -Dieses Verzeichnis enthält eine temporäre Lösung, um einen "IQ-Test" mit einem fertig trainierten künstlichen neuronalen Netzwerk direkt auf einem Calliope Mini durchzuführen. Detaillierte Erläuterung siehe Schritt "IQ-Test" in den Nutzeranleitungen im Bereich Dokumentation. +Dieses Verzeichnis enthält eine temporäre Lösung, um einen "IQ-Test" mit einem fertig trainierten künstlichen neuronalen Netzwerk direkt auf einem Calliope mini durchzuführen. Detaillierte Erläuterung siehe Schritt "IQ-Test" in den Nutzeranleitungen im Bereich Dokumentation. diff --git a/Calliope-Rennspiel/Python/ki-gui-lin.py b/Calliope-Rennspiel/Python/ki-gui-lin.py new file mode 100644 index 0000000..98c78fe --- /dev/null +++ b/Calliope-Rennspiel/Python/ki-gui-lin.py @@ -0,0 +1,294 @@ +# +# ki-gui-lin.py$ +# +# (C) 2022-3, Arndt Baars, Christian A. Schiller, Deutsche Telekom AG +# +# Deutsche Telekom AG and all other contributors / +# copyright owners license this file to you under the +# MIT License (the "License"); you may not use this +# file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://opensource.org/licenses/MIT +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +# +# +# GUI fuer den KI-Workshop mit den Calliope +# +# Diese GUI ermoeglicht einen einfachen und schnellen Umgang mit den KI-Ressourcen. +# +# Folgende Features sind bereits enthalten: +# - Kopieren der Datensammler-Software auf den Calliope. Hier stehen zwei Optionen zur Auswahl. +# Zum einen auf Basis von OpenRoberta (Wahl des Kanals/Gruppe auf dem Calliope). +# Zum anderen auf Basis von Makecode (Direkte Auswahl von vier Punktgruppen). +# - Kopieren der Rennspieldateien auf den Calliope. Hier stehen zwei Optionen zur Auswahl. +# Zum einen auf Basis von OpenRoberta (Wahl des Kanals/Gruppe auf dem Calliope). +# Zum anderen auf Basis von Makecode (Direkte Auswahl von vier Punktgruppen). +# - Einfacher Start des Datensammlers auf dem lokalen Rechner. +# - Einfacher Start des KI-Trainings inkl. Layer-Konfig-Abfrage. +# - Einfacher Start des lokalen Rennspiels mit dem aktuell trainierten Modell. +# - Automatische USB-Port-Ermittlung +# - Automatische Calliope-Erkennung +# - Moeglichkeit, eigene Dateinamen vorzugeben +# - Sicherung der Einstellungen/Konfigurationen +# +# Geplante Features: +# - Einfaches Kopieren von trainierten Modellen auf den Calliope. +# - Einfuegen einer Hilfe mit Verweisen auf die vorhandenen Präsentationen und Materialien. +# - Portierung für Linux und MacOS +# +# Version 0.22 (Stand: 07.03.2023) +# +########## + +from tkinter import * +from tkinter import simpledialog +import sys +import subprocess +import serial.tools.list_ports +import os +from ctypes import create_unicode_buffer, c_wchar_p, sizeof +from string import ascii_uppercase +import pickle +import locale + +os_umgebung = sys.platform +os_locale = locale.getdefaultlocale()[0] +print("OS-Umgebung:") +print(os_umgebung) +print(os_locale) +print("") + + +# donothing +def donothing(): + win = Toplevel(fenster) + button = Button(win, text="Do nothing button") + button.pack() + + +def configEinlesen(): + try: + f = open("ki-gui-win_conf.cfg", "rb") + dict = pickle.load(f) + f.close() + return dict + except: + return {} + + +def configSpeichern(dict): + f = open("ki-gui-win_conf.cfg", "wb") + pickle.dump(dict, f) + f.close() + + +global dictConfig +dictConfig = configEinlesen() +if (not dictConfig): + # Default-Konfig + dictConfig = {"PythonEXE": ".", "CalliKIDir": "/usr/local/share/ki-in-schulen/Calliope-Rennspiel", + "COMPort": "/dev/ttypACM0", "Dateiname": "ki-rennspiel-mein-spiel"} +print("Einstellungen:") +print(dictConfig["Dateiname"]) +print(dictConfig["PythonEXE"]) +print(dictConfig["CalliKIDir"]) +print(dictConfig["COMPort"]) +print("") + + +# Kopiert die notwendigen Daten fuer einen Datensammler auf den Calliope. +# Wenn keine Gruppe angegeben wird, dann wird der Datensammler von OpenRoberta genutzt. +# Sonst wird der entsprechende Datensammler auf Basis von Makecode kopiert. +def copyDatensammler(gruppe=0): + src = None + if gruppe == 0: + src = os.path.join(dictConfig["CalliKIDir"], 'OpenRoberta', 'datensammler-openroberta.hex') + else: + src = os.path.join(dictConfig["CalliKIDir"], 'Makecode', 'datensammler-funkgruppe%d-makecode.hex' % gruppe) + dst = get_calliope_drive() + if dst: + cmd = 'cp %s %s' % (src, dst) + os.system(cmd) + else: + print("Leider konnte kein Ziellaufwerk ermittelt werden!") + + +# Kopiert die notwendigen Daten fuer das Rennspiel auf den Calliope. +# Wenn keine Gruppe angegeben wird, dann wird das Rennspiel von OpenRoberta genutzt. +# Sonst wird das entsprechende Rennspiel auf Basis von Makecode kopiert. +def copyRennspiel(gruppe=0): + src = None + if gruppe == 0: + src = os.path.join(dictConfig["CalliKIDir"], 'OpenRoberta', 'rennspiel-openroberta.hex') + else: + src = os.path.join(dictConfig["CalliKIDir"], 'Makecode', 'rennspiel-funkgruppe%d-makecode.hex' % gruppe) + dst = get_calliope_drive() + if dst: + cmd = 'cp %s %s' % (src, dst) + os.system(cmd) + else: + print("Leider konnte kein Ziellaufwerk ermittelt werden!") + + +def portErmitteln(): + for port, desc, hwid in serial.tools.list_ports.grep("USB Serial Device"): + return port + else: + for port, desc, hwid in serial.tools.list_ports.grep("Serielles USB"): + return port + else: + for port, desc, hwrid in serial.tools.list_ports.grep("Serial Port"): + return port + else: + return False + + """ + ports = serial.tools.list_ports.comports() + for port, desc, hwid in sorted(ports): + print(desc) + if (desc.startswith('USB Serial Device')): + # desc.startswith('Serielles USB') für Deutsch + #'print("{}: {} [{}]".format(port, desc, hwid)) + print(f"Erkannter Port: {port}") + return port + """ + + +# Unabhängig von der Konfigurationsdatei (Einstellungsseite) den Port für diesen Rechner automatisch ermitteln. +# Falls das nicht funktioniert, wird der Port aus der Konfiguration verwendet. +usbPort = portErmitteln() +if usbPort: + dictConfig["COMPort"] = usbPort + print(f"Erkannter Port: {usbPort}") + + +def get_calliope_drive(): + return "/run/media/%s/MINI" % os.getenv("USER") + + +# ki-datenlogger.py +def ki_datenlogger(): + # Hier wird als erster Prozessschritt ein Dateiname abgefragt und auch für die weiteren Schritte genutzt. + # Falls hier kein Dateiname angegeben wird, wird der Dateiname aus der Konfig weiter verwendet. + dateiname = simpledialog.askstring("Input", "Bitte einen Dateinamen angeben (ohne Leerzeichen!)", + initialvalue=dictConfig["Dateiname"], parent=fenster) + if dateiname is not None: + dictConfig["Dateiname"] = dateiname + cmd = os.path.join(dictConfig["CalliKIDir"], 'Python', 'ki-datenlogger.py') + outputfile = os.path.join('csv-rohdaten', dictConfig["Dateiname"] + '.csv') + subprocess.run([sys.executable, cmd, dictConfig["COMPort"], outputfile], check=True) + + +# ki-trainieren-sklearn.py +def ki_trainieren(): + cmd = os.path.join(dictConfig["CalliKIDir"], 'Python', 'ki-trainieren-sklearn.py') + layer = simpledialog.askstring("Input", "Bitte Hidden Layer definieren - A,B oder A,B,C", initialvalue='7,7', + parent=fenster) + param = os.path.join('csv-rohdaten', dictConfig["Dateiname"] + '.csv') + outputbase = os.path.join('modelle', dictConfig["Dateiname"]) + subprocess.run([sys.executable, cmd, param, layer, outputbase], check=True) + + +# ki-rennspiel.py +def ki_rennspiel(): + cmd = os.path.join(dictConfig["CalliKIDir"], 'Python', 'ki-rennspiel.py') + param = os.path.join('modelle', dictConfig["Dateiname"] + '.pkcls') + subprocess.run([sys.executable, cmd, 'sklearn', param], check=True) + + +# Einstellungen-Win definieren +def einstellungen(): + einstellungenWin = Toplevel(fenster) + einstellungenWin.geometry('700x250') + + def exit_btn(): + dictConfig["Dateiname"] = dateiname_feld.get() + dictConfig["PythonEXE"] = pythonVerz_feld.get() + dictConfig["CalliKIDir"] = kiVerz_feld.get() + configSpeichern(dictConfig) + einstellungenWin.destroy() + einstellungenWin.update() + + dateiname_label = Label(einstellungenWin, text="Dateiname") + dateiname_feld = Entry(einstellungenWin, justify=LEFT, bd=5, width=40) + dateiname_feld.insert(END, dictConfig["Dateiname"]) + pythonVerz_label = Label(einstellungenWin, text="Python-Verzeichnis") + pythonVerz_feld = Entry(einstellungenWin, justify=LEFT, bd=5, width=80) + pythonVerz_feld.insert(END, dictConfig["PythonEXE"]) + kiVerz_label = Label(einstellungenWin, text="KI-Verzeichnis") + kiVerz_feld = Entry(einstellungenWin, justify=LEFT, bd=5, width=80) + kiVerz_feld.insert(END, dictConfig["CalliKIDir"]) + usbPort_label = Label(einstellungenWin, text="USB-Port") + usbPort_feld = Entry(einstellungenWin, justify=LEFT, bd=5, width=20) + usbPort_feld.insert(END, dictConfig["COMPort"]) + # uebernehmen_button = Button(einstellungenWin, text="Einstellungen übernehmen", command=einstellungenWin.destroy) + uebernehmen_button = Button(einstellungenWin, text="Einstellungen übernehmen", command=exit_btn) + + dateiname_label.grid(row=0, column=0, pady=15, padx=20) + dateiname_feld.grid(row=0, column=1, sticky=W) + pythonVerz_label.grid(row=1, column=0, pady=15, padx=20) + pythonVerz_feld.grid(row=1, column=1, sticky=W) + kiVerz_label.grid(row=2, column=0, pady=15, padx=20) + kiVerz_feld.grid(row=2, column=1, sticky=W) + usbPort_label.grid(row=3, column=0, pady=15, padx=20) + usbPort_feld.grid(row=3, column=1, sticky=W) + uebernehmen_button.grid(row=4, column=0, columnspan=2, pady=15) + + +# Ein Fenster erstellen +fenster = Tk() +# Den Fenstertitle erstellen +fenster.title("KI mit dem Calliope") +# Fenstergroesse vorgeben +fenster.geometry('400x200') + +# Ein Menu anlegen +menubar = Menu(fenster) +# Datei-Menu +dateimenu = Menu(menubar, tearoff=0) +dateimenu.add_command(label="Einstellungen", command=einstellungen) +dateimenu.add_separator() +dateimenu.add_command(label="Beenden", command=fenster.quit) +menubar.add_cascade(label="Datei", menu=dateimenu) + +# Calli-Menu +callimenu = Menu(menubar, tearoff=0) +callimenu.add_command(label="Datensammler kopieren", command=copyDatensammler) +callimenu.add_command(label="Rennspiel kopieren", command=copyRennspiel) +callimenu.add_separator() +callimenu.add_command(label="Makecode Datensammler kopieren Gruppe 1", command=lambda: copyDatensammler(1)) +callimenu.add_command(label="Makecode Datensammler kopieren Gruppe 2", command=lambda: copyDatensammler(2)) +callimenu.add_command(label="Makecode Datensammler kopieren Gruppe 3", command=lambda: copyDatensammler(3)) +callimenu.add_command(label="Makecode Datensammler kopieren Gruppe 4", command=lambda: copyDatensammler(4)) +callimenu.add_command(label="Makecode Rennspiel kopieren Gruppe 1", command=lambda: copyRennspiel(1)) +callimenu.add_command(label="Makecode Rennspiel kopieren Gruppe 2", command=lambda: copyRennspiel(2)) +callimenu.add_command(label="Makecode Rennspiel kopieren Gruppe 3", command=lambda: copyRennspiel(3)) +callimenu.add_command(label="Makecode Rennspiel kopieren Gruppe 4", command=lambda: copyRennspiel(4)) +menubar.add_cascade(label="Calli", menu=callimenu) + +# KI-Menu +kimenu = Menu(menubar, tearoff=0) +kimenu.add_command(label="Datensammler starten", command=ki_datenlogger) +kimenu.add_separator() +kimenu.add_command(label="KI anlernen", command=ki_trainieren) +kimenu.add_command(label="KI testen", command=ki_rennspiel) +# kimenu.add_separator() +# kimenu.add_command(label="KI auf Calli kopieren", command=donothing) +menubar.add_cascade(label="KI", menu=kimenu) + +# Hilfe-Menu +# hilfemenu = Menu(menubar, tearoff=0) +# hilfemenu.add_command(label="Hilfe", command=donothing) +# menubar.add_cascade(label="Hilfe", menu=hilfemenu) + +fenster.config(menu=menubar) +# In der Ereignisschleife auf Eingabe des Benutzers warten. +fenster.mainloop() diff --git a/Calliope-Rennspiel/Python/ki-trainieren-orange.ows b/Calliope-Rennspiel/Python/ki-trainieren-orange.ows index 2e7391e..351899f 100644 --- a/Calliope-Rennspiel/Python/ki-trainieren-orange.ows +++ b/Calliope-Rennspiel/Python/ki-trainieren-orange.ows @@ -194,7 +194,7 @@ ICAgICAgICAglGVoMV2UaHlhdWJldS4= {'_session_items': [('./csv-rohdaten/120minutes-1.csv', {'encoding': 'utf-8', 'delimiter': ',', 'quotechar': '"', 'doublequote': True, 'skipinitialspace': True, 'quoting': 0, 'columntypes': [{'start': 0, 'stop': 7, 'value': 'Auto'}], 'rowspec': [{'start': 0, 'stop': 1, 'value': 'Header'}], 'decimal_separator': '.', 'group_separator': ''}), ('./csv-rohdaten/ki-rennspiel-log-20210302211909.csv', {'encoding': 'utf-8', 'delimiter': ',', 'quotechar': '"', 'doublequote': True, 'skipinitialspace': True, 'quoting': 0, 'columntypes': [{'start': 0, 'stop': 7, 'value': 'Auto'}], 'rowspec': [{'start': 0, 'stop': 1, 'value': 'Header'}], 'decimal_separator': '.', 'group_separator': ''}), ('./csv-rohdaten/120minutes-1.csv', {'encoding': 'utf-8', 'delimiter': ',', 'quotechar': '"', 'doublequote': True, 'skipinitialspace': True, 'quoting': 0, 'columntypes': [{'start': 0, 'stop': 7, 'value': 'Auto'}], 'rowspec': [{'start': 0, 'stop': 1, 'value': 'Header'}], 'decimal_separator': '.', 'group_separator': ''}), ('./csv-rohdaten/120minutes-1.csv', {'encoding': 'utf-8', 'delimiter': ',', 'quotechar': '"', 'doublequote': True, 'skipinitialspace': True, 'quoting': 0, 'columntypes': [{'start': 0, 'stop': 7, 'value': 'Auto'}], 'rowspec': [{'start': 0, 'stop': 1, 'value': 'Header'}], 'decimal_separator': '.', 'group_separator': ''}), ('./csv-rohdaten/120minutes-1.csv', {'encoding': 'utf-8', 'delimiter': ',', 'quotechar': '"', 'doublequote': True, 'skipinitialspace': True, 'quoting': 0, 'columntypes': [{'start': 0, 'stop': 6, 'value': 'Numeric'}, {'start': 6, 'stop': 7, 'value': 'Categorical'}], 'rowspec': [{'start': 0, 'stop': 1, 'value': 'Header'}], 'decimal_separator': '.', 'group_separator': ''}), ('./csv-rohdaten/60minutes-1.csv', {'encoding': 'utf-8', 'delimiter': ',', 'quotechar': '"', 'doublequote': True, 'skipinitialspace': True, 'quoting': 0, 'columntypes': [{'start': 0, 'stop': 6, 'value': 'Numeric'}, {'start': 6, 'stop': 7, 'value': 'Categorical'}], 'rowspec': [{'start': 0, 'stop': 1, 'value': 'Header'}], 'decimal_separator': '.', 'group_separator': ''})], 'controlAreaVisible': True, 'dialog_state': {'directory': './csv-rohdaten', 'filter': 'Text - comma separated (*.csv, *)'}, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x01\x90\x00\x00\x00_\x00\x00\x02\xda\x00\x00\x01\xd2\x00\x00\x01\x90\x00\x00\x00\x80\x00\x00\x02\xda\x00\x00\x01\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x01\x90\x00\x00\x00\x80\x00\x00\x02\xda\x00\x00\x01\xd2', '__version__': 1} {'auto_apply': True, 'controlAreaVisible': True, 'learner_name': 'kNN', 'metric_index': 0, 'n_neighbors': 5, 'savedWidgetGeometry': None, 'weight_index': 0, '__version__': 1} {'algorithm_index': 1, 'auto_apply': True, 'controlAreaVisible': True, 'learner_name': '', 'learning_rate': 1.0, 'loss_index': 0, 'n_estimators': 50, 'random_seed': 0, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x02A\x00\x00\x00\x83\x00\x00\x03\xaa\x00\x00\x02M\x00\x00\x02A\x00\x00\x00\xa4\x00\x00\x03\xaa\x00\x00\x02M\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x02A\x00\x00\x00\xa4\x00\x00\x03\xaa\x00\x00\x02M', 'use_random_seed': False, '__version__': 1} - {'controlAreaVisible': True, 'currentScriptIndex': 0, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x01y\x00\x00\x009\x00\x00\x04\x98\x00\x00\x02\xde\x00\x00\x01y\x00\x00\x00Z\x00\x00\x04\x98\x00\x00\x02\xde\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x01y\x00\x00\x00Z\x00\x00\x04\x98\x00\x00\x02\xde', 'scriptLibrary': [{'name': 'ki-trainieren-orange3', 'script': '#\n# ki-trainieren-orange3.py$\n#\n# (C) 2021, Christian A. Schiller, Deutsche Telekom AG\n#\n# Deutsche Telekom AG and all other contributors /\n# copyright owners license this file to you under the\n# MIT License (the "License"); you may not use this\n# file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# https://opensource.org/licenses/MIT\n#\n# Unless required by applicable law or agreed to in writing,\n# software distributed under the License is distributed on an\n# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n# KIND, either express or implied. See the License for the\n# specific language governing permissions and limitations\n# under the License.\n\n# Import required libraries\nimport pandas as pd\nimport numpy as np\nimport sklearn\nfrom sklearn.neural_network import MLPClassifier\nimport pickle\nimport json\nfrom time import gmtime, strftime\n\n#Größe des neuronalen Netzwerks\nhidden_layers_raw = "7,7"\nhidden_layers = hidden_layers_raw.split (",")\nhidden_layers = list(map(int, hidden_layers))\n\n# Laden der von Orange3 prozessierten Daten\nfilename_train = \'./csv-vorverarbeitet/train-80p-stratified-data.csv\'\nfilename_test = \'./csv-vorverarbeitet/test-20p-stratified-data.csv\'\n\n# Trainingsdaten\ndf_train = pd.read_csv(filename_train)\nprint(df_train.shape)\ndf_train = df_train.drop([\'Selected\'], axis=1)\ndf_train.head()\nX = df_train[[\'PlayerPos\',\'Car1Pos\',\'Car2Pos\',\'Car3Pos\',\'Car4Pos\',\'Car5Pos\']].values\ny = df_train[\'Action\'].values\n\n# Testdaten\ndf_test = pd.read_csv(filename_test)\nprint(df_test.shape)\ndf_test = df_test.drop([\'Selected\'], axis=1)\ndf_test.head()\nXt = df_test[[\'PlayerPos\',\'Car1Pos\',\'Car2Pos\',\'Car3Pos\',\'Car4Pos\',\'Car5Pos\']].values\nyt = df_test[\'Action\'].values\n\n# Instanziieren des ML-Modells\nmlp = MLPClassifier(hidden_layer_sizes=tuple(hidden_layers),\n activation=\'relu\', # default relu\n solver=\'adam\', # default sgd\n max_iter=5000, # default 200\n alpha=0.0001, # default 0.0001\n n_iter_no_change=100 # default 10\n )\n# Trainingsvorgang\nprint("Beginne Trainingsvorgang.")\nmlp.fit(X,y)\nprint("Training beendet.")\n\n# Ausgeben des Trainingsergebnisses\nprint("Erreichte Modellgenauigkeit (Trainingsdaten): ",mlp.score(X,y))\nprint("Erreichte Modellgenauigkeit (Testdaten) : ",mlp.score(Xt,yt))\n\n# Timestamp erzeugen\nstamp = strftime("%Y%m%d%H%M%S", gmtime())\n\n# Speichern des Modells (Pickle-Format zur Nutzung im Python-Rennspiel)\nfilename = \'./modelle/sklearn-ows-modell-\'+stamp+\'.pkcls\'\nmlp_file = open(filename, \'wb\')\npickle.dump(mlp, mlp_file)\nprint("Pickle-Datei des trainierten ML-Modells gespeichert.")\nprint("Dateiname: "+filename)\n\n# Speichern des Modells (JSON-Format zur Nutzung auf Calliope Mini)\n\njsonlayers = []\njsonlayers.append(6) # input layers\njsonlayers += hidden_layers # hidden Layers\njsonlayers.append(3) # output layer\n\ndata = {}\ndata[\'params\'] = []\ndata[\'params\'].append({\'layers\': jsonlayers})\ndata[\'params\'].append({\'act\': \'relu\'})\ndata[\'coefs\'] = []\nfor item in mlp.coefs_:\n data[\'coefs\'].append(item.tolist())\ndata[\'intercepts\'] = []\nfor item in mlp.intercepts_:\n data[\'intercepts\'].append(item.tolist())\n\nfilename = \'./modelle/sklearn-ows-modell-\'+stamp+\'.json\'\n\ndef round_floats(o):\n if isinstance(o, float): return round(o, 6)\n if isinstance(o, dict): return {k: round_floats(v) for k, v in o.items()}\n if isinstance(o, (list, tuple)): return [round_floats(x) for x in o]\n return o\n\nwith open(filename, \'w\') as outfile:\n json.dump(round_floats(data), outfile, separators=(\',\',\':\'))\n\nprint("JSON-Datei des trainierten ML-Modells gespeichert.")\nprint("Dateiname: "+filename)\n', 'filename': './ki-trainieren-orange3.py'}], 'scriptText': '#\n# ki-trainieren-orange3.py$\n#\n# (C) 2021, Christian A. Schiller, Deutsche Telekom AG\n#\n# Deutsche Telekom AG and all other contributors /\n# copyright owners license this file to you under the\n# MIT License (the "License"); you may not use this\n# file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# https://opensource.org/licenses/MIT\n#\n# Unless required by applicable law or agreed to in writing,\n# software distributed under the License is distributed on an\n# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n# KIND, either express or implied. See the License for the\n# specific language governing permissions and limitations\n# under the License.\n\n# Import required libraries\nimport pandas as pd\nimport numpy as np\nimport sklearn\nfrom sklearn.neural_network import MLPClassifier\nimport pickle\nimport json\nfrom time import gmtime, strftime\n\n#Größe des neuronalen Netzwerks\nhidden_layers_raw = "7,7"\nhidden_layers = hidden_layers_raw.split (",")\nhidden_layers = list(map(int, hidden_layers))\n\n# Laden der von Orange3 prozessierten Daten\nfilename_train = \'./csv-vorverarbeitet/train-80p-stratified-data.csv\'\nfilename_test = \'./csv-vorverarbeitet/test-20p-stratified-data.csv\'\n\n# Trainingsdaten\ndf_train = pd.read_csv(filename_train)\nprint(df_train.shape)\ndf_train = df_train.drop([\'Selected\'], axis=1)\ndf_train.head()\nX = df_train[[\'PlayerPos\',\'Car1Pos\',\'Car2Pos\',\'Car3Pos\',\'Car4Pos\',\'Car5Pos\']].values\ny = df_train[\'Action\'].values\n\n# Testdaten\ndf_test = pd.read_csv(filename_test)\nprint(df_test.shape)\ndf_test = df_test.drop([\'Selected\'], axis=1)\ndf_test.head()\nXt = df_test[[\'PlayerPos\',\'Car1Pos\',\'Car2Pos\',\'Car3Pos\',\'Car4Pos\',\'Car5Pos\']].values\nyt = df_test[\'Action\'].values\n\n# Instanziieren des ML-Modells\nmlp = MLPClassifier(hidden_layer_sizes=tuple(hidden_layers),\n activation=\'relu\', # default relu\n solver=\'adam\', # default sgd\n max_iter=5000, # default 200\n alpha=0.0001, # default 0.0001\n n_iter_no_change=100 # default 10\n )\n# Trainingsvorgang\nprint("Beginne Trainingsvorgang.")\nmlp.fit(X,y)\nprint("Training beendet.")\n\n# Ausgeben des Trainingsergebnisses\nprint("Erreichte Modellgenauigkeit (Trainingsdaten): ",mlp.score(X,y))\nprint("Erreichte Modellgenauigkeit (Testdaten) : ",mlp.score(Xt,yt))\n\n# Timestamp erzeugen\nstamp = strftime("%Y%m%d%H%M%S", gmtime())\n\n# Speichern des Modells (Pickle-Format zur Nutzung im Python-Rennspiel)\nfilename = \'./modelle/sklearn-ows-modell-\'+stamp+\'.pkcls\'\nmlp_file = open(filename, \'wb\')\npickle.dump(mlp, mlp_file)\nprint("Pickle-Datei des trainierten ML-Modells gespeichert.")\nprint("Dateiname: "+filename)\n\n# Speichern des Modells (JSON-Format zur Nutzung auf Calliope Mini)\n\njsonlayers = []\njsonlayers.append(6) # input layers\njsonlayers += hidden_layers # hidden Layers\njsonlayers.append(3) # output layer\n\ndata = {}\ndata[\'params\'] = []\ndata[\'params\'].append({\'layers\': jsonlayers})\ndata[\'params\'].append({\'act\': \'relu\'})\ndata[\'coefs\'] = []\nfor item in mlp.coefs_:\n data[\'coefs\'].append(item.tolist())\ndata[\'intercepts\'] = []\nfor item in mlp.intercepts_:\n data[\'intercepts\'].append(item.tolist())\n\nfilename = \'./modelle/sklearn-ows-modell-\'+stamp+\'.json\'\n\ndef round_floats(o):\n if isinstance(o, float): return round(o, 6)\n if isinstance(o, dict): return {k: round_floats(v) for k, v in o.items()}\n if isinstance(o, (list, tuple)): return [round_floats(x) for x in o]\n return o\n\nwith open(filename, \'w\') as outfile:\n json.dump(round_floats(data), outfile, separators=(\',\',\':\'))\n\nprint("JSON-Datei des trainierten ML-Modells gespeichert.")\nprint("Dateiname: "+filename)\n', 'splitterState': b'\x00\x00\x00\xff\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00y\x00\x00\x00y\x01\xff\xff\xff\xff\x01\x00\x00\x00\x02\x00', '__version__': 2} + {'controlAreaVisible': True, 'currentScriptIndex': 0, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x01y\x00\x00\x009\x00\x00\x04\x98\x00\x00\x02\xde\x00\x00\x01y\x00\x00\x00Z\x00\x00\x04\x98\x00\x00\x02\xde\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x01y\x00\x00\x00Z\x00\x00\x04\x98\x00\x00\x02\xde', 'scriptLibrary': [{'name': 'ki-trainieren-orange3', 'script': '#\n# ki-trainieren-orange3.py$\n#\n# (C) 2021, Christian A. Schiller, Deutsche Telekom AG\n#\n# Deutsche Telekom AG and all other contributors /\n# copyright owners license this file to you under the\n# MIT License (the "License"); you may not use this\n# file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# https://opensource.org/licenses/MIT\n#\n# Unless required by applicable law or agreed to in writing,\n# software distributed under the License is distributed on an\n# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n# KIND, either express or implied. See the License for the\n# specific language governing permissions and limitations\n# under the License.\n\n# Import required libraries\nimport pandas as pd\nimport numpy as np\nimport sklearn\nfrom sklearn.neural_network import MLPClassifier\nimport pickle\nimport json\nfrom time import gmtime, strftime\n\n#Größe des neuronalen Netzwerks\nhidden_layers_raw = "7,7"\nhidden_layers = hidden_layers_raw.split (",")\nhidden_layers = list(map(int, hidden_layers))\n\n# Laden der von Orange3 prozessierten Daten\nfilename_train = \'./csv-vorverarbeitet/train-80p-stratified-data.csv\'\nfilename_test = \'./csv-vorverarbeitet/test-20p-stratified-data.csv\'\n\n# Trainingsdaten\ndf_train = pd.read_csv(filename_train)\nprint(df_train.shape)\ndf_train = df_train.drop([\'Selected\'], axis=1)\ndf_train.head()\nX = df_train[[\'PlayerPos\',\'Car1Pos\',\'Car2Pos\',\'Car3Pos\',\'Car4Pos\',\'Car5Pos\']].values\ny = df_train[\'Action\'].values\n\n# Testdaten\ndf_test = pd.read_csv(filename_test)\nprint(df_test.shape)\ndf_test = df_test.drop([\'Selected\'], axis=1)\ndf_test.head()\nXt = df_test[[\'PlayerPos\',\'Car1Pos\',\'Car2Pos\',\'Car3Pos\',\'Car4Pos\',\'Car5Pos\']].values\nyt = df_test[\'Action\'].values\n\n# Instanziieren des ML-Modells\nmlp = MLPClassifier(hidden_layer_sizes=tuple(hidden_layers),\n activation=\'relu\', # default relu\n solver=\'adam\', # default sgd\n max_iter=5000, # default 200\n alpha=0.0001, # default 0.0001\n n_iter_no_change=100 # default 10\n )\n# Trainingsvorgang\nprint("Beginne Trainingsvorgang.")\nmlp.fit(X,y)\nprint("Training beendet.")\n\n# Ausgeben des Trainingsergebnisses\nprint("Erreichte Modellgenauigkeit (Trainingsdaten): ",mlp.score(X,y))\nprint("Erreichte Modellgenauigkeit (Testdaten) : ",mlp.score(Xt,yt))\n\n# Timestamp erzeugen\nstamp = strftime("%Y%m%d%H%M%S", gmtime())\n\n# Speichern des Modells (Pickle-Format zur Nutzung im Python-Rennspiel)\nfilename = \'./modelle/sklearn-ows-modell-\'+stamp+\'.pkcls\'\nmlp_file = open(filename, \'wb\')\npickle.dump(mlp, mlp_file)\nprint("Pickle-Datei des trainierten ML-Modells gespeichert.")\nprint("Dateiname: "+filename)\n\n# Speichern des Modells (JSON-Format zur Nutzung auf Calliope mini)\n\njsonlayers = []\njsonlayers.append(6) # input layers\njsonlayers += hidden_layers # hidden Layers\njsonlayers.append(3) # output layer\n\ndata = {}\ndata[\'params\'] = []\ndata[\'params\'].append({\'layers\': jsonlayers})\ndata[\'params\'].append({\'act\': \'relu\'})\ndata[\'coefs\'] = []\nfor item in mlp.coefs_:\n data[\'coefs\'].append(item.tolist())\ndata[\'intercepts\'] = []\nfor item in mlp.intercepts_:\n data[\'intercepts\'].append(item.tolist())\n\nfilename = \'./modelle/sklearn-ows-modell-\'+stamp+\'.json\'\n\ndef round_floats(o):\n if isinstance(o, float): return round(o, 6)\n if isinstance(o, dict): return {k: round_floats(v) for k, v in o.items()}\n if isinstance(o, (list, tuple)): return [round_floats(x) for x in o]\n return o\n\nwith open(filename, \'w\') as outfile:\n json.dump(round_floats(data), outfile, separators=(\',\',\':\'))\n\nprint("JSON-Datei des trainierten ML-Modells gespeichert.")\nprint("Dateiname: "+filename)\n', 'filename': './ki-trainieren-orange3.py'}], 'scriptText': '#\n# ki-trainieren-orange3.py$\n#\n# (C) 2021, Christian A. Schiller, Deutsche Telekom AG\n#\n# Deutsche Telekom AG and all other contributors /\n# copyright owners license this file to you under the\n# MIT License (the "License"); you may not use this\n# file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# https://opensource.org/licenses/MIT\n#\n# Unless required by applicable law or agreed to in writing,\n# software distributed under the License is distributed on an\n# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n# KIND, either express or implied. See the License for the\n# specific language governing permissions and limitations\n# under the License.\n\n# Import required libraries\nimport pandas as pd\nimport numpy as np\nimport sklearn\nfrom sklearn.neural_network import MLPClassifier\nimport pickle\nimport json\nfrom time import gmtime, strftime\n\n#Größe des neuronalen Netzwerks\nhidden_layers_raw = "7,7"\nhidden_layers = hidden_layers_raw.split (",")\nhidden_layers = list(map(int, hidden_layers))\n\n# Laden der von Orange3 prozessierten Daten\nfilename_train = \'./csv-vorverarbeitet/train-80p-stratified-data.csv\'\nfilename_test = \'./csv-vorverarbeitet/test-20p-stratified-data.csv\'\n\n# Trainingsdaten\ndf_train = pd.read_csv(filename_train)\nprint(df_train.shape)\ndf_train = df_train.drop([\'Selected\'], axis=1)\ndf_train.head()\nX = df_train[[\'PlayerPos\',\'Car1Pos\',\'Car2Pos\',\'Car3Pos\',\'Car4Pos\',\'Car5Pos\']].values\ny = df_train[\'Action\'].values\n\n# Testdaten\ndf_test = pd.read_csv(filename_test)\nprint(df_test.shape)\ndf_test = df_test.drop([\'Selected\'], axis=1)\ndf_test.head()\nXt = df_test[[\'PlayerPos\',\'Car1Pos\',\'Car2Pos\',\'Car3Pos\',\'Car4Pos\',\'Car5Pos\']].values\nyt = df_test[\'Action\'].values\n\n# Instanziieren des ML-Modells\nmlp = MLPClassifier(hidden_layer_sizes=tuple(hidden_layers),\n activation=\'relu\', # default relu\n solver=\'adam\', # default sgd\n max_iter=5000, # default 200\n alpha=0.0001, # default 0.0001\n n_iter_no_change=100 # default 10\n )\n# Trainingsvorgang\nprint("Beginne Trainingsvorgang.")\nmlp.fit(X,y)\nprint("Training beendet.")\n\n# Ausgeben des Trainingsergebnisses\nprint("Erreichte Modellgenauigkeit (Trainingsdaten): ",mlp.score(X,y))\nprint("Erreichte Modellgenauigkeit (Testdaten) : ",mlp.score(Xt,yt))\n\n# Timestamp erzeugen\nstamp = strftime("%Y%m%d%H%M%S", gmtime())\n\n# Speichern des Modells (Pickle-Format zur Nutzung im Python-Rennspiel)\nfilename = \'./modelle/sklearn-ows-modell-\'+stamp+\'.pkcls\'\nmlp_file = open(filename, \'wb\')\npickle.dump(mlp, mlp_file)\nprint("Pickle-Datei des trainierten ML-Modells gespeichert.")\nprint("Dateiname: "+filename)\n\n# Speichern des Modells (JSON-Format zur Nutzung auf Calliope mini)\n\njsonlayers = []\njsonlayers.append(6) # input layers\njsonlayers += hidden_layers # hidden Layers\njsonlayers.append(3) # output layer\n\ndata = {}\ndata[\'params\'] = []\ndata[\'params\'].append({\'layers\': jsonlayers})\ndata[\'params\'].append({\'act\': \'relu\'})\ndata[\'coefs\'] = []\nfor item in mlp.coefs_:\n data[\'coefs\'].append(item.tolist())\ndata[\'intercepts\'] = []\nfor item in mlp.intercepts_:\n data[\'intercepts\'].append(item.tolist())\n\nfilename = \'./modelle/sklearn-ows-modell-\'+stamp+\'.json\'\n\ndef round_floats(o):\n if isinstance(o, float): return round(o, 6)\n if isinstance(o, dict): return {k: round_floats(v) for k, v in o.items()}\n if isinstance(o, (list, tuple)): return [round_floats(x) for x in o]\n return o\n\nwith open(filename, \'w\') as outfile:\n json.dump(round_floats(data), outfile, separators=(\',\',\':\'))\n\nprint("JSON-Datei des trainierten ML-Modells gespeichert.")\nprint("Dateiname: "+filename)\n', 'splitterState': b'\x00\x00\x00\xff\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00y\x00\x00\x00y\x01\xff\xff\xff\xff\x01\x00\x00\x00\x02\x00', '__version__': 2} {'add_type_annotations': False, 'auto_save': True, 'controlAreaVisible': True, 'filter': 'Comma-separated values (*.csv)', 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x02\x9a\x00\x00\x016\x00\x00\x03\xf0\x00\x00\x01\xf6\x00\x00\x02\x9a\x00\x00\x01W\x00\x00\x03\xf0\x00\x00\x01\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x02\x9a\x00\x00\x01W\x00\x00\x03\xf0\x00\x00\x01\xf6', 'stored_name': 'train-80p-stratified-data.csv', 'stored_path': 'csv-vorverarbeitet', '__version__': 2} {'add_type_annotations': False, 'auto_save': True, 'controlAreaVisible': True, 'filter': 'Comma-separated values (*.csv)', 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x02\x9a\x00\x00\x016\x00\x00\x03\xea\x00\x00\x01\xf6\x00\x00\x02\x9a\x00\x00\x01W\x00\x00\x03\xea\x00\x00\x01\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x02\x9a\x00\x00\x01W\x00\x00\x03\xea\x00\x00\x01\xf6', 'stored_name': 'test-20p-stratified-data.csv', 'stored_path': 'csv-vorverarbeitet', '__version__': 2} diff --git a/Calliope-Rennspiel/Python/ki-trainieren-orange3.py b/Calliope-Rennspiel/Python/ki-trainieren-orange3.py index 98cb0f5..6c7cbca 100644 --- a/Calliope-Rennspiel/Python/ki-trainieren-orange3.py +++ b/Calliope-Rennspiel/Python/ki-trainieren-orange3.py @@ -79,7 +79,7 @@ print("Pickle-Datei des trainierten ML-Modells gespeichert.") print("Dateiname: "+filename) -# Speichern des Modells (JSON-Format zur Nutzung auf Calliope Mini) +# Speichern des Modells (JSON-Format zur Nutzung auf Calliope mini) jsonlayers = [] jsonlayers.append(6) # input layers diff --git a/Calliope-Rennspiel/Python/ki-trainieren-sklearn.py b/Calliope-Rennspiel/Python/ki-trainieren-sklearn.py index 3ccf910..d06b081 100644 --- a/Calliope-Rennspiel/Python/ki-trainieren-sklearn.py +++ b/Calliope-Rennspiel/Python/ki-trainieren-sklearn.py @@ -58,7 +58,7 @@ print('Folgende Dateien werden erzeugt:') print(' (1) Das trainierte ML-Modell als Pickle-Datei zur Nutzung mit ki-rennspiel.py:') print(' ./modelle/sklearn-py-modell-.pkcls') - print(' (2) Das trainierte ML-Modell als JSON-Datei zur Nutzung mit Calliope Mini:') + print(' (2) Das trainierte ML-Modell als JSON-Datei zur Nutzung mit Calliope mini:') print(' ./modelle/sklearn-py-modell-.json') print("Nutzung:\n") print("python ./ki-trainieren-sklearn.py @@ -41,11 +41,11 @@ Folgende Übersicht fasst den Projektablauf & Projektvarianten übersichtlich zu ![Übersicht](./uebersicht.png) -### Erläuterung zum Projekt "pxt-ki-in-schulen" +### Erläuterung zum Github-Projekt "pxt-ki-in-schulen" -Das trainierte neuronale Netzwerk kann auch direkt auf dem Calliope Mini getestet werden. Dies ermöglicht den SuS, ihren Lernerfolg (Training="Anlernen" eines autonom fahrenden Autos) direkt auf dem Calliope Mini zu beobachten, statt nur - relativ abstrakt - auf einem Desktop-Rechner. +Das trainierte neuronale Netzwerk kann auch direkt auf dem Calliope mini getestet werden. Dies ermöglicht den SuS, ihren Lernerfolg (Training="Anlernen" eines autonom fahrenden Autos) direkt auf dem Calliope mini zu beobachten, statt nur - relativ abstrakt - auf einem Desktop-Rechner. -Das Telekom Open Source Github Projekt https://github.com/telekom/pxt-ki-in-schulen gehört ebenfalls zum Calliope-Rennspiel-Projekt. Es stellt für Calliope Makecode "Bausteine" zur Nutzung eines künstlichen neuronalen Netzes auf einem Calliope Mini bereit (Implementierung einer schlanken Version künstlicher neuronaler Netze für den Calliope Mini). +Das Telekom Open Source Github Projekt https://github.com/telekom/pxt-ki-in-schulen gehört ebenfalls zum Calliope-Rennspiel-Projekt. Es stellt für Calliope Makecode "Bausteine" zur Nutzung eines künstlichen neuronalen Netzes auf einem Calliope mini bereit (Implementierung einer schlanken Version künstlicher neuronaler Netze für den Calliope mini). Projektziel ist es, die "Hirntransplantation" ;-) eines trainierten KI-Modells für die SuS über die Oberfläche auf https://makecode.calliope.cc nachvollziehbar zu machen; Stand März 2021 verhinderte jedoch ein Bug in Makecode diese Variante. diff --git a/README.md b/README.md index c0ff883..166464d 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ## Einleitung -Im Rahmen der __Deutsche Telekom IT@School Initiative__ engagieren sich Mitarbeiter der Deutschen Telekom ehrenamtlich darin, MINT-Bildung an Schulen zu fördern. Eine Gesamtübersicht aller Projekte dieser Gemeinschaft findet sich hier: https://digitale-schule.jetzt/ +Im Rahmen der __Deutsche Telekom DigITal@School Initiative__ engagieren sich Mitarbeiter der Deutschen Telekom ehrenamtlich darin, MINT-Bildung an Schulen zu fördern. Die Homepages dieser Gemeinschaft finden sich hier: https://digitale-schule.jetzt/ und https://robotik4kids.de Aus dieser Gemeinschaft heraus hat sich Ende 2019 das erste Projekt "__Autonomes Fahren mit dem Calliope mini__" entwickelt und wurde 2020-21 umgesetzt, um an Schulen speziell die Kompetenz für das Zukunftsthema __Künstliche Intelligenz__ zu stärken. @@ -53,11 +53,11 @@ Die folgenden Kanäle sind verfügbar für Diskussionen, Feedback und Unterstüt Zusätzlich stehen folgende Kommunikationskanäle zur Kontaktaufnahme mit dem Projektteam via Projektleiter Christian Schiller zur Verfügung: +* Email: mailto:christian.schiller@telekom.de * Github: https://www.github.com/c-a-schiller -* Twitter: https://www.twitter.com/c_a_schiller +* Fediverse: https://mastodon.online/@c_a_schiller * Instagram: https://www.instagram.com/c_a_schiller * LinkedIn: https://www.linkedin.com/in/christianschiller/ -* Email: mailto:christian.schiller@telekom.de ## Mitmachen @@ -79,8 +79,8 @@ Unser Engagement für Open Source bedeutet, dass wir allen interessierten Partei ## Lizenzierung -Copyright (c) 2021 Deutsche Telekom AG. -Copyright (c) 2021 Fraunhofer IAIS (für Open Roberta Beiträge) +Copyright (c) 2021-23 Deutsche Telekom AG. +Copyright (c) 2021-23 Fraunhofer IAIS (für Open Roberta Beiträge) The documentation is licensed under __[CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode.de)__.