Как я могу преобразовать веса Yolo в файл Tflite - PullRequest
1 голос
/ 04 мая 2020

Я буду использовать весовые коэффициенты yolo в android, поэтому я планирую преобразовать файл весовых коэффициентов yolo в файл tflite.

Я использую этот код в приглашении anaconda, поскольку я загрузил библиотеку keras в env.

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

Наконец-то все получилось. Сохраненная модель Keras в model_data/yolo.h5

И я собираюсь преобразовать этот файл h5 в tflite файл в блокноте jupyter с этим кодом.

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 (Нет, Нет, нет, 3 128 conv2d_1 [0] [0]


leaky_re_lu_1 (LeakyReLU) (Нет, Нет, Нет, 3 0 batch_normalization_1 [0] [0]


zero_padding2d_1 (ZeroPadding2D (Нет, нет, нет, 3 0 leaky_re_lu_1 [0] [0] 0]


conv2d_2 (Conv2D) (Нет, Нет, Нет, 6 18432 zero_padding2d_1 [0] [0]


batch_normalization_2 (BatchNor (Нет, нет, нет, 6 256 conv2d_2 [0] [0] [0] ]


leaky_re_lu_2 (LeakyReLU) (Нет, Нет, Нет, 6 0 batch_normalization_2 [0] [0]


conv2d_3 (Conv2D) (Нет, нет, нет, нет, 3 2048 leaky_re_lu_2 [0] [0]


. , , .


batch_normalization_65 (BatchNo (Нет, Нет, Нет, 5 2048 conv2d_66 [0] [0]


batch_normalization_72 (BatchNo (Нет, нет, нет, 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 261375 leaky_re_lu_58 [0] [0]


conv2d_67 (Conv2D) (Нет, нет, нет, 2 130815 leaky_re_lu_65 [0] [ 0]


conv2d_75 (Conv2D) (Нет, Нет, Нет, 2 65535 leaky_re_lu_72 [0] [0]

Всего параметров: 62 ​​001 757 Обучаемые параметры: 61 949 149 Необучаемые параметры: 52 608


Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Я бы порекомендовал сделать это:

  1. Преобразовать веса Дар knet (.weights) в формат замороженного графика TensorFlow (.pb).
  2. Преобразовать это .pb файл в tflite.

Этот процесс проще. Я задокументировал около 3-4 методов для преобразования Dar knet в TensorFlow. Просьба найти их здесь:

https://medium.com/@prashantdandriyal7 / дар knet -тензор-поток-тензор-поток-b783d55b106a

0 голосов
/ 04 мая 2020

Я вижу, что вы получаете файл H5 модели Keras YOLO. Для моделей TFLite вам потребуется модель с определенной формой ввода, например ( 256 , 256 , 3 ). Кроме того, для модели H5 вы не можете изменить входную форму после сохранения модели. Таким образом, вы можете принять эти меры,

  • Go, в файл, в котором создается модель и ее слои, измените там форму ввода. Восстановите модель, используя этот фиксированный размер ввода.
  • Используйте API обнаружения объектов TFLite . Здесь также есть Android пример приложения .
  • Обучите модель, используя Dar kNet, как упоминалось здесь .
  • Если вы пытаясь обнаружить один из 20 классов, присутствующих в PASCAL, используйте эту модель .
...