如何在 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 模型

如何将 TensorFlow 模型转换为 TFLite 模型

如何在图像分类上快速运行 tflite 模型

如何在脚本中加载 tflite 模型?

如何使用tf训练好的模型

如何使用相同的测试数据测试 .tflite 模型以证明它的行为与原始模型相同?