Tensorflow Lite 采坑记
操作符支持有限
目前Tensorflow Lite中支持的Operator十分有限,导出模型中如果存在不支持的Operator将导致模型无法转换。
解决方案:- 自定义Operator (难度高)
- 在项目中自己实现相应Operator的算法逻辑 (难度中等)
模型输入尺度固定
每一个转换的模型都有固定的输入尺寸,而我们的项目中存在多种尺度的输入,如果每一种尺度对应一个的模型,那么将会增加模型的数量和大小,同时也增加了使用难度。
解决方案:- 通过加载一个model,可以生成N个Interpreter(模型代理对象),同时Interpreter可以动态ResizeInputTensor,理论上也可以支持N种尺度的输出。
模型大小优化
移动端对于Model的大小有很高的要求,因此模型优化十分重要。Tensorflow Lite 的模型优化主要依赖于Tensorflow model 的优化。
主要有两种方案:- 在模型优化的时候使用–transforms=’quantize_weights’,优化后的模型为原始模型的70%左右,压缩率极低,同时会导致模型精度的损失,一般不推荐采用。
- 在模型优化的时候使用参数–transforms=’round_weights(num_steps=256)’,优化后的模型和原始模型大小一致,但是在zip 或者 移动端打包的时候压缩率达到70%以上,推荐使用。
Tensorflow Lite 默认支持 NHWC,特别要注意模型输入的尺度。
// input_dims = {1, image_height,image_width,image_channel}
N— 常量1
H— image height
W— image width
C— image channeltflite::Interpreter的内部属性依赖于tflite::FlatBufferModel。
Tensorflow Lite 使用过程中需要注意tflite::FlatBufferModel对象和 tflite::Interpreter对象 生命周期的一致性。