减少.tflite模型大小

时间:2019-10-25 15:40:26

标签: python tensorflow tensorflow-lite google-coral

我看到的任何Zoo .tflite模型的大小都不超过3MB。在edgetpu上,它们运行良好。但是,当我训练自己的对象检测模型时,.pb文件为60MB,.tflite也很大,为20MB!它也按以下方式量化。最终结果是edgetpu object_detection模型上的分割错误。是什么导致此文件太大?送入模型的未调整大小的图像会导致模型变大(某些照片为4096×2160且未调整大小)吗?

来自object_detection

训练模型

python train.py \
--logtostderr \
--train_dir=training \
--pipeline_config_path=training/ssd_mobilenet_v1_coco.config

冻结图形-创建60MB的.pb文件

python export_tflite_ssd_graph.py \
--pipeline_config_path=training/ssd_mobilenet_v2_coco.config \
--trained_checkpoint_prefix=training/model.ckpt-2020 \
--output_directory=inference_graph \
--add_postprocessing_op=true 

转换为.tflite -创建20MB的.tflite文件

tflite_convert 
--graph_def_file=inference_graph/tflite_graph.pb \
--output_file=inference_graph/detect.tflite \
--inference_type=QUANTIZED_UINT8 \
--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 \
--mean_values=128 \
--std_dev_values=127 \
--allow_custom_ops \
--default_ranges_min=0 \
--default_ranges_max=6

在此阶段,.tflite文件被推送到Google Coral Edgetpu,并且该模型在连接到TPU的USB摄像头上进行了试用。

export DISPLAY=:0 && edgetpu_detect \
--source /dev/video1:YUY2:1280x720:20/1  \
--model ${DEMO_FILES}/detect.tflite

最终结果是细分错误。

INFO: Initialized TensorFlow Lite runtime.
glvideomixer name=mixer background=black ! glimagesink sync=False name=glsink qos=False
v4l2src device=/dev/video1 ! video/x-raw,height=720,framerate=20/1,format=YUY2,width=1280 ! glupload ! tee name=t
t. ! glupload ! queue ! mixer.
overlaysrc name=overlay ! video/x-raw,height=720,width=1280,format=BGRA ! glupload ! queue max-size-buffers=1 ! mixer.
t. ! queue max-size-buffers=1 leaky=downstream ! glfilterbin filter=glcolorscale ! video/x-raw,height=168,width=300,format=RGBA ! videoconvert ! video/x-raw,height=168,width=300,format=RGB ! videobox autocrop=True ! video/x-raw,height=300,width=300 ! appsink max-buffers=1 sync=False emit-signals=True drop=True name=appsink
Segmentation fault

1 个答案:

答案 0 :(得分:0)

这里的问题可能是由于每个步骤都有两个不同的配置文件:

python train.py \
...
--pipeline_config_path=training/ssd_mobilenet_v1_coco.config
python export_tflite_ssd_graph.py \
--pipeline_config_path=training/ssd_mobilenet_v2_coco.config \
...

这是真的吗?另外,看起来您在训练后就立即部署了模型,而没有对其进行编译。请参考此文档以获取关于edgetpu_compiler的更多信息: https://coral.withgoogle.com/docs/edgetpu/compiler/

AFAIK,一个20MB的模型只要满足页面上列出的所有要求,就应该可以正常运行:

  • 张量参数被量化(8位定点数)。
  • 张量在编译时是恒定的(没有动态尺寸)。
  • 模型参数(例如偏差张量)在编译时是恒定的。
  • 张量是1维,2维或3维的。如果张量具有3个以上的维,则只有3个最里面的维可能具有大于1的大小。
  • 该模型仅使用Edge TPU支持的操作。 列出的操作在这里: https://coral.withgoogle.com/docs/edgetpu/models-intro/#supported-operations

您的整个流程应为:

1)训练模型

2)转换为tflite

3)为EdgeTPU编译(将工作实际委派给TPU的步骤)

希望这会有所帮助。