OCR trainieren
Ehrlich eingeordnet: das 1-NN ist das persistente,
mitgelieferte Modell (16×16-Vorlage + Naechster-Nachbar) — es sammelt Training an
und laesst sich sichern, ist aber die schwaechste der drei OCR-Stufen. Besser: das
lernende Netz (Reiter „Lernendes Netz“, generalisiert staerker) und — fuer
echte Scans am besten — Tesseract ueber den MCP-Server (ocr_folder) bzw.
das GPU-Sequenzmodell (gpu_ocr).
Datei: /data/ocr/ocr-modell.json
Erkennt standardmäßig mit dem lernenden Netz, sobald es bereit ist (es wird beim Start automatisch aus der 1-NN-Basis abgeleitet); bis dahin mit dem 1-NN-Modell. Der Reiter „Lernendes Netz“ hat zusätzlich einen eigenen Knopf.
Ein gescanntes PDF (Seitenbilder) hochladen und ein neues PDF mit einer unsichtbaren, durchsuchbaren Textebene erzeugen — das Bild bleibt sichtbar, der Text wird such-/kopierbar. Woher kommt der Text?
Die Modelle oben laufen auf der CPU (Kern, Zero-NuGet). Wer die Sequenz-OCR
(CRNN) trainieren UND erkennen auf einer GPU beschleunigen will (AMD/Intel/Nvidia,
Windows/Linux), fügt das optionale Paket Kuonen.PDFTools.Accel (ILGPU) hinzu — der
Kern referenziert es NICHT, und derselbe Code läuft ohne GPU auf dem CPU-Gerät
(Docker/VM/Mac). Vollständige Anleitung: tools/Kuonen.PDFTools.Accel/README.md.
using var ctx = GpuContext.Create(); // GPU falls da, sonst CPU-Gerät (immer optional)
// Frisches GPU-Modell + Training aus einer (vom Aufrufer gelieferten) Schrift:
var model = GpuCrnnLineModel.CreateNew(
alphabet, inputHeight: 24, filters: 8, kernelHeight: 5, kernelWidth: 5,
strideHeight: 2, strideWidth: 2, hiddenDim: 32);
var samples = GpuCrnnTrainer.GenerateSamples(
font, alphabet, count: 5000, minLength: 3, maxLength: 20,
pixelSize: 30, targetHeight: 24, degrade: true, seed: 1);
GpuCrnnTrainer.Train(ctx, model, samples, epochs: 30, learningRate: 0.02f);
// Eine Seite erkennen (Segmentierung + Stapel-Erkennung):
string[] zeilen = GpuLineOcr.RecognizeLines(ctx, model, seitenbild, alphabet, targetHeight: 24);
// Sichern/Laden: das Modell IST sein Parametersatz.
float[] gewichte = model.GetParameters(); // ... reloaded.SetParameters(gewichte);