运行 ssd_mobilenet_v1_fpn on Android 是否可以进行推理?
Is it possible to run ssd_mobilenet_v1_fpn on Android for inference?
我正在为 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
这里是未量化的模型:
谷歌驱动器:https://drive.google.com/file/d/11c_PdgobP0jvzTnssOkmcjp19DZoBAAQ/view?usp=sharing
对于量化我使用了这个命令行:
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 converter python api,但是这个机型不行
这里是 android logcat 错误:
Errors
2020-09-16 18:54:06.363 29747-29747/org.tensorflow.lite.examples.detection E/Minikin: Could not get cmap table size!
2020-09-16 18:54:06.364 29747-29767/org.tensorflow.lite.examples.detection E/MemoryLeakMonitorManager: MemoryLeakMonitor.jar is not exist!
2020-09-16 18:54:06.871 29747-29747/org.tensorflow.lite.examples.detection E/BufferQueueProducer: [] Can not get hwsched service
2020-09-16 18:54:21.033 29747-29786/org.tensorflow.lite.examples.detection A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 29786 (inference)
有没有人设法在 android 上使用 fpn 模型?或 ssd_mobilenet_v1 以外的型号?
首先,在应用量化时,性能越来越差。量化越多(float => to int)它变得越差。对于检测模型,结果往往不能很好地对小物体进行操作,也不能很好地拟合大物体的边界框。我正在写一篇论文来解决这个问题。可能会尽快回来告诉你如何用ssd解决它。
其次,我无权查看您的模型,伙计。然而,根据 this 和我的经验 quantize,你可以使用 ssd backbone 转换为任何检测模型。您可能需要按照我给您的说明进行操作,以确保量化正常
如果输入是图像,您应该更改--default_ranges_max=255
并使用tflite_convert
。顺便说一句,你为什么不能为此使用 python API?如果输入的是frozen graph,可以这样转换:
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. Also it contains the python scripts export_tflite_graph_tf2.py 的文档。
我在 Android 上找不到 运行 这个模型的方法,这可能是不可能的,或者我的 phone 不够强大。
但是我通过使用两种不同的网络解决了我的问题,MobilenetV1 用于对象检测(仅检测一个 class“对象”),一个用于 classification(采用对象的边界框和 class 化他们)。
这不是最优雅的解决方案,但至少它有效。
我正在为 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
这里是未量化的模型:
谷歌驱动器:https://drive.google.com/file/d/11c_PdgobP0jvzTnssOkmcjp19DZoBAAQ/view?usp=sharing
对于量化我使用了这个命令行:
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 converter python api,但是这个机型不行
这里是 android logcat 错误: Errors
2020-09-16 18:54:06.363 29747-29747/org.tensorflow.lite.examples.detection E/Minikin: Could not get cmap table size!
2020-09-16 18:54:06.364 29747-29767/org.tensorflow.lite.examples.detection E/MemoryLeakMonitorManager: MemoryLeakMonitor.jar is not exist!
2020-09-16 18:54:06.871 29747-29747/org.tensorflow.lite.examples.detection E/BufferQueueProducer: [] Can not get hwsched service
2020-09-16 18:54:21.033 29747-29786/org.tensorflow.lite.examples.detection A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 29786 (inference)
有没有人设法在 android 上使用 fpn 模型?或 ssd_mobilenet_v1 以外的型号?
首先,在应用量化时,性能越来越差。量化越多(float => to int)它变得越差。对于检测模型,结果往往不能很好地对小物体进行操作,也不能很好地拟合大物体的边界框。我正在写一篇论文来解决这个问题。可能会尽快回来告诉你如何用ssd解决它。
其次,我无权查看您的模型,伙计。然而,根据 this 和我的经验 quantize,你可以使用 ssd backbone 转换为任何检测模型。您可能需要按照我给您的说明进行操作,以确保量化正常
如果输入是图像,您应该更改--default_ranges_max=255
并使用tflite_convert
。顺便说一句,你为什么不能为此使用 python API?如果输入的是frozen graph,可以这样转换:
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. Also it contains the python scripts export_tflite_graph_tf2.py 的文档。
我在 Android 上找不到 运行 这个模型的方法,这可能是不可能的,或者我的 phone 不够强大。
但是我通过使用两种不同的网络解决了我的问题,MobilenetV1 用于对象检测(仅检测一个 class“对象”),一个用于 classification(采用对象的边界框和 class 化他们)。 这不是最优雅的解决方案,但至少它有效。