【问题标题】:Is it possible to run ssd_mobilenet_v1_fpn on Android for inference?是否可以在 Android 上运行 ssd_mobilenet_v1_fpn 进行推理?
【发布时间】:2021-01-03 13:40:04
【问题描述】:

我正在为 Android 制作一个对象检测应用程序,我在使用 ssd_mobilenet_v1_fpn 模型进行训练时获得了不错的性能。

我导出了冻结的推理图,转换为 tflite 并对其进行量化以提高性能。但是当我尝试在TensorFlow Lite Object Detection Android Demo 应用崩溃。

该应用与默认模型 (ssd_mobilenet_v1) 完美配合,但遗憾的是不适合小物体检测和分类。

这是我的量化 ssd_mobilenet_v1_fpn 模型

Google 云端硬盘:https://drive.google.com/file/d/1rfc64nUJzHQjxigD6hZ6FqxyGhLRbyB1/view?usp=sharing

OneDrive:https://univpr-my.sharepoint.com/:u:/g/personal/vito_filomeno_studenti_unipr_it/EXtl9aitsUZBg6w3awcLbfcBGBgrSV4kqBdSlS3LJOXKkg?e=kHEcy2

这里是未量化模型

谷歌驱动器:https://drive.google.com/file/d/11c_PdgobP0jvzTnssOkmcjp19DZoBAAQ/view?usp=sharing

OneDrive:https://univpr-my.sharepoint.com/:u:/g/personal/vito_filomeno_studenti_unipr_it/EcVpJ44Daf5OgpVTYG1eD38B6P1mbnospRb8wXU_WQRh0g?e=cIgpQ2

为了量化,我使用了这个命令行:

bazel run -c opt tensorflow/lite/toco:toco -- \ --input_file=tflite_graph.pb \ --output_file=detect_quant.tflite \ --input_shapes=1,640,480,3 \ --input_arrays=normalized_input_image_tensor \ -- output_arrays=TFLite_Detection_PostProcess,TFLite_Detection_PostProcess:1,TFLite_Detection_PostProcess:2,TFLite_Detection_PostProcess:3 \ --inference_type=QUANTIZED_UINT8 \ --mean_values=128 \ --std_values=128 \ --change_concat_input_ranges=false \ --allow_custom_ops --default_ranges_min=0 -- default_ranges_max=6

我也尝试过 tflite 转换器 python api,但它不适用于这个模型。

这里是 android logcat 错误Errors

2020-09-16 18:54:06.363 29747-29747/org.tensorflow.lite.examples.detection E/Minikin:无法获取 cmap 表大小!

2020-09-16 18:54:06.364 29747-29767/org.tensorflow.lite.examples.detection E/MemoryLeakMonitorManager: MemoryLeakMonitor.jar 不存在!

2020-09-16 18:54:06.871 29747-29747/org.tensorflow.lite.examples.detection E/BufferQueueProducer: [] 无法获得 hwsched 服务

2020-09-16 18:54:21.033 29747-29786/org.tensorflow.lite.examples.detection A/libc:致命信号 6 (SIGABRT),tid 29786 中的代码 -6(推理)

有没有人设法在 android 上使用 fpn 模型?还是 ssd_mobilenet_v1 以外的型号?

【问题讨论】:

  • 你能链接谷歌驱动器以外的东西吗?我们必须请求访问才能查看您要寻求帮助的内容。
  • 我的错,我更新了链接

标签: android tensorflow tensorflow-lite object-detection-api mobilenet


【解决方案1】:

我找不到在 Android 上运行此模型的方法,这可能是不可能的,或者我的手机功能不够强大。

但是我通过使用两个不同的网络解决了我的问题,MobilenetV1 用于对象检测(仅检测一个类别“对象”),一个用于分类(获取对象的边界框并对其进行分类)。 这不是最优雅的解决方案,但至少它有效。

【讨论】:

    【解决方案2】:

    如果输入是图像,您应该更改--default_ranges_max=255 并使用tflite_convert。顺便说一句,你为什么不能为此使用 python API?如果输入是冻结图,你可以像下面这样转换:

    converter = tf.lite.TFLiteConverter.from_frozen_graph('tmp.pb', input_arrays=..., output_arrays=...)
    tflite_model = converter.convert()
    

    同时,对象检测 API 包含Running TF2 Detection API Models on mobile 的文档。它还包含python脚本export_tflite_graph_tf2.py

    【讨论】:

      【解决方案3】:

      首先,当应用量化时,性能变得越来越差。量化越多(浮点 => 到 int)它变得越差。对于检测模型,结果往往不能很好地对小物体进行操作,并且不能很好地拟合大物体的边界框。我正在写一篇论文来解决这个问题。可能会尽快回复您如何使用 ssd 解决它。

      其次,我无权查看你的模型,伙计。但是,根据this 和我的经验量化,您可以转换为任何具有 ssd 主干的检测模型。您可能需要按照我给您的说明来确保量化正常

      【讨论】:

      • 我更改了 Google Drive 上的隐私设置,还添加了 OneDrive 链接以防万一。但是我怀疑问题不在于精度或量化,而在于模型本身。我认为它可能适用于移动设备,因为它是一个移动网络,但我找不到任何人这样做。
      • 固态硬盘在 pc 型号上工作得很好。但是,当转换为 tflite 时,由于位精度较低,该模型已经出现问题。带有 mobilenet 的 Ssd 是一个非常深的模型,每个节点层的量化都动态降低了性能
      • 能否在量化前附上量化代码和你的预训练模型?对于可在 android 设备上部署的理想测试,您应该尝试从我给您的源代码推断 tflite。我从输入中看到,为什么你的输入是 640x480?
      • 我更新了问题。来自 android 相机的图像分辨率为 4:3,因此我将它们缩放到 640x480 进行推理以避免失真。 model zoo 中 mobilenet_v1_fpn 的默认输入是 640x640,应该比我的自定义模型还要重。
      • 你能重新调整你的屏幕图像并输入这个已经量化的模型在这里检查吗? github.com/tensorflow/models/blob/master/research/slim/nets/…
      猜你喜欢
      • 2017-08-09
      • 1970-01-01
      • 2011-01-05
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多