我在项目中尝试使用TensorFlow Lite机器学习模型时,运行项目时遇到了一个错误:
↳ ** 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 descriptionCould not build the application for the simulator.Error launching application on iPhone 11 Pro Max.
我尝试过flutter clean
,也尝试过从ios
目录中删除Podfile
和Podfile.lock
,但这些操作都没有改变任何情况。
这是我的代码:
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对我有用
- 在/ios/Podfile.lock中将TensorFlowLiteC降级到2.2.0
- 在你的/ios文件夹中运行pod install
详见 https://github.com/shaqian/flutter_tflite/issues/139#issuecomment-668252599