flutter tflite 对象检测不适用于物理设备

时间:2021-01-18 13:53:05

标签: flutter object detection

对象检测仅适用于模拟器设备,不适用于物理设备

此异常仅在使用物理设备时出现 并在模拟器上运行良好

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 

谁能告诉我为什么会这样 我认为当我加载模型时会发生这种情况,因为如果我删除该部分,应用程序可以正常工作,但是对象检测无法工作,因为模型未加载

1 个答案:

答案 0 :(得分:0)

您好,请为 flutter_tflite 包尝试几个步骤,请尝试 https://pub.dev/packages/tflite/example 中的示例代码 如果它在模拟器中运行而不是在您的设备上运行,请在其他设备上试用该代码。谢谢

相关问题