使用其他模型运行tflite样本细分应用

时间:2020-02-25 14:50:56

标签: android tensorflow tensorflow-lite tf-lite

我正在尝试从tensorflow运行示例应用程序以使用其他模型进行图像分割。 我想使用带有dpc的模型shufflenetv2来运行它。 因此,我复制了模型,并在imageSize中将225更改为ImageSegmentationModelExecutor.kt。 然后我得到了错误

出了点问题:y +高度必须为<= bitmap.height()

对ImageUtils.kt的scaleBitmapAndKeepRatio函数进行一些小的调整即可解决此问题。 (只需将targetBmp.width更改为height两次,一次在矩阵中,第二次在返回中。) 这带来了下一个错误

出了点问题:无法在202500字节的TensorFlowLite缓冲区和4252500字节的Java缓冲区之间转换。

这两个数字的比率为NUM_CLASSES。不知道这是使它运行的正确方法还是从此处继续操作。 有什么想法或建议吗?

1 个答案:

答案 0 :(得分:0)

您似乎有两个不相关的问题

1)方法scaleBitmapAndKeepRatio似乎有问题。

width替换height并不能解决问题。仅更改将要发生的时刻。请参见参考createBitmap

如果x,y,width,height值超出源位图的尺寸,或者width <= 0,或者height <= 0,或者源位图已经被回收

因此要获得平方的调整后的位图,最好获得像这样的最小尺寸

val dimension = min(targetBmp.height, targetBmp.width)

并将width替换为dimension

2)我相信您的tflite模型的输入节点与tflite细分示例不兼容

default model Google provides来看看Netron

您可以看到默认模型输入节点是量化的float32对我来说,您似乎已经使用quantize.md中的默认指令将模型转换为tflite。这将为您提供一个期望量化的uint8输入节点的模型,因此,数据类型不匹配。请记住,存储库中的tflite示例是为特定输入量而定制的,并不是很通用。

您宁愿进行以下所示的转换,以获取量化的float32

作为输入节点
# Load the TensorFlow model
converter = tf.compat.v1.lite.TFLiteConverter.from_frozen_graph(
    graph_def_file = MODEL_FILE, 
    input_arrays = ['sub_2'], # For the Xception model it needs to be `sub_7`, for MobileNet it would be `sub_2`
    output_arrays = ['ResizeBilinear_2'], # For the Xception model it needs to be `ResizeBilinear_3`, for MobileNet it would be `ResizeBilinear_2`
    input_shapes={'sub_2':[1,257,257,3]}
)