问题描述
我正在为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
这里是未量化的模型:
Google云端硬盘:https://drive.google.com/file/d/11c_PdgobP0jvzTnssOkmcjp19DZoBAAQ/view?usp=sharing
为了量化,我使用了以下命令行:
运行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,但不适用于此模型。
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用于对象检测(仅检测一个类“对象”),另一个用于分类(获取对象的边界框并对其进行分类)。 这不是最优雅的解决方案,但至少可以奏效。