我正在尝试将ssd_resnet_50模型从tensorflow Object Detection API转换为.tflite格式,但是它不起作用。
某些背景:
我能够成功地将开箱即用的ssd_mobilenet_v2_quantized
模型转换为.tflite
并运行。tflite
模型。
由于未量化s sd_resnet_50
模型,因此我将以下内容添加到ssd_resnet_50
pipeline.config
文件中并重新训练了模型:
graph_rewriter {
quantization {
delay: 48000
weight_bits: 8
activation_bits: 8
}
}
重新训练ssd_resnet_50
之后,我尝试使用以下命令将模型转换为.tflite
格式:
# Produces tflite_graph.pb
python3 object_detection/export_tflite_ssd_graph.py \
--pipeline_config_path=pipeline.config \
--trained_checkpoint_prefix=model.ckpt-50000 \
--output_directory=$OUTPUT_DIR \
--add_postprocessing_op=true
# Produces detect.tflite
bazel run -c opt tensorflow/lite/toco:toco -- \
--input_file=$OUTPUT_DIR/tflite_graph.pb \
--output_file=$OUTPUT_DIR/detect.tflite \
--input_shapes=1,640,640,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_values=128 \
--change_concat_input_ranges=false \
--allow_custom_ops
通常,TOCO
会产生可以运行的有效detect.tflite
。但是,TOCO
遇到以下有关量化和Relu6的错误。
有人可以帮忙吗?
错误:
2019-05-21 10:41:07.885065: F tensorflow/lite/toco/tooling_util.cc:1718] Array WeightSharedConvolutionalBoxPredictor_2/BoxPredictionTower/conv2d_0/BatchNorm/feature_2/FusedBatchNorm_mul_0, which is an input to the Add operator producing the output array WeightSharedConvolutionalBoxPredictor_2/Relu6, is lacking min/max data, which is necessary for quantization. If accuracy matters, either target a non-quantized output format, or run quantized training with your model from a floating point checkpoint to change the input graph to contain min/max information. If you don't care about accuracy, you can pass --default_ranges_min= and --default_ranges_max= for easy experimentation.
run_toco.sh: line 25: 3280 Aborted (core dumped) bazel run -c opt tensorflow/lite/toco:toco -- --input_file=$OUTPUT_DIR/tflite_graph.pb --output_file=$OUTPUT_DIR/detect.tflite --input_shapes=1,640,640,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_values=128 --change_concat_input_ranges=false --allow_custom_ops
答案 0 :(得分:0)
在读取错误时,似乎WeightSharedConvolutionalBoxPredictor_2/BoxPredictionTower/ conv2d_0/BatchNorm /feature_2/FusedBatchNorm_mul_0
中的数组WeightSharedConvolutionalBoxPredictor_2/ Relu6
没有进行训练后量化所需的最小/最大信息。
您可以在Use "dummy-quantization" to try out quantized inference on a float graph.部分中查看示例和一些详细信息。
您可以在命令中添加--default_ranges_min=0 --default_ranges_max=255
,但这样做会失去准确性。
bazel run -c opt tensorflow/lite/toco:toco -- \
--input_file=$OUTPUT_DIR/tflite_graph.pb \
--output_file=$OUTPUT_DIR/detect.tflite \
--input_shapes=1,640,640,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_values=128 \
--default_ranges_min=0 \
--default_ranges_max=255 \
--change_concat_input_ranges=false \
--allow_custom_ops
来自Tensorflow Converter command line reference:
--default_ranges_min, --default_ranges_max
。类型:浮点数。没有指定范围的所有阵列使用的(最小,最大)范围值的默认值。允许用户继续量化未量化或错误量化的输入文件。这些标志产生的模型精度较低。它们旨在通过“虚拟量化”轻松进行量化实验