可以在Android上运行ssd_mobilenet_v1_fpn进行推理吗?

问题描述

我正在为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

这里是未量化的模型

Google云端硬盘: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 -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 \ --allow_concat_input 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以外的型号?

解决方法

首先,当应用量化时,性能会越来越差。量化越多(浮点=>整数),量化就越差。对于检测模型,结果往往不能很好地在小物体上操作,并且不能很好地适合大物体的边界框。我正在研究解决这个问题的论文。可能会很快回来给您介绍如何使用ssd解决问题。

第二,我无权查看您的模型,伙计。但是,根据this,根据我的经验,您可以转换为具有ssd主干的任何检测模型。您可能要按照我给您的说明进行操作,以确保量化正常

,

如果输入是图像,则应更改--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

,

我找不到在Android上运行此模型的方法,这可能无法实现,或者我的手机功能不足。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...