KI-Bildforensik
Wann verwenden
Wenn ein Benutzer fragt: „Ist dieses Bild KI-generiert / bearbeitet / wurde es schon einmal verwendet?", oder wenn eine große Menge von Bildern (Liefernachweise, Bewertungsbilder, Materialbilder) überprüft werden muss.
Ein Befehl
python3 scripts/probe.py Bildpfad... # Nur Metadaten-Ebene
python3 scripts/probe.py --dir Verzeichnis --lib Bildbibliothek # Mit Duplikatsprüfung
python3 scripts/probe.py --dir Verzeichnis --model <Gewichtsverzeichnis> # Mit Pixel-Ebene, optional
Ausgabe in vier Stufen, sagen Sie NO-EVIDENCE nicht als „echtes Bild":
| Ergebnis | Bedeutung | Verwendung |
|---|---|---|
AI-SIGNED | AIGC-Standardkennung oder C2PA-Zertifikat vorhanden | Kann direkt akzeptiert werden, ist ein Selbstnachweis des Erstellers |
AI-LIKELY | Generator-Fingerabdruck oder hohe Punktzahl vom Pixelmodell | Nur als Hinweis, manuelle Überprüfung erforderlich |
DUPLICATE | pHash-Distanz ≤ 10 zu einem Bild in der Bibliothek | Kann direkt als Duplikat gewertet werden |
NO-EVIDENCE | Keine Ergebnisse in allen drei Ebenen | Nicht als „echt" bezeichnen, nur „keine Beweise" |
Tatsächliche Fähigkeiten der drei Ebenen (lokale Tests, nicht auf Basis von Versprechungen)
Erste Ebene: Metadaten – Am genauesten und günstigsten (Millisekunden, reines Python).
- In China konform erstellte Bilder enthalten die TC260 AIGC-implizite Kennung:
{"AIGC":{"Label":"1","ContentProducer":...,"ProduceID":...,"ReservedCode1":"...sm3...sm2..."}}. Diese befindet sich oft imeXIf-Chunk von PNGs in UserComment (0x9286), nicht in tEXt, daher übersehen Tools, die nur Textblöcke scannen, diese. - Aber ein erneutes Speichern entfernt sie: Beim Speichern als JPG oder PNG mit Pillow verschwinden die Felder. Diese Ebene erfasst daher nur Originalbilder und unverändert weitergeleitete Bilder, nicht bearbeitete oder Screenshots.
- Vorhandene Kameradaten (
Make/Model/DateTimeOriginal) deuten auf ein direktes Kamerabild hin; vollständig leere Felder weisen auf Social-Media-Bearbeitung oder Screenshots hin.
Zweite Ebene: Duplikatsprüfung – pHash + dHash, 20 ms pro Bild.
- Plattformkomprimierung, Skalierung, Screenshots: Distanz 0–2, nahezu unmerklich.
- 7,5 % Randbeschnitt: Distanz 8–24, teilweise übersehen.
- Minimale Distanz zwischen verschiedenen Bildern: 24, daher Schwelle von 10 sicher.
Dritte Ebene: Pixelmodell – Langsam und instabil, nur bei Bedarf einschalten.
- Community-Forensics ViT-S/384 (CVPR 2025): CPU 0,2–0,6 s pro Bild. Sehr effektiv für ältere Generatoren im Trainingsbereich (5/5 offizielle DALL·E 2-Testbilder erkannt), aber bei neuen Generatoren völlig wirkungslos (7 von 7 generierten Bildern von 2026 wurden als echt eingestuft, Konfidenz 0,0000–0,0019).
- Daher: „Treffer sind aussagekräftig, kein Treffer sagt nichts aus."
- Gewichte nicht im Repository, zuerst
OwensLab/commfor-model-384(HF, 87 MB) inmodels/commfor384/herunterladen.
Aufgabenverteilung der drei Modelle (nicht verwechseln)
| Skript | Modell | Einsatzbereich | Nicht geeignet für |
|---|---|---|---|
scripts/run_commfor.py | ViT-S/16 384 (CVPR'25, allgemeine KI-Bilderkennung) | Allgemeine KI-generierte Bilder, Standard --size 384 | Nicht mit 224er Gewichten verwenden, Tests zeigen nur 3/5 Treffer |
scripts/run_raiw.py | RAIW source-classify (10 Anbieter + unknown) | Bestimmung des Generators („Von wem generiert?") | Nicht als Diskriminator verwenden, Tests zeigen 17/17 Enthaltungen |
scripts/run_xai.py | EfficientNetV2-B0 5-Klassen (FF++ Gesichtsersetzung) | Nur Gesichtsbilder | Produktbilder/Liefernachweise, Tests zeigen 5/10 Fehlalarme |
python3 scripts/run_commfor.py Bild.jpg --size 384 --weights /pfad/model.safetensors
python3 scripts/run_raiw.py Bild.jpg --weights /pfad/multi-provider-source-v3.npz
python3 scripts/run_xai.py Gesicht.jpg --weights /pfad/ff_attribution.ckpt
Alle drei Skripte unterstützen --weights für Gewichte, --out für Ausgabedateien (sonst nur Konsole). Suchreihenfolge: --weights > Umgebungsvariable > scripts/../models/<Modellname>/. Gewichte nicht im Repository, selbst herunterladen:
| Modell | Quelle | Größe |
|---|---|---|
| commfor384 | HF OwensLab/commfor-model-384 | 87 MB |
| commfor224 | HF OwensLab/commfor-model-224 | 86 MB |
| RAIW | HF wiltodelta/raiw-source-classify | 2,03 GB |
| XAI-Deepfakes | Repository model/checkpoint/ff_attribution.ckpt | 70 MB |
Für Inlandsdownload: HF_ENDPOINT=https://hf-mirror.com; große Dateien mit aria2c -x16 -s16.
Lassen Sie den Benutzer nicht eigene Download-Befehle bauen, es gibt ein fertiges Skript (Standard: hf-mirror, aria2c multithread, Überprüfung von Größe und SHA256):
python3 scripts/fetch_weights.py --list # Liste + aktueller Status
python3 scripts/fetch_weights.py commfor384 # 87 MB, nur Pixel-Ebene ausreichend
python3 scripts/fetch_weights.py --all --jobs 16 # Alle vier, insgesamt 2,2 GB
python3 scripts/fetch_weights.py --all --check # Nur vorhandene Dateien prüfen
Skript unterstützt Fortsetzen; durch Proxy abgeschnittene Dateien werden von Größe + SHA256 abgefangen (reale Erfahrung: GitHub-Tarball fehlte 70 MB ckpt, Fehler erst beim Entpacken). Heruntergeladene Dateien landen in models/<Modellname>/, dem Standardpfad der drei run_*.py, daher kein --weights mehr nötig.
Wenn der Download fehlschlägt, genau angeben, wo es hakt – nicht mit „theoretisch möglich" die tatsächlichen Ergebnisse ersetzen.
Wie die Ausgabe aussieht (diesem Format folgen)
Tatsächliche Ausgabe von probe.py, je ein Beispiel für drei Stufen:
samples/ai/Handyfoto_Logistikstation.png -> AI-SIGNED
Grund: Datei enthält AIGC-Kennung (Label=1), Selbstnachweis des Erstellers
Metadaten: aigc_label | Format PNG 1024x1536
samples/variants/real01__p75.jpg -> DUPLICATE
Grund: pHash-Distanz zu real01.jpg = 0, Schwelle 10
Metadaten: Kein positives Merkmal | Format JPEG 1280x853
Duplikat: Nächstes real01.jpg Distanz 0 ≤10 als Duplikat
samples/real/real02.jpg -> NO-EVIDENCE
Grund: Keine Kennung in allen drei Ebenen; bedeutet nicht „echt", andere Beweise nötig
Metadaten: Kein positives Merkmal | Format JPEG 4500x3000
Bei der Wiedergabe an den Benutzer: Ergebnisstufe in Großbuchstaben originalgetreu angeben, nicht übersetzen (z. B. nicht „verdächtig KI"); die Grundzeile nicht umschreiben, sie ist die Entscheidungsbasis; hinter NO-EVIDENCE sofort „bedeutet nicht echt" einfügen, um Missverständnisse zu vermeiden.
Schwellenwerte zum Nachschlagen
| Kriterium | Schwelle | Begründung |
|---|---|---|
| pHash-Duplikat | ≤10 | Minimale Distanz zwischen verschiedenen Bildern 24, ausreichend Spielraum |
| Pixel p_fake | >0,6 gilt als Hinweis | 0,1–0,6 meist Rauschen |
| AIGC-Kennung | Vorhanden = Treffer | Standardfeld, keine Schwelle |
Drei Grenzen (müssen dem Benutzer mitgeteilt werden)
- Keine Kennung ≠ echtes Bild. Ein erneutes Speichern entfernt sie; Zwischenablage, WeChat-Weiterleitung, Screenshots entfernen sie alle.
- Pixelmodell kann nicht allein verurteilen. Bei unbekanntem Generator = Nulltreffer, Fehlalarme (z. B. iPhone-Kartonfoto von 384er Version als 0,896 eingestuft).
- Für Rückverfolgbarkeit sind technische Maßnahmen nötig: Speichern des ursprünglichen Byte-Hashs beim Hochladen, Geräte-Fingerabdruck, Vergleich mit Verlaufsbildern – zuverlässiger als jedes Erkennungsmodell.
Negativbeispiele
image-provenance(Client-Webtool): Schöne Oberfläche, vollständige Frequenzanalyse, aber Quellcode enthält keine AIGC/TC260-Schlüsselwörter, ignoriert chinesische Kennungen; Metadaten-Parsing hängt von CDN-geladenem exifr ab, offline nur Byte-Heuristik. Ein Bild mit vollständiger AIGC-Kennung zeigte „Keine KI-Quelle gefunden".XAI-Deepfakes: Gesichtsersetzungs-(FaceForensics++)-Mehrklassen-Klassifikator, erkennt nur Gesichter. Liefernachweise führen zu 5/10 Fehlalarmen als Face2Face/DeepFakes/NeuralTextures.LAID: Leichte Architektur (ShuffleNet 0,34M Parameter, CPU 20 ms), aber Gewichte auf Google Drive, in China nicht herunterladbar.