vistructum: Hakenkreuze in Minecraft automatisch erkennen

Ein Plugin für Minecraft-Server, das gebaute Hakenkreuze mit zwei neuronalen Netzen erkennt und dem Moderationsteam zur Prüfung meldet.

· 3 min · ML / Java / Minecraft

In Minecraft kann jeder alles bauen, auch verfassungsfeindliche Symbole: aus Wolle auf einem Dach, als Wasserrinne im Eis oder drei Blöcke tief in einen Berg gegraben. Moderationsteams erfahren davon meist nur durch Meldungen anderer Spieler. vistructum erkennt solche Symbole selbstständig. Das Plugin für Paper-Server findet gebaute Hakenkreuze mit zwei kleinen neuronalen Netzen und legt jeden Treffer dem Team als Fund zur Prüfung vor.

vistructum entscheidet dabei nicht über Spieler. Es kickt nicht, bannt nicht und setzt keine Bauten zurück. Die Bewertung jedes Funds bleibt beim Moderationsteam.

Zwei Prüfungen

Symbole entstehen auf zwei Arten: Jemand baut sie gerade, oder sie stehen bereits in der Welt. vistructum deckt beide Fälle mit einer eigenen Prüfung ab.

Der Live-Check zeichnet jeden gesetzten und abgebauten Block auf. In kurzen Abständen fasst er nahe beieinanderliegende Änderungen zu Clustern zusammen. Sobald ein Cluster eine Weile unverändert bleibt, entsteht daraus eine Maske: ein Raster von 64 × 64 Feldern mit den veränderten Blöcken. Diese Maske bewertet das Maskenmodell.

Der Fullscan liest die Region-Dateien direkt von der Festplatte, ohne Chunks auf dem Server zu laden. Er durchläuft die Welt in Kacheln von 256 × 256 Blöcken, einschließlich Nether und End. Für die Oberfläche berechnet er vier Kanäle: relative Höhe, Materialgrenzen, Helligkeit und Höhenstufen. Der Kanal für Höhenstufen erfasst auch Symbole, die aus demselben Material wie der Untergrund bestehen und nur eine Stufe erhöht gebaut sind. Diese Kanäle bewertet das Fullscan-Modell. Zusätzlich sucht der Fullscan im Volumen nach Blockgruppen, die in ihrer Umgebung selten sind, und übergibt deren Umriss an das Maskenmodell. So erkennt er auch Symbole unter der Erde.

Modelle und Qualitätssicherung

Beide Modelle sind kleine Faltungsnetze mit fünf Stufen. Nach dem Training werden sie nach ONNX exportiert und auf int8 quantisiert. Das Maskenmodell ist 371 KB groß, das Fullscan-Modell 2,5 MB. Sie laufen mit ONNX Runtime direkt im Serverprozess. Optional übernimmt ein eigener Sidecar-Dienst die Auswertung, mit dem lokalen Modell als Rückfallebene.

Ein Modell wird nur ausgeliefert, wenn es feste Qualitätsschwellen erfüllt:

GATES = {
    MASK.name: Gate(
        min_precision=0.95, max_fp_rate=0.001,
        min_recall=0.90, min_negatives=5000,
    ),
    FULLSCAN.name: Gate(
        min_precision=0.90, max_fp_rate=0.001,
        min_recall=0.60, min_negatives=5000,
    ),
}

Hinzu kommt eine Schwelle für vollständige Scans. Ein Fullscan bewertet Hunderttausende Fenster, deshalb darf das Maskenmodell höchstens 1 × 10⁻⁴ Fehlalarme pro Fenster erzeugen und das Fullscan-Modell höchstens 3 × 10⁻⁵. Schwellenwert, Mindeststimmen und Vorfilter stehen in den Metadaten der ONNX-Datei. Python und Java lesen dieselben Werte, und Paritätstests stellen sicher, dass beide Seiten identische Scores berechnen.

Auch der Trainingsdatensatz wird automatisch geprüft. Ein synthetischer Generator erzeugt Szenen mit Gelände, Gebäuden und Symbolen in allen Varianten, dazu ähnliche Formen als Gegenbeispiele. Ein Test in der Testsuite stellt sicher, dass sich Symbole und Gegenbeispiele nicht schon an einfachen Merkmalen wie Größe oder Füllgrad unterscheiden lassen. So lernt das Modell die Form des Symbols und keine Nebensächlichkeiten.

Ergebnisse

Jeder Fund speichert die Szene, die das Modell bewertet hat. Bestätigt oder verwirft das Team einen Fund, exportiert /vis export diese Entscheidung als Trainingsdaten. Die Modelle verbessern sich so mit jeder geprüften Welt.

Grundlage der aktuellen Modelle ist ein Scan des Servers 2b2t. Das Maskenmodell bf-mask-4 erkennt auf zurückgehaltenen Funden alle 305 bestätigten Symbole. Von 30 Funden, die das Team als Fehlalarm verworfen hat, meldet es nur einen.

Das Fullscan-Modell bf-scan-3 findet in einem vollständig geprüften Scan bei Schwelle 0,90 57 von 68 Symbolen bei 16 Fehlalarmen.

Effiziente Auswertung

Ein gedrehtes oder gespiegeltes Symbol bleibt dasselbe Symbol. Das Fullscan-Modell bewertet verdächtige Fenster deshalb in allen acht Lagen der Diedergruppe D4 und mittelt die Scores. Damit das nicht für jedes Fenster nötig ist, arbeitet es als Kaskade: Zuerst bewertet es nur die normale Ansicht. Die acht Ansichten folgen erst, wenn der Score über einem Vorfilter liegt. Der Vorfilter wird beim Kalibrieren so hoch gewählt, wie es ohne Verlust an Recall möglich ist.

Funktionsumfang

Version 1.0.0 entstand in sechs Tagen. Seitdem umfasst vistructum:

vistructum steht unter GPL-3.0 auf GitHub und auf Modrinth zur Verfügung.