如何在 tflite 模型中组合数据预处理代码(在 tflite 中集成数据预处理代码)
Posted
技术标签:
【中文标题】如何在 tflite 模型中组合数据预处理代码(在 tflite 中集成数据预处理代码)【英文标题】:How to combine data preprocessing code within tflite model (Integrate data preprocessing code within tflite) 【发布时间】:2021-11-16 03:39:58 【问题描述】:我有一个包含资产、变量和 saved_model.pb 的 SAVED_MODEL_PATH
SAVED_MODEL_PATH
资产 变量 saved_model.pb我可以使用以下代码(主要部分)将其转换为 tflite 模型
# Convert the model
converter = tf.compat.v1.lite.TFLiteConverter.from_saved_model(SAVED_MODEL_PATH)
tflite_model = converter.convert()
tflite_model_name = 'model.tflite'
# Save the model.
with open(tflite_model_name, 'wb') as f:
f.write(tflite_model)
现在,在使用解释器时,我需要将任意大小的图像转换为模型的要求。例如,我现有的模型需要 320 x 320 的图像,那么
读取图像
img = cv2.imread(IMAGE_PATH)
image_np = np.array(img)
预处理代码(需要将此代码与tflite模型结合)
input_tensor = tf.convert_to_tensor(np.expand_dims(image_np, 0), dtype=tf.float32)
input_data = tf.reshape(tf.image.resize(image_np, [320, 320]), [1, 320, 320, 3])
将预处理数据输入解释器
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print(output_data)
[[[0.05000001 0.55 0.85 0.95 ]
[0.17500001 0.12500003 0.375 0.5250001 ]
[0.5375 0.5375 0.7375001 0.6374999 ]
[0.6875 0.7625 0.7875 0.96250004]
[0.86249995 0.33749998 1.0625 0.4375 ]
[0.46678936 0.26678932 0.6082107 0.40821064]
[0.53357863 0.7335787 0.8164213 1.0164213 ]
[0.2125 0.7375 0.4125 0.83750004]
[0.61678934 0.66678935 0.75821066 0.8082107 ]
[0.29178935 0.86678934 0.43321067 1.0082107 ]]]
现在有什么方法可以调用任何对图像执行预处理以包含在 tflite 模型中的代码,以便在遇到图像时进行预处理(任何可能包括创建自定义转换函数的转换?) 例如,如果我们调整任意大小的图像(在这种情况下),它可以直接将图像转换为所需的大小(320 x 320 或根据要求的任何其他大小)?
【问题讨论】:
正如@sakumoil 所述,您可以在现有模型中添加Resizing
层,以在给定固定形状的情况下调整输入的大小。
这可以在训练期间添加,但在这里我想在我们已经有了 tflite 模型后进行集成。规范化也是一部分,我想灵活地进行自定义转换。希望你明白了
我希望我编辑的答案能够有所帮助。
我认为您要求 TFLite 支持库或带有 ImageProcessor 的任务库(您必须将元数据添加到 .tflite 文件)。检查文档tensorflow.org/lite/inference_with_metadata/lite_support 和tensorflow.org/lite/inference_with_metadata/task_library/…
【参考方案1】:
tf.keras.layers.Resizing
(https://www.tensorflow.org/api_docs/python/tf/keras/layers/Resizing) 可以在您的模型中使用。
编辑: 更新答案:
您可以定期训练模型,在训练并转换为 TFLite 后,您可以将预处理层添加到模型的开头。
首先,让我们创建一个虚拟模型:
model = tf.keras.models.Sequential(
[
tf.keras.layers.Conv2D(32, 3, 1, 'same'),
tf.keras.layers.Conv2D(32, 3, 1, 'same')
]
)
model.build(input_shape=(1, 64, 64, 3))
model.summary()
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (1, 64, 64, 32) 896
_________________________________________________________________
conv2d_1 (Conv2D) (1, 64, 64, 32) 9248
=================================================================
Total params: 10,144
Trainable params: 10,144
Non-trainable params: 0
接下来,我们将调整大小的层添加到模型中并再次打印summary
:
model2 = tf.keras.models.Sequential(
[
tf.keras.layers.Resizing(64, 64),
model
]
)
model2.build(input_shape=(1, 128, 128, 3))
model2.summary()
Layer (type) Output Shape Param #
=================================================================
resizing (Resizing) (1, 64, 64, 3) 0
_________________________________________________________________
sequential (Sequential) (1, 64, 64, 32) 10144
=================================================================
Total params: 10,144
Trainable params: 10,144
Non-trainable params: 0
然后我们可以将模型转换为TFLite
并可视化它:
converter = tf.lite.TFLiteConverter.from_keras_model(model2)
tflite_model = converter.convert()
open("test.tflite", "wb").write(tflite_model)
现在我们有一个 TFLite 模型,其中在模型训练后添加了预处理层。
【讨论】:
谢谢@sakumoil。但是,它只是解决如何将图像调整大小的东西添加到管道中。我希望在模型中加入任何转换函数。 Tensorflow Keras 还有其他转换层,如rescaling、reshape、normalization、padding。希望其中一些有用。以上是关于如何在 tflite 模型中组合数据预处理代码(在 tflite 中集成数据预处理代码)的主要内容,如果未能解决你的问题,请参考以下文章
Swift:处理 UIImage 数据以用于 Firebase 自定义 TFLite 模型