Flutter realtime object detection with Tensorflow Lite
An app made with Flutter and TensorFlow Lite for realtime object detection using model YOLO, SSD, MobileNet, PoseNet.
-
Realtime object detection on the live camera
-
Using Model: YOLOv2-Tiny, SSDMobileNet, MobileNet, PoseNet
-
Save image has been detected
-
MVVM architecture
- Install Packages
camera: get the streaming image buffers https://pub.dev/packages/camera tflite: run model TensorFlow Lite https://pub.dev/packages/tflite provider: state management https://pub.dev/packages/provider 2. Configure Project
- Android
android/app/build.gradle android { ... aaptOptions { noCompress 'tflite' noCompress 'lite' } ... } minSdkVersion 21 3. Load model
loadModel() async { Tflite.close(); await Tflite.loadModel( model: "assets/models/yolov2_tiny.tflite", //ssd_mobilenet.tflite, mobilenet_v1.tflite, posenet_mv1_checkpoints.tflite labels: "assets/models/yolov2_tiny.txt", //ssd_mobilenet.txt, mobilenet_v1.txt //numThreads: 1, // defaults to 1 //isAsset: true, // defaults: true, set to false to load resources outside assets //useGpuDelegate: false // defaults: false, use GPU delegate ); } 4. Run model
For Realtime Camera
//YOLOv2-Tiny Future<List<dynamic>?> runModelOnFrame(CameraImage image) async { var recognitions = await Tflite.detectObjectOnFrame( bytesList: image.planes.map((plane) { return plane.bytes; }).toList(), model: "YOLO", imageHeight: image.height, imageWidth: image.width, imageMean: 0, // defaults to 127.5 imageStd: 255.0, // defaults to 127.5 threshold: 0.2, // defaults to 0.1 numResultsPerClass: 1, ); return recognitions; } //SSDMobileNet Future<List<dynamic>?> runModelOnFrame(CameraImage image) async { var recognitions = await Tflite.detectObjectOnFrame( bytesList: image.planes.map((plane) { return plane.bytes; }).toList(), model: "SSDMobileNet", imageHeight: image.height, imageWidth: image.width, imageMean: 127.5, imageStd: 127.5, threshold: 0.4, numResultsPerClass: 1, ); return recognitions; } //MobileNet Future<List<dynamic>?> runModelOnFrame(CameraImage image) async { var recognitions = await Tflite.runModelOnFrame( bytesList: image.planes.map((plane) { return plane.bytes; }).toList(), imageHeight: image.height, imageWidth: image.width, numResults: 5 ); return recognitions; } //PoseNet Future<List<dynamic>?> runModelOnFrame(CameraImage image) async { var recognitions = await Tflite.runPoseNetOnFrame( bytesList: image.planes.map((plane) { return plane.bytes; }).toList(), imageHeight: image.height, imageWidth: image.width, numResults: 5 ); return recognitions; } For Image
Future<List<dynamic>?> runModelOnImage(File image) async { var recognitions = await Tflite.detectObjectOnImage( path: image.path, model: "YOLO", threshold: 0.3, imageMean: 0.0, imageStd: 127.5, numResultsPerClass: 1 ); return recognitions; } Output format: YOLO,SSDMobileNet [{ detectedClass: "dog", confidenceInClass: 0.989, rect: { x: 0.0, y: 0.0, w: 100.0, h: 100.0 } },...] MobileNet [{ index: 0, label: "WithMask", confidence: 0.989 },...] PoseNet [{ score: 0.5, keypoints: { 0: { x: 0.2, y: 0.12, part: nose, score: 0.803 }, 1: { x: 0.2, y: 0.1, part: leftEye, score: 0.8666 }, ... } },...] 5. Issue
* IOS Downgrading TensorFlowLiteC to 2.2.0 Downgrade your TensorFlowLiteC in /ios/Podfile.lock to 2.2.0 run pod install in your /ios folder 6. Source code
please checkout repo github https://github.com/hiennguyen92/flutter_realtime_object_detection - Demo Illustration: https://www.youtube.com/watch?v=__i7PRmz5kY&ab_channel=HienNguyen
- Image
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |





