我正在尝试在我的项目中使用 Tensorflow Lite ML 模型,不幸的是,我在运行项目时遇到错误:
↳
** 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.
我已经尝试过
flutter clean
,并尝试从 Podfile
目录中删除 Podfile.lock
和 ios
,尽管这并没有改变任何东西。
这是我的代码:
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),
],
),
),
);
}
}
我个人不认为我的代码有问题,我尝试运行
flutter pub get
它已经成功地使用成功代码 0 ,又进行了几次,尽管它还没有解决问题...
我不太确定该怎么做才能继续这件事,非常感谢我收到的任何帮助!谢谢,干杯,我感谢你的帮助:)
将 TensorFlowLiteC 降级到 2.2.0 对我有用
参见https://github.com/shaqian/flutter_tflite/issues/139#issuecomment-668252599
在您的
Podfile
中将其添加到末尾:
pod 'TensorFlowLiteC', '2.2.0'
删除
Podfile.lock
删除
Pods
文件夹
删除
.symlinks
文件夹
flutter run
我通过从 TensorFlowLiteC 2.5.0 降级到 2.2.0 解决了我的问题
执行上述步骤出现以下错误:
In Podfile:
tflite_flutter (from `.symlinks/plugins/tflite_flutter/ios`) was resolved to 0.0.1, which depends on
TensorFlowLiteSwift/CoreML (= 2.12.0) was resolved to 2.12.0, which depends on
TensorFlowLiteC/CoreML (= 2.12.0)