python - 如何使用预训练的 tensorflowlite 模型进行输入解释
问题描述
我正在使用一个预先训练的 tensorflow 光模型来使用我创建的一个简短程序来获取一些示例输出:
import cv2 as cv
import numpy as np
import os
import tensorflow as tf
import numpy as np
def decode_img(img):
# convert the compressed string to a 3D uint8 tensor
img = tf.image.decode_jpeg(img, channels=3)
# Use `convert_image_dtype` to convert to floats in the [0,1] range.
img = tf.image.convert_image_dtype(img, tf.float32)
# resize the image to the desired size.
return tf.reshape(tf.image.resize(img, [257, 257]), [1, 257, 257, 3])
model = tf.lite.Interpreter('models\posenet_mobilenet_v1_100_257x257_multi_kpt_stripped.tflite')
input_details = model.get_input_details()
output_details = model.get_output_details()
img = tf.io.read_file('photos\standing\\1.jpg')
input_data = decode_img(img)
print('input shape: {}'.format(input_data.shape))
model.set_tensor(input_details[0]['index'], input_data)
model.invoke()
output_data = model.get_tensor(output_details[0]['index'])
print('output: {}'.format(output_data))
输入形状打印到控制台后,没有其他反应,程序结束。应该打印输出的行永远不会执行。
输出:
C:\python imagetest.py 信息:初始化的 TensorFlow Lite 运行时。2020-01-21 08:07:32.567619: I tensorflow/core/platform/cpu_feature_guard.cc:145] 这个 TensorFlow 二进制文件使用 Intel(R) MKL-DNN 进行了优化,以在性能关键操作中使用以下 CPU 指令:AVX AVX2要在非 MKL-DNN 操作中启用它们,请使用适当的编译器标志重建 TensorFlow。2020-01-21 08:07:32.578283: I tensorflow/core/common_runtime/process_util.cc:115] 使用默认互操作设置创建新线程池:8. 使用 inter_op_parallelism_threads 进行调整以获得最佳性能。输入形状:(1, 257, 257, 3)
使用 Interpreter 类使用预训练的 tflite 模型的正确方法是什么?
解决方案
能够使用以下代码使其工作:
img = cv.imread('photos\standing\\3.jpg')
img = tf.reshape(tf.image.resize(img, [257,257]), [1,257,257,3])
model = tf.lite.Interpreter('models\posenet_mobilenet_v1_100_257x257_multi_kpt_stripped.tflite')
model.allocate_tensors()
input_details = model.get_input_details()
output_details = model.get_output_details()
floating_model = input_details[0]['dtype'] == np.float32
if floating_model:
img = (np.float32(img) - 127.5) / 127.5
model.set_tensor(input_details[0]['index'], img)
model.invoke()
output_data = model.get_tensor(output_details[0]['index'])
offset_data = model.get_tensor(output_details[1]['index'])
我注意到的唯一区别是对allocate_tensors()
.
推荐阅读
- c++ - 错误:未在此范围内声明“板”(C++)
- regex - 从 XML 中删除特定项目
- database - 在 Windows 10 上下载 MariaDB 列存储
- ios - 推送通知是否在 IOS 上受到限制和定价?
- python - 格式化 dask.diagnostics 进度条
- phpmailer - PHPMailer 有时无法连接到 SMTP 主机
- c# - DecryptByPassPhrase 的等效 C# 代码,反之亦然
- linux - 如何使用 sed 将 virsh xml 数据转换为 PCI BDF 格式
- unity3d - 导入到 unity 的 Blender 文件在每个轴上具有不同的缩放比例
- visual-studio-code - 在 vscode 中设置隐藏开发工具弹出窗口