从相同检查点提取的经过重新训练的Tflite / Pb模型给出不同的结果

时间:2019-03-17 13:00:40

标签: java python tensorflow tensorflow-lite

在我使用object_detection \ model_main.py脚本用自己的图像数据集对经过预训练的ssd mobilenet v1模型进行了培训之后,我导出了两个.pb冻结图(使用export_inference_graph.py脚本)

python models\research\object_detection\export_inference_graph.py 
--input_type image_tensor 
--input_shape=1,300,300,3 
--pipeline_config_path ssd_mobilenet_v1_test.config 
--trained_checkpoint_prefix training/model.ckpt 
--output_directory export\freeze\

和.tflite图(带有export_tflite_ssd_graph.py脚本和tflite_convert)。

python models\research\object_detection\export_tflite_ssd_graph.py 
--input_type image_tensor 
--pipeline_config_path ssd_mobilenet_v1_test.config 
--trained_checkpoint_prefix training/model.ckpt 
--output_directory export\tflite\ 
--max_detections 16 
--add_postprocessing_op=true

tflite_convert 
--output_file=export\tflite\model.tflite 
--graph_def_file=export\tflite\tflite_graph.pb 
--input_shapes=1,300,300,3 
--input_arrays=normalized_input_image_tensor 
--output_arrays=TFLite_Detection_PostProcess,TFLite_Detection_PostProcess:1,TFLite_Detection_PostProcess:2,TFLite_Detection_PostProcess:3 
--inference_type=QUANTIZED_UINT8 
--mean_values=128 
--std_dev_values=128 
--default_ranges_min=0 
--default_ranges_max=6 
--allow_custom_ops

Pb图似乎工作正常,但是tflite一个false可以检测到android上的所有内容,因此无论我传递给它的图像是什么,我都能获得16种可能的检测方法中的16种,甚至是填充有黑色的图像(我在android设备上对其进行测试(与预先训练的模型配合使用时效果很好)。

更改转换选项(例如禁用/启用量化,图像标准/平均值)没有任何改变。我还将tflite图与示例mobilenet图进行了比较,它们看起来非常相似。有什么想法会导致该问题吗?

(Windows 10 / cuda 9.0 / cudnn 7.0 / tf-nightly-gpu / models-master)

1 个答案:

答案 0 :(得分:0)

tflite模型的输出张量似乎返回一些极值(例如:5e35或-3e34)。由于这些得分值中的一些大于1,因此算作检测。

我的解决方案,将大于限制的所有值(我做了1e5)替换为0。(Python更快。)

tensor[tensor > 1e5] = 0

使用示例detector.tflite或导出的冻结推理图不会发生这种情况很奇怪。必须有适当的方法来导出tflite模型。