我正在尝试从tensorflow运行示例应用程序以使用其他模型进行图像分割。
我想使用带有dpc的模型shufflenetv2来运行它。
因此,我复制了模型,并在imageSize
中将225
更改为ImageSegmentationModelExecutor.kt
。
然后我得到了错误
出了点问题:y +高度必须为<= bitmap.height()
对ImageUtils.kt的scaleBitmapAndKeepRatio函数进行一些小的调整即可解决此问题。 (只需将targetBmp.width更改为height两次,一次在矩阵中,第二次在返回中。) 这带来了下一个错误
出了点问题:无法在202500字节的TensorFlowLite缓冲区和4252500字节的Java缓冲区之间转换。
这两个数字的比率为NUM_CLASSES。不知道这是使它运行的正确方法还是从此处继续操作。 有什么想法或建议吗?
答案 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]}
)