加载EAST文本检测TFLite模型时张量分配失败问题求助
解决TFLite加载EAST文本检测器时的CONCATENATION维度不匹配错误
碰到这种拼接节点维度不匹配的报错,我之前部署EAST模型的时候也踩过一模一样的坑!核心问题就是模型里的CONCATENATION节点收到的两个输入张量尺寸对不上(一个是45,一个是46),哪怕你转换时固定了输入尺寸,也可能因为下面几个原因导致这个问题,给你梳理下可行的解决办法:
1. 模型转换时的输入尺寸没彻底固定死
EAST模型的特征金字塔分支本来就有不同的维度,如果你转换TFLite时只随便指定了输入尺寸,可能没覆盖到模型内部的动态维度分支,导致转换后的模型还是留有“活口”,加载时就会出现维度冲突。
解决的时候要注意:
- 转换时必须用完整的静态维度指定输入,连batch维度也要固定成1(毕竟部署时大多单张图推理),比如你的输入是512x512的3通道图,转换命令要这么写:
tflite_convert --saved_model_dir=./east_saved_model --output_file=frozen_east_text_detection.tflite --input_shape=1,512,512,3 --input_arrays=input_images --output_arrays=feature_fusion/Conv_7/Sigmoid,feature_fusion/concat_3 - 用Python API转换的话,一定要显式设置
input_shapes参数:converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.input_shapes = {"input_images": [1, 512, 512, 3]} tflite_model = converter.convert()
2. 模型内部的padding/池化搞出了细微尺寸差
EAST里的卷积、池化层如果用了SAME padding,有时候会因为输入尺寸的奇偶性,导致不同分支的输出维度差1(比如45和46),哪怕你固定了输入尺寸,这种浮点计算或取整的差异也会在TFLite的静态检查中暴露出来。
可以这么调整:
- 回到原始TensorFlow模型,把出问题的分支里的
SAMEpadding改成VALID(如果对精度影响不大的话),或者手动调整卷积核的步长、尺寸,让各特征分支的输出维度完全一致 - 转换时开启TFLite的优化选项,强制静态维度对齐:
converter.optimizations = [tf.lite.Optimize.DEFAULT]
3. 加载模型时别忘了手动指定输入张量尺寸
有时候哪怕转换时固定了尺寸,TFLite模型可能还是残留了动态维度的标记,这时候你得在加载后手动把输入张量的尺寸锁死,再分配张量:
修改你的代码试试:
from tensorflow.lite.python.interpreter import Interpreter model_path = 'frozen_east_text_detection.tflite' interpreter = Interpreter(model_path=model_path) # 先获取输入张量的详情,再强制设置成转换时用的尺寸 input_details = interpreter.get_input_details() interpreter.resize_tensor_input(input_details[0]['index'], (1, 512, 512, 3)) interpreter.allocate_tensors()
4. 原始模型的特征融合分支本身就有问题
如果上面的办法都没用,那大概率是你导出的原始TensorFlow模型本身就有问题——特征融合模块的两个分支输出维度本来就不一样,只是在TensorFlow动态图里没暴露出来,转换成TFLite静态图就炸了。
这时候得回到源头排查:
- 在原始TensorFlow模型里跑一次推理,打印特征融合前各分支的输出维度,找到哪个是45,哪个是46
- 给尺寸小的那个分支加个padding层,或者给尺寸大的加个裁剪层,把两者调成一样的尺寸,再重新导出成SavedModel,之后再转TFLite
内容的提问来源于stack exchange,提问作者Nick Skywalker
相关产品推荐
相关产品推荐

