我们将训练后的模型导出成了pb文件,用在PC侧tensorflow物体监测;本章节,我们尝试在Android手机上转化我们训练好的模型,供手机端tensorflow-lite使用
输出结果为:
运行以下命令:
会提示以下错误:
错误解决方案一:
使用非量化的转换,需要将inference_type=QUANTIZED_UINT8 改为—inference_type=FLOAT并添加:
--default_ranges_min
--default_ranges_max
Quantized模型里面的权重参数用1个字节的uint8类型表示,模型大小是Float版本的四分之一;后续我们再讲解怎么生成Quantized的模型文件
最后运行以下命令:
生成detect.tflite文件:
生成的文件达到22MB,而原生的支持80个物种监测的tflite文件(Quantized类型) 相机集成物体监测 ,仅仅为3MB左右;
解决方案二:
使用量化转换,将inference_type和input_data_type设置为QUANTIZED_UINT8 ;
参数default_ranges_min和default_ranges_max也需要设置
此种方案生成的tflite文件,比非量化模式减少了四倍,精度稍有下降
1、使用facenent/src/freeze_graph.py将ckpt模型文件转化为pb模型文件,
需要注意的是,需要在这里面添加模型名称及scope,如下图所示,转化ResNeXt模型是需要添加ResNeXt:
2、使用bazel搭建tensorflow的quzntization工具,如下面命令所示;
$ cd ~/tensorflow/ (tensorflow的源码路径)
$ bazel build tensorflow/tools/quantization:quantize_graph
3、量化前需要修改/tensorflow/tensorflow/python/framework/graph_util_impl.py,由于“Identity”的原因有些层无法量化,使量化后的模型无法使用,需做如下图的修改:
3.1、if node.name == "input": \n continue解决了由于“Identity”不将input层量化的错误;
3.2、re.match(r".*/cond.*", input_name)能够结果下面的错误:
ValueError: graph_def is invalid at node 'InceptionResnetV1/Conv2d_1a_3x3/BatchNorm/cond/AssignMovingAvg/decay': More inputs specified ('InceptionResnetV1/Conv2d_1a_3x3/BatchNorm/cond/Switch:1') than the op expects.
4、量化指令:
bazel-bin/tensorflow/tools/quantization/quantize_graph \
--input=/tmp/classify_image_graph_def.pb \
--output_node_names="embeddings" \
--output=/tmp/quantized_graph.pb \
--mode=eightbit
参考文献:https://zhuanlan.zhihu.com/p/25323688
https://www.tensorflow.org/performance/quantization
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)