对象检测仅适用于模拟器设备,不适用于物理设备
此异常仅在使用物理设备时出现 并在模拟器上运行良好
const String ssd = 'SSD MobileNet';
class Object extends StatefulWidget {
@override
_ObjectState createState() => _ObjectState();
}
class _ObjectState extends State<Object> {
double _imageWidth;
double _imageHeight;
File _image;
bool _busy = false;
List _recognitions;
@override
void initState() {
super.initState();
loadTfModel();
}
void loadTfModel() async {
Tflite.close();
try {
await Tflite.loadModel(model: "assets/Models/ssd_mobilenet.tflite", labels: "assets/Models/labels.txt");
} on PlatformException {
print("faild to Load Models");
}
}
void getImageFromGallary() async {
var pickedFile = await ImagePicker().getImage(source: ImageSource.gallery);
if (pickedFile == null) return;
_image = File(pickedFile.path);
setState(() {
_busy = true;
});
detectObject(_image);
}
detectObject(File image) async {
if (image == null) return;
ssdMobileNet(image);
FileImage(image)
.resolve(ImageConfiguration())
.addListener((ImageStreamListener((ImageInfo info, bool _) {
setState(() {
_imageWidth = info.image.width.toDouble();
_imageHeight = info.image.height.toDouble();
});
})));
setState(() {
_image = image;
_busy = false;
});
}
ssdMobileNet(File image) async {
var recognitions = await Tflite.detectObjectOnImage(
path: image.path, numResultsPerClass: 1);
setState(() {
_recognitions = recognitions;
});
}
List<Widget> renderBoxes(Size screen) {
if (_recognitions == null) return [];
if (_imageWidth == null || _imageHeight == null) return [];
double factorX = screen.width;
double factorY = _imageWidth / _imageHeight * screen.width;
return _recognitions.map((re) {
return Positioned(
left: re["rect"]["x"] * factorX,
top: re["rect"]["y"] * factorY,
width: re["rect"]["w"] * factorX,
height: re["rect"]["h"] * factorY,
child: Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.red,
width: 3,
)),
child: Text(
"${re["detectedClass"]} ${(re["confidenceInClass"] * 100).toStringAsFixed(0)}%",
style: TextStyle(
background: Paint()..color = Colors.blue,
color: Colors.white,
fontSize: 15,
),
),
),
);
}).toList();
}
@override
Widget build(BuildContext context) {
var widthS = MediaQuery.of(context).size.width;
var heightS = MediaQuery.of(context).size.height;
Size size = MediaQuery.of(context).size;
List<Widget> stackChildren = [];
stackChildren.add(Positioned(
top: 0.0,
left: 0.0,
width: size.width,
child: _image == null ? Text("No Image Selected") : Image.file(_image),
));
stackChildren.addAll(renderBoxes(size));
if (_busy) {
stackChildren.add(Center(
child: CircularProgressIndicator(),
));
}
return Scaffold(
appBar: AppBar(
title: Text("Object detetction"),
backgroundColor: Colors.red,
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.image),
backgroundColor: Colors.red,
tooltip: "Pick an Image",
onPressed: getImageFromGallary,
),
body: Stack(
children: stackChildren,
),
);
}
}
这是我得到的例外
E/flutter ( 2827): at sq.flutter.tflite.TflitePlugin.onMethodCall(TflitePlugin.java:95)
E/flutter ( 2827): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/flutter ( 2827): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/flutter ( 2827): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:692)
E/flutter ( 2827): at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter ( 2827): at android.os.MessageQueue.next(MessageQueue.java:323)
E/flutter ( 2827): at android.os.Looper.loop(Looper.java:135)
E/flutter ( 2827): at android.app.ActivityThread.main(ActivityThread.java:7331)
E/flutter ( 2827): at java.lang.reflect.Method.invoke(Native Method)
E/flutter ( 2827): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
E/flutter ( 2827): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
E/flutter ( 2827):
F/flutter ( 2827): [FATAL:flutter/shell/platform/android/platform_view_android_jni_impl.cc(942)] Check failed: CheckException(env).
F/libc ( 2827): Fatal signal 6 (SIGABRT), code -6 in tid 2827 (.asfandyr380.ai)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'samsung/a5ltexx/a5lte:6.0.1/MMB29M/A500FXXS1CRJ2:user/release-keys'
Revision: '10'
ABI: 'arm'
pid: 2827, tid: 2827, name: .asfandyr380.ai >>> com.asfandyr380.ai <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: '[FATAL:flutter/shell/platform/android/platform_view_android_jni_impl.cc(942)] Check failed: CheckException(env).
'
r0 00000000 r1 00000b0b r2 00000006 r3 b6fd0b94
r4 b6fd0b9c r5 b6fd0b4c r6 00000000 r7 0000010c
r8 bed06b7c r9 bed06c90 sl 00000001 fp b6f6fe3a
ip 00000006 sp bed06b00 lr b6d50efd pc b6d532f8 cpsr 400f0010
backtrace:
#00 pc 000442f8 /system/lib/libc.so (tgkill+12)
#01 pc 00041ef9 /system/lib/libc.so (pthread_kill+32)
#02 pc 0001ba13 /system/lib/libc.so (raise+10)
#03 pc 00018c81 /system/lib/libc.so (__libc_android_abort+34)
#04 pc 00016840 /system/lib/libc.so (abort+4)
#05 pc 000127c3 /data/app/com.asfandyr380.ai-2/lib/arm/libflutter.so
谁能告诉我为什么会这样 我认为当我加载模型时会发生这种情况,因为如果我删除该部分,应用程序可以正常工作,但是对象检测无法工作,因为模型未加载
答案 0 :(得分:0)
您好,请为 flutter_tflite 包尝试几个步骤,请尝试 https://pub.dev/packages/tflite/example 中的示例代码 如果它在模拟器中运行而不是在您的设备上运行,请在其他设备上试用该代码。谢谢