/projekte/flutter-nsfw-scanner/Open Source/Live/11/2025 → laufend/Autor des Plugins

nsfw_detect (Flutter-Plugin)

Flutter-Plugin, das Bilder, Videos und Kameraframes auf dem Gerät klassifiziert — ohne dass Medien den Host verlassen.

Veröffentlicht auf pub.dev als nsfw_detect, aktuell Version 2.7.

Keine Web-Demo — Fotobibliothek und Kamera brauchen ein echtes Gerät. Die Beispiel-App im Repository deckt alle Abläufe ab.

FlutterDartSwiftKotlinCore MLTensorFlow LiteONNX RuntimeTensorFlow.jsPlatform Channelspub.dev
project dossier

Snapshot

flutter-nsfw-scanner

Autor des Plugins

category

Open Source

status

LIVE

stack

10 tech

code

45.077 Zeilen
FlutterDartSwiftKotlinCore MLTensorFlow LiteONNX Runtime
Source öffnen
01

Zahlen zum Projekt

Code45.000Zeilen in 213 Dateien
Klassifizierer4nachladbar, keiner gebundelt
Fertige Widgets19Galerie, Kamera, Gate …
Plattformen3iOS, Android, Web
Version2.7auf pub.dev
02

Story

Problem

Content-Prüfung in Mobile-Apps setzt meist einen Cloud-Upload voraus; für datenschutzsensible Anwendungen keine Option.

Lösung

Flutter-Plugin mit TensorFlow-Lite-Inferenz direkt auf dem Gerät, angebunden über eine native Plugin-Bridge für Android und iOS.

Learnings

Plugin-Bridge und Modellgröße waren aufwendiger als die Inferenz selbst.

03

Key Features

features.md
  • →TensorFlow-Lite-Inferenz auf dem Gerät, ohne Server
  • →Native Plugin-Bridge für Android und iOS
  • →Bilder verlassen das Gerät nicht
  • →Open Source auf GitHub
04

Über das Projekt

README.md

Flutter-Package für Inhaltsprüfung ohne Cloud-Upload. Die Klassifikation läuft über TensorFlow Lite lokal auf dem Gerät, angebunden über eine native Plugin-Bridge für Android und iOS. Als Open Source auf GitHub veröffentlicht.

05

Meine Rolle

rolle
rolle:Autor des Plugins
  • Plugin-Architektur über drei Plattformen mit einer gemeinsamen Dart-API
  • Native Anbindung: Core ML auf iOS, TensorFlow Lite auf Android
  • Modell-Nachladen mit Prüfsumme, Mirror-Option und Vorwärmen
  • Ensemble-Logik inklusive Enthaltung im Graubereich
  • 19 einsatzfertige Widgets und 15 Dokumentationskapitel
  • Veröffentlichung und Versionspflege auf pub.dev
06

Architektur

architecture.md

Ein Plugin, drei Plattformimplementierungen hinter einer Dart-API.

  • Dart-Schicht (lib/src/api/) — die öffentliche Oberfläche: Scan-Modi, Konfiguration, Ergebnisobjekte, Modellverwaltung, Ensemble-Strategien, Kamerasitzungen. Hier liegt auch der wahrnehmungsbasierte Cache, damit dasselbe Bild nicht zweimal durch das Modell geht.
  • Plattformkanäle (lib/src/platform/) — die Brücke nach unten. iOS rechnet mit Core ML, Android mit TensorFlow Lite, Web lädt nsfwjs (TensorFlow.js) und NudeNet über onnxruntime-web bei Bedarf vom CDN.
  • Widgets (lib/src/widgets/) — 19 fertige Bausteine: Galerieansicht, Kamera-HUD mit Overlay, Moderations-Gate, Berechtigungsansicht, Ergebnis-Detail, Redaction-Ansicht.

Die Modelle sind nicht im Binary. Vier Klassifizierer stehen zur Wahl und werden beim ersten Gebrauch nachgeladen — wahlweise vorab über downloadIfMissing, mit SHA-256-Prüfung des Archivs und optional über einen eigenen Mirror. Ein Klassifizierer allein reicht meist; für höhere Genauigkeit lassen sich mehrere über MajorityEnsemble oder WeightedEnsemble kombinieren.

Videos brauchen keine eigene API: scanFile erkennt den Container und tastet Frames in einstellbarem Abstand ab.

Scan-API

scanFile, scanBytes, pickAndScan, scanAsset, startScan über die Fotobibliothek und startCameraScan — alle mit derselben Ergebnisform.

Dart

Modellverwaltung

Vier Klassifizierer, Nachladen bei Bedarf, SHA-256-Prüfung, eigener Mirror, Vorwärmen beim Splash.

DartCore MLTensorFlow Lite

Ensemble-Strategien

MajorityEnsemble bildet den Konsens und enthält sich im Graubereich um 0,5; WeightedEnsemble mittelt gewichtet je Kategorie.

Dart

Kamera-Scanner

Framestream mit Live-Wertung, Kamera-HUD, Erkennungs-Overlay und Sitzungsverwaltung.

FlutterSwiftKotlin

Bibliotheks-Durchlauf

Hintergrunddurchlauf über die Fotobibliothek mit Fortschritt, Entscheidungsspeicher und Galerie-Filter.

DartSwift

Widget-Sammlung

19 Widgets von der Galerie über das Moderations-Gate bis zur Berechtigungsansicht — damit ein Integrator nicht bei null anfängt.

Flutter

Web-Pfad

Einmal-Scans im Browser über nsfwjs und NudeNet via onnxruntime-web, Laufzeiten werden bei Bedarf geladen — ohne Änderung an der index.html.

TensorFlow.jsONNX Runtime
07

Herausforderungen

Fehlende iOS-Berechtigungstexte beenden den Prozess
Problem

Auf iOS bricht der Prozess mit SIGABRT ab, sobald das System einen fehlenden Usage-String liest — es gibt keinen abfangbaren Laufzeitfehler. Auch der Picker ist nicht ausgenommen: PHPickerViewController braucht keine Freigabe, das Plugin löst aber PHAsset-Bezeichner auf, und dafür verlangt iOS NSPhotoLibraryUsageDescription.

Lösung

Die Plattform-Einrichtung steht in der Dokumentation vor dem ersten Beispiel, nicht im Anhang, mit einer Tabelle, welche API welchen Schlüssel braucht. Dazu eine eigene Berechtigungsansicht als Widget und ein Kapitel platform-gotchas.md.

Ein unsicheres Modell darf nicht das Urteil kippen
Problem

Mehrere Klassifizierer erhöhen die Genauigkeit — aber wenn einer im Graubereich knapp über die Schwelle rutscht, entscheidet ein Zufall über das Ergebnis.

Lösung

MajorityEnsemble enthält sich bei Werten um 0,45 bis 0,55, statt eine Stimme abzugeben. Ein einzelnes unsicheres Modell kann das Gesamturteil damit nicht drehen; die Kosten steigen linear mit der Modellzahl, deshalb lässt sich vorwärmen.

Modelle im Binary wären zu groß
Problem

Die Klassifizierer liegen im zweistelligen Megabyte-Bereich. Vier davon fest einzubauen hätte jede App aufgebläht, die nur einen davon braucht.

Lösung

Nichts wird gebundelt. Jedes Modell lädt beim ersten Gebrauch nach, mit Fortschrittsmeldung, optionaler Vorabladung und SHA-256-Prüfung des Archivs. Wer aus regulatorischen Gründen nicht von außen laden darf, setzt einen eigenen Mirror.

08

Technologie-Entscheidungen

Flutter

UI-SDK von Google für cross-platform Apps (iOS, Android, Web, Desktop).

framework
Dart

Optimierte Client-Sprache für Flutter, mit AOT/JIT-Compile.

language
Swift

Projektabhängigkeit

Kotlin

Projektabhängigkeit

Core ML

Projektabhängigkeit

TensorFlow Lite

Projektabhängigkeit

ONNX Runtime

Projektabhängigkeit

TensorFlow.js

Projektabhängigkeit

Platform Channels

Projektabhängigkeit

pub.dev

Projektabhängigkeit

09

Codebasis

codebase
Codezeilen45.077
Dateien213
Commits145
Erster Commit05/2026
Letzter Commit08/2026
Sprachen
  • Dart61%
  • Swift20%
  • Kotlin18%
  • Python1%
10

Repository

12

Verwandte Projekte