Praxisbeispiel
QuickDraw mit PyTorch trainieren
Eine Quick-Draw-Erkennung muss nicht als grosses Sprachmodell gedacht werden. Ein kompaktes CNN in PyTorch reicht, wenn die Striche vorher in ein kleines Bild gerastert werden. Dieses Beispiel beschreibt eine konkrete Trainingspipeline fuer 345 Klassen und 96x96-Graustufenbilder.
1. Von Stroke-Daten zu 96x96-Bildern
Das Rohformat von Quick Draw speichert Zeichnungen als Strichfolgen.
Fuer einen CNN-Klassifikator werden diese Sequenzen normalisiert,
zentriert und in ein festes Raster gezeichnet. Dadurch wird jede
Zeichnung zu einem Tensor der Form (1, 96, 96): ein
Graustufenkanal, 96 Pixel Hoehe, 96 Pixel Breite.
Der Vorteil ist die konstante Eingabegroesse. Das Modell muss nicht mit variabel langen Sequenzen umgehen, sondern kann die Zeichnung wie ein kleines Bild behandeln.
2. Dataset-Loader: NPZ-Dateien pro Kategorie
Eine praktische PyTorch-Pipeline speichert die vorbereiteten Bilder pro
Label als NPZ-Datei. Jede Datei enthaelt ein Array images
mit der Form (N, H, W) und uint8-Pixelwerten.
Der Dataset-Loader wandelt diese Werte in Float-Tensoren zwischen 0 und
1 um und fuegt den Kanal hinzu.
class QuickDrawDataset(Dataset):
def __getitem__(self, i):
img_u8, label_idx = self._samples[i]
x = torch.from_numpy(img_u8.astype(np.float32) / 255.0)
return x.unsqueeze(0), label_idx
Im Training helfen moderate Augmentierungen: leichte Rotation, Skalierung, Verschiebung, Streckung, Linienbreiten-Jitter und wenig Rauschen. Das ist wichtig, weil echte Skizzen selten sauber und zentriert sind.
3. Modell: kleines ResNet-artiges CNN
Die Architektur kann bewusst klein bleiben. Ein Stem reduziert die Aufloesung, danach folgen vier Stufen mit Residual-Bloecken. Die Kanalzahl steigt von 32 ueber 64 und 128 auf 192. Am Ende stehen Global Average Pooling, Dropout und eine lineare Klassifikationsschicht fuer die Quick-Draw-Klassen.
model = QuickDrawCNN96(num_classes=345)
logits = model(torch.zeros(1, 1, 96, 96))
Residual-Verbindungen stabilisieren das Training, Batch Normalization haelt Aktivierungen kontrollierbar, und SiLU dient als glatte Aktivierungsfunktion. Das Ergebnis ist ein Modell, das fuer Echtzeit- Inferenz klein genug bleibt und trotzdem viele Klassen unterscheiden kann.
4. Training mit Cross-Entropy
Trainiert wird klassisch ueber Cross-Entropy: Das Modell erzeugt fuer jede Klasse einen Logit, der mit dem richtigen Label verglichen wird. AdamW, Weight Decay, Label Smoothing, Gradient Clipping und ein Cosine-Learning-Rate-Schedule sind robuste Defaults fuer diesen Aufgabentyp.
uv run python -m training.train \
--data data_img96 \
--labels labels.txt \
--epochs 30 \
--batch 256 \
--lr 1e-3 \
--out models/quickdraw_345cls.pt
Wichtig ist die Validierung nach jeder Epoche. Nur das beste Modell sollte als Checkpoint gespeichert werden, zusammen mit Labels, Bildgroesse und Validierungsgenauigkeit.
5. Export: ONNX heute, Edge morgen
Ein trainiertes PyTorch-Modell laesst sich fuer Deployment nach ONNX exportieren. Damit wird die Trainingsumgebung von der Inferenzumgebung getrennt. Fuer Mobile- und Edge-Neural-Models kann ein solcher Export spaeter der Zwischenschritt zu quantisierten, geraetenahen Runtimes wie LiteRT sein.
uv run python -m training.export \
--checkpoint models/quickdraw_345cls.pt \
--out models/quickdraw_345cls.onnx
Der zentrale Punkt: Ein kleines CNN mit fester Eingabe ist ein guter Kandidat fuer On-Device-Inferenz. Es braucht wenig Speicher, hat eine konstante Laufzeit und kann eine Skizze lokal klassifizieren, ohne dass jede Zeichnung zwingend an einen Server gesendet werden muss. Der Artikel Mobile Edge AI ordnet das in moderne mobile Deep-Network-Runtimes ein.
Warum das den RNN-vs-CNN-Vergleich erdet
RNNs sind stark, wenn die zeitliche Struktur der Striche wichtig ist. Dieses PyTorch-Beispiel zeigt den anderen Weg: Die Strichfolge wird in ein Bild ueberfuehrt, und ein CNN konzentriert sich auf sichtbare Form. Fuer ein reaktives Zeichenspiel ist das oft der pragmatischere Klassifikationsweg.
Mehr zur Einordnung steht im Vergleich RNN vs CNN. Die Datenbasis wird unter Quick-Draw-Datensatz erklaert.
Anders als diese PyTorch-Pipeline konzentriert sich Googles archiviertes QuickDraw-Component-Repo nicht auf das Training eines Klassifikators, sondern auf API-Zugriff, Canvas-Rendering und Animation vorhandener Doodle-Daten.