【问题标题】:How can I convert yolo weights to tflite file如何将 yolo 权重转换为 tflite 文件
【发布时间】:2020-05-04 04:21:10
【问题描述】:

我将在 android 中使用 yolo 权重,所以我打算将 yolo 权重文件转换为 tflite 文件。

我在 anaconda 提示符中使用此代码,因为我在 env 中下载了 keras 库。

activate env   
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

终于成功了。将 Keras 模型保存到 model_data/yolo.h5

我将使用此代码将此 h5 文件转换为 jupyter notebook 中的tflite 文件。

model = tf.keras.models.load_model("./yolo/yolo.h5", compile=False)
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
open("keras_model.tflite", "wb").write(tflite_model)

但是会出现这个错误。


ValueError                                Traceback (most recent call last)

<ipython-input-3-964a59978091> in <module>()

  1 model = tf.keras.models.load_model("./yolo/yolo.h5", compile=False)

  2 converter = tf.lite.TFLiteConverter.from_keras_model(model)

----> 3 tflite_model = converter.convert()

  4 open("keras_model.tflite", "wb").write(tflite_model)



~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\lite\python\lite.py in convert(self)

426         raise ValueError(

427             "None is only supported in the 1st dimension. Tensor '{0}' has "

--> 428             "invalid shape '{1}'.".format(_get_tensor_name(tensor), shape_list))

429       elif shape_list and shape_list[0] is None:

430         # Set the batch size to 1 if undefined.



ValueError: None is only supported in the 1st dimension. Tensor 'input_1' has invalid shape '[None, None, None, 3]'.

我该如何解决?


我们的模型总结是

型号:“model_1”


层(类型)输出形状参数#连接到

input_1 (InputLayer) [(无, 无, 无, 0


conv2d_1 (Conv2D)(无,无,无,3 864 input_1[0][0]


batch_normalization_1 (BatchNor (None, None, None, 3 128 conv2d_1[0][0])


leaky_re_lu_1 (LeakyReLU) (无, 无, 无, 3 0 batch_normalization_1[0][0]


zero_padding2d_1(ZeroPadding2D(无,无,无,3 0leaky_re_lu_1[0][0])


conv2d_2 (Conv2D) (无, 无, 无, 6 18432 zero_padding2d_1[0][0]


batch_normalization_2 (BatchNor (None, None, None, 6 256 conv2d_2[0][0])


leaky_re_lu_2 (LeakyReLU) (无, 无, 无, 6 0 batch_normalization_2[0][0]


conv2d_3 (Conv2D)(无,无,无,3 2048leaky_re_lu_2[0][0]


。 . . .


batch_normalization_65(批号(无,无,无,5 2048 conv2d_66[0][0])


batch_normalization_72(批号(无,无,无,2 1024 conv2d_74[0][0])


leaky_re_lu_58(LeakyReLU)(无,无,无,1 0 batch_normalization_58[0][0]


leaky_re_lu_65 (LeakyReLU) (无, 无, 无, 5 0 batch_normalization_65[0][0]


leaky_re_lu_72 (LeakyReLU) (无,无,无,2 0 batch_normalization_72[0][0]


conv2d_59 (Conv2D)(无,无,无,2 261375leaky_re_lu_58[0][0]


conv2d_67(Conv2D)(无,无,无,2 130815leaky_re_lu_65[0][0]


conv2d_75 (Conv2D)(无,无,无,2 65535leaky_re_lu_72[0][0]

总参数:62,001,757 可训练参数:61,949,149 不可训练参数:52,608


【问题讨论】:

  • 你能发布什么是输出model.summary()
  • 在 tflite 中,batc_size 不接受任何人。因此,您需要提供输入图像的大小。

标签: python tensorflow keras tensorflow-lite yolo


【解决方案1】:

我看到您正在获取 Keras YOLO 模型的 H5 文件。对于 TFLite 模型,您需要一个具有明确输入形状的模型,例如 ( 256 , 256 , 3 )。此外,对于 H5 模型,您无法在模型保存后修改输入形状。所以,你可以采取这些措施,

  • 转到模型及其层实例化的文件,在那里修改输入形状。使用该固定输入大小重新训练模型。
  • 使用TFLite Object Detection API。这也有一个Android sample app
  • 使用提到的 DarkNet 训练模型 here
  • 如果您尝试检测 PASCAL 中存在的 20 个类之一,请使用此model

【讨论】:

    【解决方案2】:

    我建议这样做:

    1. 将暗网权重 (.weights) 转换为 TensorFlow 冻结图格式 (.pb)。
    2. 将此.pb 文件转换为tflite。

    这个过程比较简单。我已经记录了一些将 Darknet 转换为 TensorFlow 的 3-4 种方法。请找到他们here

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 2022-07-08
      • 1970-01-01
      • 2019-04-14
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多