leondgarse / Keras_insightface

Insightface Keras implementation
MIT License
230 stars 56 forks source link

EfficientNetV2B0 to TFLite #99

Closed ghost closed 1 year ago

ghost commented 1 year ago

Hi, first of all, thank you for your excellent work, it's really amazing.

I have a question, whether it is possible to convert the EfficientNetV2B0 model to TFLite, for use with GPU.

P.S. I apologize for my poor English.

leondgarse commented 1 year ago

The basic conversion is rather easy, just follow TFLite instruction:

  mm = keras.models.load_model("{basic_model.h5}")
  converter = tf.lite.TFLiteConverter.from_keras_model(mm)
  open(mm.name + ".tflite", "wb").write(converter.convert())

But for using TFLite model with GPU, you need to follow TFLite GPU delegate. Never tried that myself.

ghost commented 1 year ago

Yes, that's what I did, but the TfLiteInterpreterOptionsAddDelegate function causes an unknown error, the model runs only under the CPU, it looks like TensorFlow Lite does not support EfficientNetV2B models.

ghost commented 1 year ago

ONNX also does not support GPU for EfficientNetV2B

leondgarse commented 1 year ago

Uh, so you have already tried those...

ghost commented 1 year ago

I haven't tried any of the Mobilenet versions, RestNet 18+ work.

After converting in this way, EfficientNetV2B0 seems to load under GPU

from keras_cv_attention_models import efficientnet, model_surgery
mm = efficientnet.EfficientNetV2B0(activation='relu', num_classes=0, pretrained=None)  # Change swish to relu
mm = model_surgery.convert_to_fused_conv_bn_model(mm)  # Fuse BN with Conv2D
print([ii for ii in mm.layers if isinstance(ii, keras.layers.BatchNormalization)])  # Check if any BN left

""" Convert to TFLite model efficientnet_v2-b0.tflite """
converter = tf.lite.TFLiteConverter.from_keras_model(mm)

converter.target_spec.supported_types = [tf.float16] #you forgot to add

open(mm.name + ".tflite", "wb").write(converter.convert())
leondgarse commented 1 year ago

If these converting works, you may check which operation is blocking, BN or swish.

ghost commented 1 year ago
>>>> len(fuse_convs) = 59 len(fuse_bns) = 59
>>>> Fuse conv bn: stem_conv
>>>> Fuse conv bn: stack_0_block0_fu_conv
>>>> Fuse conv bn: stack_1_block0_sortcut_conv
>>>> Fuse conv bn: stack_1_block0_MB_pw_conv
>>>> Fuse conv bn: stack_1_block1_sortcut_conv
>>>> Fuse conv bn: stack_1_block1_MB_pw_conv
>>>> Fuse conv bn: stack_2_block0_sortcut_conv
>>>> Fuse conv bn: stack_2_block0_MB_pw_conv
>>>> Fuse conv bn: stack_2_block1_sortcut_conv
>>>> Fuse conv bn: stack_2_block1_MB_pw_conv
>>>> Fuse conv bn: stack_3_block0_sortcut_conv
>>>> Fuse conv bn: stack_3_block0_MB_dw_
>>>> Fuse conv bn: stack_3_block0_MB_pw_conv
>>>> Fuse conv bn: stack_3_block1_sortcut_conv
>>>> Fuse conv bn: stack_3_block1_MB_dw_
>>>> Fuse conv bn: stack_3_block1_MB_pw_conv
>>>> Fuse conv bn: stack_3_block2_sortcut_conv
>>>> Fuse conv bn: stack_3_block2_MB_dw_
>>>> Fuse conv bn: stack_3_block2_MB_pw_conv
>>>> Fuse conv bn: stack_4_block0_sortcut_conv
>>>> Fuse conv bn: stack_4_block0_MB_dw_
>>>> Fuse conv bn: stack_4_block0_MB_pw_conv
>>>> Fuse conv bn: stack_4_block1_sortcut_conv
>>>> Fuse conv bn: stack_4_block1_MB_dw_
>>>> Fuse conv bn: stack_4_block1_MB_pw_conv
>>>> Fuse conv bn: stack_4_block2_sortcut_conv
>>>> Fuse conv bn: stack_4_block2_MB_dw_
>>>> Fuse conv bn: stack_4_block2_MB_pw_conv
>>>> Fuse conv bn: stack_4_block3_sortcut_conv
>>>> Fuse conv bn: stack_4_block3_MB_dw_
>>>> Fuse conv bn: stack_4_block3_MB_pw_conv
>>>> Fuse conv bn: stack_4_block4_sortcut_conv
>>>> Fuse conv bn: stack_4_block4_MB_dw_
>>>> Fuse conv bn: stack_4_block4_MB_pw_conv
>>>> Fuse conv bn: stack_5_block0_sortcut_conv
>>>> Fuse conv bn: stack_5_block0_MB_dw_
>>>> Fuse conv bn: stack_5_block0_MB_pw_conv
>>>> Fuse conv bn: stack_5_block1_sortcut_conv
>>>> Fuse conv bn: stack_5_block1_MB_dw_
>>>> Fuse conv bn: stack_5_block1_MB_pw_conv
>>>> Fuse conv bn: stack_5_block2_sortcut_conv
>>>> Fuse conv bn: stack_5_block2_MB_dw_
>>>> Fuse conv bn: stack_5_block2_MB_pw_conv
>>>> Fuse conv bn: stack_5_block3_sortcut_conv
>>>> Fuse conv bn: stack_5_block3_MB_dw_
>>>> Fuse conv bn: stack_5_block3_MB_pw_conv
>>>> Fuse conv bn: stack_5_block4_sortcut_conv
>>>> Fuse conv bn: stack_5_block4_MB_dw_
>>>> Fuse conv bn: stack_5_block4_MB_pw_conv
>>>> Fuse conv bn: stack_5_block5_sortcut_conv
>>>> Fuse conv bn: stack_5_block5_MB_dw_
>>>> Fuse conv bn: stack_5_block5_MB_pw_conv
>>>> Fuse conv bn: stack_5_block6_sortcut_conv
>>>> Fuse conv bn: stack_5_block6_MB_dw_
>>>> Fuse conv bn: stack_5_block6_MB_pw_conv
>>>> Fuse conv bn: stack_5_block7_sortcut_conv
>>>> Fuse conv bn: stack_5_block7_MB_dw_
>>>> Fuse conv bn: stack_5_block7_MB_pw_conv
>>>> Fuse conv bn: post_conv
>>>> Fuse conv bn stem_conv stem_bn
>>>> Fuse conv bn stack_0_block0_fu_conv stack_0_block0_fu_bn
>>>> Fuse conv bn stack_1_block0_sortcut_conv stack_1_block0_sortcut_bn
>>>> Fuse conv bn stack_1_block0_MB_pw_conv stack_1_block0_MB_pw_bn
>>>> Fuse conv bn stack_1_block1_sortcut_conv stack_1_block1_sortcut_bn
>>>> Fuse conv bn stack_1_block1_MB_pw_conv stack_1_block1_MB_pw_bn
>>>> Fuse conv bn stack_2_block0_sortcut_conv stack_2_block0_sortcut_bn
>>>> Fuse conv bn stack_2_block0_MB_pw_conv stack_2_block0_MB_pw_bn
>>>> Fuse conv bn stack_2_block1_sortcut_conv stack_2_block1_sortcut_bn
>>>> Fuse conv bn stack_2_block1_MB_pw_conv stack_2_block1_MB_pw_bn
>>>> Fuse conv bn stack_3_block0_sortcut_conv stack_3_block0_sortcut_bn
>>>> Fuse conv bn stack_3_block0_MB_dw_ stack_3_block0_MB_dw_bn
>>>> Fuse conv bn stack_3_block0_MB_pw_conv stack_3_block0_MB_pw_bn
>>>> Fuse conv bn stack_3_block1_sortcut_conv stack_3_block1_sortcut_bn
>>>> Fuse conv bn stack_3_block1_MB_dw_ stack_3_block1_MB_dw_bn
>>>> Fuse conv bn stack_3_block1_MB_pw_conv stack_3_block1_MB_pw_bn
>>>> Fuse conv bn stack_3_block2_sortcut_conv stack_3_block2_sortcut_bn
>>>> Fuse conv bn stack_3_block2_MB_dw_ stack_3_block2_MB_dw_bn
>>>> Fuse conv bn stack_3_block2_MB_pw_conv stack_3_block2_MB_pw_bn
>>>> Fuse conv bn stack_4_block0_sortcut_conv stack_4_block0_sortcut_bn
>>>> Fuse conv bn stack_4_block0_MB_dw_ stack_4_block0_MB_dw_bn
>>>> Fuse conv bn stack_4_block0_MB_pw_conv stack_4_block0_MB_pw_bn
>>>> Fuse conv bn stack_4_block1_sortcut_conv stack_4_block1_sortcut_bn
>>>> Fuse conv bn stack_4_block1_MB_dw_ stack_4_block1_MB_dw_bn
>>>> Fuse conv bn stack_4_block1_MB_pw_conv stack_4_block1_MB_pw_bn
>>>> Fuse conv bn stack_4_block2_sortcut_conv stack_4_block2_sortcut_bn
>>>> Fuse conv bn stack_4_block2_MB_dw_ stack_4_block2_MB_dw_bn
>>>> Fuse conv bn stack_4_block2_MB_pw_conv stack_4_block2_MB_pw_bn
>>>> Fuse conv bn stack_4_block3_sortcut_conv stack_4_block3_sortcut_bn
>>>> Fuse conv bn stack_4_block3_MB_dw_ stack_4_block3_MB_dw_bn
>>>> Fuse conv bn stack_4_block3_MB_pw_conv stack_4_block3_MB_pw_bn
>>>> Fuse conv bn stack_4_block4_sortcut_conv stack_4_block4_sortcut_bn
>>>> Fuse conv bn stack_4_block4_MB_dw_ stack_4_block4_MB_dw_bn
>>>> Fuse conv bn stack_4_block4_MB_pw_conv stack_4_block4_MB_pw_bn
>>>> Fuse conv bn stack_5_block0_sortcut_conv stack_5_block0_sortcut_bn
>>>> Fuse conv bn stack_5_block0_MB_dw_ stack_5_block0_MB_dw_bn
>>>> Fuse conv bn stack_5_block0_MB_pw_conv stack_5_block0_MB_pw_bn
>>>> Fuse conv bn stack_5_block1_sortcut_conv stack_5_block1_sortcut_bn
>>>> Fuse conv bn stack_5_block1_MB_dw_ stack_5_block1_MB_dw_bn
>>>> Fuse conv bn stack_5_block1_MB_pw_conv stack_5_block1_MB_pw_bn
>>>> Fuse conv bn stack_5_block2_sortcut_conv stack_5_block2_sortcut_bn
>>>> Fuse conv bn stack_5_block2_MB_dw_ stack_5_block2_MB_dw_bn
>>>> Fuse conv bn stack_5_block2_MB_pw_conv stack_5_block2_MB_pw_bn
>>>> Fuse conv bn stack_5_block3_sortcut_conv stack_5_block3_sortcut_bn
>>>> Fuse conv bn stack_5_block3_MB_dw_ stack_5_block3_MB_dw_bn
>>>> Fuse conv bn stack_5_block3_MB_pw_conv stack_5_block3_MB_pw_bn
>>>> Fuse conv bn stack_5_block4_sortcut_conv stack_5_block4_sortcut_bn
>>>> Fuse conv bn stack_5_block4_MB_dw_ stack_5_block4_MB_dw_bn
>>>> Fuse conv bn stack_5_block4_MB_pw_conv stack_5_block4_MB_pw_bn
>>>> Fuse conv bn stack_5_block5_sortcut_conv stack_5_block5_sortcut_bn
>>>> Fuse conv bn stack_5_block5_MB_dw_ stack_5_block5_MB_dw_bn
>>>> Fuse conv bn stack_5_block5_MB_pw_conv stack_5_block5_MB_pw_bn
>>>> Fuse conv bn stack_5_block6_sortcut_conv stack_5_block6_sortcut_bn
>>>> Fuse conv bn stack_5_block6_MB_dw_ stack_5_block6_MB_dw_bn
>>>> Fuse conv bn stack_5_block6_MB_pw_conv stack_5_block6_MB_pw_bn
>>>> Fuse conv bn stack_5_block7_sortcut_conv stack_5_block7_sortcut_bn
>>>> Fuse conv bn stack_5_block7_MB_dw_ stack_5_block7_MB_dw_bn
>>>> Fuse conv bn stack_5_block7_MB_pw_conv stack_5_block7_MB_pw_bn
>>>> Fuse conv bn post_conv post_bn
[]
ghost commented 1 year ago

Wow, everything works. Both for GPU and CPU

THANK YOU VERY MUCH!

image_z_000000 image_z_000001

leondgarse commented 1 year ago

That's great!