I 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 the Podfile
and Podfile.lock
from the ios
directory, 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 get
which 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 :)
Downgrading TensorFlowLiteC to 2.2.0 worked for me
See https://github.com/shaqian/flutter_tflite/issues/139#issuecomment-668252599