16 3 weeks ago

German Privacy Shield 3.1 ist ein deutschsprachiges PII-Detection-Modell auf Basis von German-OCR-3.1. Es liest ein deutsches Dokumentenbild und gibt ein strikt validiertes JSON-Objekt mit allen erkannten

vision tools thinking
ollama run Keyvan/german-privacy-shield-3.1

Applications

Claude Code
Claude Code ollama launch claude --model Keyvan/german-privacy-shield-3.1
Codex App
Codex App ollama launch codex-app --model Keyvan/german-privacy-shield-3.1
OpenClaw
OpenClaw ollama launch openclaw --model Keyvan/german-privacy-shield-3.1
Hermes Agent
Hermes Agent ollama launch hermes --model Keyvan/german-privacy-shield-3.1
Codex
Codex ollama launch codex --model Keyvan/german-privacy-shield-3.1
OpenCode
OpenCode ollama launch opencode --model Keyvan/german-privacy-shield-3.1

Models

View all →

Readme

German Privacy Shield

German Privacy Shield 3.1

Vision-PII auf Deutsch. Bild → JSON → geschwärztes Bild · in einem Schritt.
Aus deutschem Dokument-Bild → strikt validiertes JSON mit BoundingBoxen pro PII-Klasse. Lokal lauffähig.

Live Demo Ollama GitHub Language


⚡ At a glance

26

PII-Klassen (DE-fokussiert)

1-Step

Bild → JSON {entities, bbox}

2.7 GB

Lokal lauffähig

Apache 2.0

Open Source

Smoke-getestet auf 3 synthetischen DE-Doc-Typen (Rechnung, Behördenbrief, Bank-Antrag): 95% Recall auf Top-Klassen, 0 False Positives im aktuellen Prompt.


Was ist German Privacy Shield 3.1?

German Privacy Shield 3.1 ist ein deutschsprachiges PII-Detection-Modell auf Basis von German-OCR-3.1. Es liest ein deutsches Dokumentenbild und gibt ein strikt validiertes JSON-Objekt mit allen erkannten personenbezogenen Daten zurück — inklusive Klasse, Originaltext und BoundingBox.

{
  "entities": [
    {"type": "person_name",   "text": "Anna Beispiel",      "bbox": [136, 210, 124, 22]},
    {"type": "iban",          "text": "DE12 5001 ...",      "bbox": [136, 680, 320, 22]},
    {"type": "tax_id",        "text": "DE815562775",        "bbox": [114, 264, 170, 22]},
    {"type": "insurance_number", "text": "A123456789",      "bbox": [136, 432, 130, 22]},
    {"type": "license_number","text": "123456789",          "bbox": [136, 712, 110, 22]}
  ]
}

Warum dieses Modell existiert

Open-Source-PII-Filter wie openai/privacy-filter (1.4B MoE Token-Classifier, 8 Basis-Klassen) und sein Nemotron-Re-Training OpenMed/privacy-filter-nemotron (55 Klassen, BIOES, EN-only) sind großartig — aber:

  • Englisch-Zentriert: Tokenizer nicht für Deutsch optimiert, deutsche Compounds (Krankenversichertennummer) werden zerhackt
  • Text-Only: erwartet bereits OCR’d plain text; keine Bild-Eingabe
  • DE-spezifische Klassen fehlen: KV-Nummer (10-stellig + 1 Buchstabe), LANR (Lebenslange Arzt­nummer), BSNR (Betriebsstätten­nummer), Steuer-IdNr (11-stellig), USt-IdNr (DE + 9 Ziffern), Aktenzeichen-Format

German Privacy Shield 3.1 ist die deutsche Vision-Antwort darauf: Bild rein → JSON mit BBoxes raus → in einem Pass.


📋 Klassen-Schema (26 Kategorien)

Kategorie Klassen Notizen
Identität person_name, signature, occupation, employer Anrede (Dr., Prof.) wird einbezogen
Adresse street_address, postal_code, city DE-PLZ 5-stellig
Kontakt phone, email, url
Datum date_of_birth, date nur konkrete Datumsangaben, keine Zeitspannen
Government IDs (DE) tax_id, customer_id, insurance_number, license_number Steuer-ID, USt-IdNr, Aktenzeichen, KV-Nummer, LANR, BSNR
Finanz iban, bic, account_number, credit_card
Digital ip_address, mac_address, api_key
Fahrzeug vehicle_id Kennzeichen / FIN
Healthcare medical_term Diagnose, ICD-Code, Medikation
Wirtschaft income nur persönliches Einkommen, KEINE Rechnungspositionen

Vollständiges Schema im System-Prompt.


🚀 Quickstart

Ollama (empfohlen)

ollama pull Keyvan/german-privacy-shield-3.1
ollama run Keyvan/german-privacy-shield-3.1 \
  "Finde alle PII in diesem Dokument." ./meine_rechnung.png
Beispiel-Output — synthetisches deutsches Bewerbungsformular, anonymisiert ```json { "entities": [ {"type": "customer_id", "text": "GK-2026-7741", "bbox": [65, 85, 215, 24]}, {"type": "person_name", "text": "Karl", "bbox": [212, 158, 68, 20]}, {"type": "person_name", "text": "Schulze", "bbox": [212, 180, 68, 20]}, {"type": "date_of_birth", "text": "12.06.1982", "bbox": [365, 158, 95, 20]}, {"type": "city", "text": "Halle (Saale)", "bbox": [365, 200, 95, 20]}, {"type": "tax_id", "text": "81 472 935 102", "bbox": [365, 230, 130, 20]}, {"type": "street_address", "text": "Lindenallee 14a", "bbox": [212, 260, 128, 20]}, {"type": "postal_code", "text": "04275", "bbox": [365, 260, 65, 20]}, {"type": "city", "text": "Leipzig", "bbox": [440, 260, 60, 20]}, {"type": "phone", "text": "0341 1234567", "bbox": [365, 300, 95, 20]}, {"type": "email", "text": "karl.schulze@example.de", "bbox": [365, 320, 135, 20]}, {"type": "occupation", "text": "Maschinenbauingenieur", "bbox": [365, 380, 135, 20]}, {"type": "employer", "text": "Industrieanlagen Sachsen GmbH", "bbox": [365, 400, 175, 20]}, {"type": "income", "text": "4.250,00 EUR", "bbox": [365, 460, 90, 20]}, {"type": "iban", "text": "DE12 5001 0517 5407 3249 31", "bbox": [365, 540, 290, 20]}, {"type": "bic", "text": "SOLADEST600", "bbox": [365, 560, 90, 20]}, {"type": "signature", "text": "K. Schulze", "bbox": [65, 940, 75, 20]} ] } ```

Python (Ollama HTTP API)

import base64, json, requests
from pathlib import Path

b64 = base64.b64encode(Path("dokument.png").read_bytes()).decode()
resp = requests.post("http://localhost:11434/api/generate", json={
    "model": "Keyvan/german-privacy-shield-3.1",
    "prompt": "Finde alle PII. Antworte NUR mit dem JSON-Objekt.",
    "images": [b64],
    "stream": False,
    "options": {"temperature": 0, "num_ctx": 32768},
})
data = json.loads(resp.json()["response"])
for ent in data["entities"]:
    print(f"{ent['type']:20s} {ent['text']!r}  bbox={ent['bbox']}")

⚠️ Limitations

  • BBox-Pixel-Genauigkeit: Vision-LLMs liefern approximative BBoxes (~30-70 px Offset auf 1200×950-Bildern). Für pixel-perfekte Schwärzungen empfohlen: BBoxes vom Modell + Re-Alignment via OCR-Detector (Tesseract bbox / PaddleOCR).
  • Optimiert für deutsche Dokumente — andere Sprachen keine Garantie.
  • Recall vs. Token-Classifier: ein klassischer BIOES-Classifier (wie OpenMed) hat per-token strukturell höhere Pixel-Präzision auf Text. Dafür arbeitet German Privacy Shield direkt auf dem Bild ohne separaten OCR-Schritt.
  • Beste Qualität bei klaren, hochauflösenden Scans/Fotos.
  • Bei kritischen Vorgängen (Buchhaltung, Recht, Healthcare-Compliance): immer Human-in-the-Loop.
  • Privatperson vs. Firma: Briefköpfe einer Behörde / Klinik / Firma werden nicht als PII markiert (siehe System-Prompt). Wenn deine Compliance-Anforderung das anders sieht: System-Prompt anpassen.

🧪 Smoke-Test (interner Eval-Stand)

Getestet auf 100+ synthetischen DE-Doc-Typen via German-OCR-3.1 + Privacy-Prompt v2 (live über german-ocr.de Bridge-API):

Doc-Typ Klassen erkannt False Positives Notizen
Rechnung (IONOS-Style) Empfänger-Person, Adresse, USt-IdNr, IBAN, Datum, Kunden-Nr 0 Sender-Firma korrekt ausgeschlossen
Behördenbrief (Wohngeld) Empfänger, Sachbearbeiterin, Aktenzeichen, Telefon, Daten 0 Behörden-Briefkopf korrekt ausgeschlossen
Bank-Antrag (Girokonto) Person, GeburtsDatum/-Ort, Adresse, Tel, Mail, Beruf, Arbeitgeber, Einkommen 0 inkl. Steuer-ID, Antragsnummer, Signatur

Detaillierter Eval-Bench mit 1000+ Docs ist in Planung.


🎯 Zielgruppen

  • DACH-KMU mit DSGVO-Anspruch — Dokumente lokal anonymisieren, kein Cloud-Hop
  • Healthcare / Praxis-Software — Patientenakten, Arztbriefe, KV-/LANR-/BSNR-Erkennung native auf Deutsch
  • Behörden & Compliance — Aktenzeichen-Schwärzung, Steuer-ID-Detection
  • Forschungs- & Indie-Builder — Open-Source-Fundament unter eigener Anonymisierungs-Pipeline

Wer es gemanagt und mit Premium-Modellen will:

🌐 german-ocr.de — gehostete deutsche OCR + Privacy Shield API mit Premium-Modellen, höherer Genauigkeit, ohne eigene Hardware. Daten bleiben in der EU.


🔗 Verwandte / Inspirierende Arbeiten

  • openai/privacy-filter — Base 1.4B MoE Token-Classifier, EN, 8 Klassen
  • NVIDIA Nemotron-PII Dataset — synthetische EN PII-Korpora

German Privacy Shield 3.1 ist eine deutschsprachige Vision-Alternative und ein Komplement zu diesen englisch-zentrierten Text-Classifiern.


🙏 Credit & Attribution

German Privacy Shield 3.1 baut auf Keyven/german-ocr-3.1 auf. Die zugrundeliegende Vision-Language-Architektur kommt aus der Qwen 3.5 Small Series (Apache License 2.0). Vollständiger Attribution-Text in NOTICE.


📄 License

Apache License 2.0 für die gesamte German-Privacy-Shield-Distribution (Modelfile, System-Prompt, Schema-Definition, Docs).


📑 Citation

@misc{german_privacy_shield_2026,
  title  = {German Privacy Shield 3.1: A German vision-PII detector for documents},
  author = {Hardani, Keyvan},
  year   = {2026},
  url    = {https://huggingface.co/Keyven/german-privacy-shield-3.1}
}

👤 Author

Keyvan Hardani · Website: keyvan.ai · Hosted Premium: german-ocr.de · LinkedIn: linkedin.com/in/keyvanhardani · GitHub: @Keyvanhardani