Flutter TFLite Error: "metal_delegate.h" File Not Found
Solution 1
Downgrading TensorFlowLiteC to 2.2.0 worked for me
- Downgrade your TensorFlowLiteC in /ios/Podfile.lock to 2.2.0
- run pod install in your /ios folder
See https://github.com/shaqian/flutter_tflite/issues/139#issuecomment-668252599
Solution 2
In your Podfile add this to the end:
pod 'TensorFlowLiteC', '2.2.0'
Delete Podfile.lock
Delete Pods folder
Delete .symlinks folder
flutter run
Solution 3
I solved mine by just downgrading from TensorFlowLiteC 2.5.0 to 2.2.0
XtremeDevX
I'm XtremeDevX, professional app developer, and I code Dart, Swift, And Python. I am currently learning Tensorflow and Keras for advanced Machine Learning.
Updated on December 22, 2022Comments
-
XtremeDevX 5 monthsI am trying to use the Tensorflow Lite ML Model with my project, and, unfortunately, I face an error while running my project:
↳ ** BUILD FAILED ** Xcode's output: ↳ /Users/tejasravishankar/Developer/flutter/.pub-cache/hosted/pub.dartlang.org/tflite-1.1.1/ios/Classes/TflitePlugin.mm:21:9: fatal error: 'metal_delegate.h' file not found #import "metal_delegate.h" ^~~~~~~~~~~~~~~~~~ 1 error generated. note: Using new build system note: Building targets in parallel note: Planning build note: Constructing build description Could not build the application for the simulator. Error launching application on iPhone 11 Pro Max.I have tried
flutter clean, and have tried removing thePodfileandPodfile.lockfrom theiosdirectory, though that didn't change anything.Here is my code:
import 'dart:io'; import 'package:flutter/material.dart'; import 'package:tflite/tflite.dart'; import 'package:image_picker/image_picker.dart'; void main() => runApp(TensorflowApp()); const String pet = 'Pet Recognizer'; class TensorflowApp extends StatefulWidget { @override _TensorflowAppState createState() => _TensorflowAppState(); } class _TensorflowAppState extends State<TensorflowApp> { String _model = pet; File _image; double _imageWidth; double _imageHeight; // ignore: unused_field bool _isLoading = false; List _predictions; _selectFromImagePicker() async { PickedFile _pickedImage = await ImagePicker().getImage(source: ImageSource.gallery); File _pickedImageFile = _pickedFileFormatter(_pickedImage); if (_pickedImage == null) { return; } else { setState(() { _isLoading = true; }); _predictImage(_pickedImageFile); } } _predictImage(File image) async { await _petRecognizerV1(image); FileImage(image).resolve(ImageConfiguration()).addListener( ImageStreamListener( (ImageInfo info, bool _) { setState(() { _imageWidth = info.image.height.toDouble(); _imageHeight = info.image.height.toDouble(); }); }, ), ); setState(() { _image = image; _isLoading = false; }); } _petRecognizerV1(File image) async { List<dynamic> _modelPredictions = await Tflite.detectObjectOnImage( path: image.path, model: pet, threshold: 0.3, imageMean: 0.0, imageStd: 255.0, numResultsPerClass: 1, ); setState(() { _predictions = _modelPredictions; }); } _pickedFileFormatter(PickedFile pickedFile) { File formattedFile = File(pickedFile.path); return formattedFile; } renderBoxes(Size screen) { if (_predictions == null) { return []; } else { if (_imageHeight == null || _imageWidth == null) { return []; } double factorX = screen.width; double factorY = _imageHeight / _imageHeight * screen.width; return _predictions.map((prediction) { return Positioned( left: prediction['rect']['x'] * factorX, top: prediction['rect']['y'] * factorY, width: prediction['rect']['w'] * factorX, height: prediction['rect']['h'] * factorY, child: Container( decoration: BoxDecoration( border: Border.all(color: Colors.green, width: 3.0), ), child: Text( '${prediction["detectedClass"]} ${(prediction["confidenceInClass"]) * 100.toStringAsFixed(0)}', style: TextStyle( background: Paint()..color = Colors.green, color: Colors.white, fontSize: 15.0, ), ), ), ); }).toList(); } } @override void initState() { super.initState(); _isLoading = true; _loadModel().then((value) { setState(() { _isLoading = false; }); }); } _loadModel() async { Tflite.close(); try { String response; if (_model == pet) { response = await Tflite.loadModel( model: 'assets/pet_recognizer.tflite', labels: 'assets/pet_recognizer.txt', ); } } catch (error) { print(error); } } @override Widget build(BuildContext context) { Size size = MediaQuery.of(context).size; return MaterialApp( debugShowCheckedModeBanner: false, home: Scaffold( appBar: AppBar( backgroundColor: Colors.white, title: Text('TFLite Test'), ), floatingActionButton: FloatingActionButton( child: Icon(Icons.image), tooltip: 'Pick Image From Gallery', onPressed: () => _selectFromImagePicker, ), body: Stack( children: <Widget>[ Positioned( top: 0.0, left: 0.0, width: size.width, child: _image == null ? Text('No Image Selected') : Image.file(_image), ), renderBoxes(size), ], ), ), ); } }I personally don't think that there is a problem with my code, and I tried running
flutter pub getwhich has worked successfully with success code 0 , a few more times, though it hasn't fixed the problem...
I am not very sure what to do in order to move on with this and would really appreciate any help I receive! Thanks, cheers and I appreciate your help :)
-
GILO almost 3 yearshow do you downgrade? -
GILO almost 3 yearsoh wait no worries -
oezguensi over 2 yearsIs there way to do this without explicitly changing the .lock file