我将在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笔记本中的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)
~Anaconda3envstensorflowlibsite-packagestensorflow_corelitepythonlite.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输入_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]
conv2d_2(conv2d((无、无、无,6 18432 zero_padding2d_1[0][0]
batch_normalization_2(BatchNor(无、无、无,6 256 conv2d_2[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(批次号(无、无、无,5 2048 conv2d_66[0][0]
batch_normalization_72(批次号(无、无、无,2 1024 conv2d_74[0][0]
leaky_re_lu_58(LeakyReLU((无、无、无,10批次正常化_58[0][0]
leaky_re_lu_65(LeakyReLU((无、无、无,5 0批次正常化_65[0][0]
leaky_re_lu_72(LeakyReLU((无、无、无,2 0 batch_normalization_72[0][0]
conv2d_59(conv2d((无、无、无,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]
总参数:62001757可培训参数:61949149不可训练参数:52608
我看到您正在获得Keras YOLO模型的H5文件。对于TFLite模型,您需要一个具有明确输入形状的模型,如( 256 , 256 , 3 )
。此外,对于H5模型,保存模型后不能修改输入形状。所以,你可以采取这些措施,
- 转到实例化模型及其层的文件,在那里修改输入形状。使用固定的输入大小重试模型
- 使用TFLite对象检测API。这也有一个Android示例应用程序
- 使用此处提到的DarkNet训练模型
- 如果您试图检测PASCAL中存在的20个类中的一个,请使用此模型
我建议这样做:
- 将暗网权重(
.weights
(转换为TensorFlow冻结图格式(.pb
( - 将此
.pb
文件转换为tflite
此过程更简单。我已经记录了一些3-4种将暗网转换为TensorFlow的方法。请在这里找到它们。