Im Rahmen der Google I/O stellt Google ein neues Beispielprojekt zur Verfügung, das einen Arduino Nano BLE mit Chrome verbindet und die Mikrocontroller-Variante von TensorFlow Lite zur Gestenerkennung verwendet.
von Tam HANNA
Worum geht es hier?
Die Erstellung der AI-Modelle macht bei Embedded-Systemen mit Funktionen der künstlichen Intelligenz oft den Gutteil des Aufwands aus. Mit TensorFlow Lite for Microcontrollers (siehe auch https://www.tensorflow.org/lite/microcontrollers) bietet Google seit einiger Zeit eine Variante des hauseigenen AI-Frameworks an, die für 32bit-Mikrocontroller vorgesehen ist. Für AI-Modelle zuständige Codierer (Verwendungsbezeichnung meist Data Scientist) können so einen Gutteil ihrer Kenntnisse auch am Mikrocontroller einsetzen.
Lösung in mehreren Teilen
Das vorliegende Projektbeispiel enthält einerseits eine im Browser lebende Training-Applikation, die (siehe Screenshot weiter oben) per Bluetooth Web API Kontakt zum Arduino Nano aufnimmt. Die Web Bluetooth API ist dabei eine vor Allem in Chrome implementierte API, die Web-Applikationen den Zugriff auf Bluetooth und Bluetooth LE-Geräte ermöglicht.
Bildquelle ist hier der allgemein empfehlenswerte Dienst caniuse, der – siehe auch https://caniuse.com/web-bluetooth – darüber informiert, in welchen Browsern bestimmte APIs zur Verfügung stehen
Die Web-Applikation beschränkt sich dabei auf das Entgegennehmen und Weiterleiten der Informationen. Der Gutteil der AI-Aufgaben findet sich in einer Pythondatei (tiny-motion-trainer/blob/main/backend/main.py), die dank des Flask-Frameworks REST-Anfragen verarbeiten kann:
1 |
|
2 |
app = Flask(__name__) |
3 |
app.config['UPLOAD_FOLDER'] = 'uploads/' |
4 |
CORS(app, resources={r"/*": {"origins": "*"}}) |
Interessant ist auch der für die Datenübertragung vorgesehene Algorithmus: die Kommunikation erfolgt ausschließlich über BLE, das Protokoll sieht keine Unterstützung für die im normalen Bluetooth vorgesehenen OBEX-Übertragungen vor. Google ”emuliert” stattdessen unter Nutzung zweier Charakteristiken ein hauseigenes Übertragunssystem, das sich auch in eigenen Anwendungen nutzen lassen sollte:
1 |
#include "ble_file_transfer.h" |
Für das eigentliche Vorhalten der Modelldaten stellt Google eine weitere dedizierte Klasse zur Verfügung, die im Rahmen des Empfangs eines neuen Modells nach folgendem Schema aktualisiert wird:
1 |
inline void updateFileTransfer() { |
2 |
ble_file_transfer::updateBLEFileTransfer(); |
3 |
if (newModelFileData != nullptr) |
4 |
{
|
5 |
Serial.println("reloading model"); |
6 |
model_tester::loadModel(newModelFileData); |
7 |
. . . |
8 |
setState(INFERENCE); |
9 |
}
|
10 |
}
|
Die eigentliche Datenweitergabe erfolgt im Rahmen der Funktion updateIMU, die bei Aktualisierungen die update()-Funktion aufruft:
1 |
inline void updateIMU() { . . . |
2 |
|
3 |
while(data_provider::dataAvailable()){ |
4 |
data_provider::update(buffer, useMagnetometer); |
5 |
|
6 |
if(currentState == INFERENCE || currentState == INFERENCE_AND_DATA_PROVIDER){ |
7 |
if(model_tester::isModelLoaded){ |
8 |
model_tester::update(buffer); |
9 |
}
|
10 |
}
|
Zu guter Letzt noch der Code für die Übertragung von IMU-Informationen in Richtung der Webseite:
1 |
if(currentState == IMU_DATA_PROVIDER || currentState == INFERENCE_AND_DATA_PROVIDER){ |
2 |
// provide data to IMU trainer
|
3 |
dataProviderTxChar.writeValue(buffer, bufferSize * FLOAT_BYTE_SIZE); |
4 |
}
|
5 |
|
6 |
}
|
7 |
}
|
Lohnt es sich?
Außer Frage steht, dass die hier demonstrierte Aufgabe nur geringen praktischen bzw. kommerziellen Nutzwert hat. Dies gilt allerdings nicht für die Kombination aus TensorFlow Lite und der Web Bluetooth API – während ersteres auch für Bildklassifizierungsaufgaben einsetzbar ist, ermöglicht zweitere die Interaktion mit Hardware ohne plattformspezifische Applikationen.