flutter_liveness

Model: MobileNetV2 Dataset: Spoof/Real License: MIT

Lightweight on-device face liveness detection for Flutter, powered by MobileNetV2 from open liveness research.

✨ Features

  • On-device liveness detection β€” no server required
  • Ships with pre-trained MobileNetV2 model
  • Uses TensorFlow Lite β€” optimized for real-time
  • Simple API β€” plug & play
  • Blur & clarity detector (Laplacian filter)

🧠 Model Information

This package uses a pre-trained MobileNetV2 face liveness model trained as described in:

Using MobileNetV2 (Zawar, et al., 2023)

From the open-source project: biometric-technologies/liveness-detection-model

Model licensed under MIT, included with attribution.

Class meaning:

  • 0 = real
  • 1 = spoof

πŸš€ Usage

Initialize

import 'package:flutter_liveness/flutter_liveness.dart';
import 'package:image/image.dart' as imglib;

late final FlutterLiveness liveness;

Future<void> initLiveness() async {
  liveness = await FlutterLiveness.create();
}

Analyze a face image

/// The model input shape is (1, 224, 224, 3)
/// - 1: batch size (single image)
/// - 224: image height
/// - 224: image width
/// - 3: RGB color channels
/// So we feed a 224x224 RGB face image into the model.
Future<void> check(Uint8List faceBytes) async {
  final img = imglib.decodeImage(faceBytes);
  if (img == null) throw Exception("Invalid image");

  final result = await liveness.analyze(img);

  print("Live: ${result.isLive}");
  print("Score (P(spoof)): ${result.score}");
  print("Laplacian: ${result.laplacian}");
  print("Inference time: ${result.duration.inMilliseconds} ms");
}

Cleanup

@override
void dispose() {
  liveness.dispose();
  super.dispose();
}

πŸ“Š Output Example

Live: true
Score (P(spoof)): 0.023
Clarity (laplacian): 10239.0
Inference time: 66 ms

βš™οΈ Settings

You can tune thresholds:

final liveness = await FlutterLiveness.create(
  options: LivenessOptions(
    threshold: 0.5,
    laplacianThreshold: 6000,
  ),
);

❗ Usage Notes

  • Feed cropped face images (not full camera frames)
  • Calls are fast (~60–70ms on modern devices)
  • Throttle analysis: ~3–5 FPS recommended
  • Do not consider this as the only security mechanism for KYC/financial apps β€” use it as one signal in a trust pipeline

πŸ“± Integration Tips

  • Use camera plugin to stream frames
  • Detect faces with MLKit or any detector
  • Crop β†’ send to liveness.analyze()
  • Combine with:
    • Face presence
    • Eye blink / movement (optional future enhancement)
    • Anti-tampering / screen detection

πŸ” Disclaimer

This library provides liveness estimation, not identity verification. Use responsibly and evaluate for your use-case security requirements.

🀝 Acknowledgements

  • TensorFlow Lite team
  • Biometric Technologies OÜ for the model & research
  • Flutter community

Libraries

flutter_liveness