物体检测4:Android上应用物体监测(TF1)

物体检测4:Android上应用物体监测(TF1),第1张

在上一章节 训练一个物体检测器 ,

我们将训练后的模型导出成了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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8118714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存