我在将SSD对象检测模型转换为EdgeTPU的uint8 TFLite时遇到问题。
据我所知,我一直在不同的论坛上搜索堆栈溢出线程和github问题,我认为我正在采取正确的步骤。我的jupyter笔记本肯定出了问题,因为我无法实现我的提议。
我正在与您分享我在Jupyter笔记本上解释的步骤。我认为情况会更加清楚。
#!/usr/bin/env python
# coding: utf-8
import os
import pathlib
# Clone the tensorflow models repository if it doesn't already exist
if "models" in pathlib.Path.cwd().parts:
while "models" in pathlib.Path.cwd().parts:
os.chdir('..')
elif not pathlib.Path('models').exists():
!git clone --depth 1 https://github.com/tensorflow/models
import matplotlib
import matplotlib.pyplot as plt
import pathlib
import os
import random
import io
import imageio
import glob
import scipy.misc
import numpy as np
from six import BytesIO
from PIL import Image, ImageDraw, ImageFont
from IPython.display import display, Javascript
from IPython.display import Image as IPyImage
import tensorflow as tf
import tensorflow_datasets as tfds
from object_detection.utils import label_map_util
from object_detection.utils import config_util
from object_detection.utils import visualization_utils as viz_utils
#from object_detection.utils import colab_utils
from object_detection.utils import config_util
from object_detection.builders import model_builder
%matplotlib inline
# Download the checkpoint and put it into models/research/object_detection/test_data/
!wget http://download.tensorflow.org/models/object_detection/tf2/20200711/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz
!tar -xf ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz
!if [ -d "models/research/object_detection/test_data/checkpoint" ]; then rm -Rf models/research/object_detection/test_data/checkpoint; fi
!mkdir models/research/object_detection/test_data/checkpoint
!mv ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/checkpoint models/research/object_detection/test_data/
PATH_TO_LABELS = '/home/jose/codeWorkspace-2.4.1/tf_2.4.1/models/research/object_detection/data/mscoco_label_map.pbtxt'
category_index = label_map_util.create_category_index_from_labelmap(PATH_TO_LABELS, use_display_name=True)
!tflite_convert --saved_model_dir=/home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/saved_model --output_file=/home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/model.tflite
def representative_dataset_gen():
folder = "/home/jose/codeWorkspace-2.4.1/tf_2.4.1/images_ssd_mb2_2"
image_size = 320
raw_test_data = []
files = glob.glob(folder+'/*.jpeg')
for file in files:
image = Image.open(file)
image = image.convert("RGB")
image = image.resize((image_size, image_size))
#Quantizing the image between -1,1;
image = (2.0 / 255.0) * np.float32(image) - 1.0
#image = np.asarray(image).astype(np.float32)
image = image[np.newaxis,:,:,:]
raw_test_data.append(image)
for data in raw_test_data:
yield [data]
####THIS IS A RANDOM-GENERATED DATASET####
def representative_dataset_gen():
for _ in range(320):
data = np.random.rand(1, 320, 320, 3)
yield [data.astype(np.float32)]
converter = tf.lite.TFLiteConverter.from_saved_model('/home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/saved_model')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8, tf.lite.OpsSet.SELECT_TF_OPS]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
converter.allow_custom_ops = True
converter.representative_dataset = representative_dataset_gen
tflite_model = converter.convert()
转换步骤返回警告。
警告:absl:对于包含无法量化的不支持操作的模型输入,inference_input_type
属性将默认为原始类型。警告:absl:对于包含无法量化的不支持操作的模型输出,inference_output_type
属性将默认为原始类型。
这让我觉得转换不正确。
with open('/home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/model_full_integer_quant.tflite'.format('/home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/saved_model'), 'wb') as w:
w.write(tflite_model)
print("tflite convert complete! - {}/home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/model_full_integer_quant.tflite".format('/home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/saved_model'))
我读到建议每晚使用。所以在我的情况下,版本是2.6.0
print(tf.version.VERSION)
interpreter = tf.lite.Interpreter(model_path="/home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/model_full_integer_quant.tflite")
interpreter.allocate_tensors()
print(interpreter.get_input_details())
print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
print(interpreter.get_output_details())
我收到以下信息:
[{'name':'serving_default_input: 0','index': 0,'form':数组([1,320,320,3], dtype=int32),'shape_signature':数组([1,320,320,3], dtype=int32),'dtype':
[{'name'name': '有状态分区呼叫:31', '索引': 377, 'shape': 数组([ 1, 10, 4], dtype=int32), “shape_signature”: 数组([ 1, 10, 4], dtype=int32), 'dtype':
所以,我认为它没有正确量化它。
!edgetpu_compiler -s /home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/model_full_integer_quant.tflite
jose@jose-VirtualBox:~/python-envs$edgetpu_compiler-s/home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/model_full_integer_quant。tflite Edge TPU编译器版本15.0.340273435
模型在 1136 ms 内成功编译。
输入型号: /home/jose/codeWorkspace-2.4.1/tf_2.4.1/tflite/model_full_integer_quant.tflite输入尺寸: 3.70MiB输出型号:model_full_integer_quant_edgetpu.tflite输出尺寸: 4.21MiB用于缓存模型参数的片上存储器: 3.42MiB用于缓存模型参数的片上存储器: 4.31MiB用于流式传输未缓存模型参数的片外存储器:0.00B边缘TPU子图数: 1操作总数: 162操作日志:model_full_integer_quant_edgetpu.log
模型已成功编译,但Edge TPU并不支持所有操作。模型的一部分将在CPU上运行,这要慢一些。如果可能,请考虑更新您的模型以仅使用边TPU支持的操作。有关详细信息,请访问g.co/coral/model-reqs.将在Edge TPU上运行的操作数:112将在CPU上运行的操作数:50
操作员计数状态
以其他方式支持 LOGISTIC 1 操作,但由于某些未指定的限制而未映射 DEPTHWISE_CONV_2D 14 不支持多个子图 DEPTHWISE_CONV_2D 37 映射到边缘 TPU QUANTIZE 1 映射到 Edge TPU QUANTIZE 4 否则支持操作,但由于某些未指定的限制而未映射 CONV_2D
58 映射到边缘 TPU CONV_2D 14
不支持
多个子图 1 操作正在处理不受支持的数据类型 DEQUANTIZE 1 操作受其他支持,但由于某些未指定的限制而无法映射 自定义 1
操作正在处理不受支持的数据类型 ADD
2 不支持多个子图 ADD
10 映射到 Edge TPU 串联 1
否则支持操作,但由于某些未指定的限制而未映射 串联 1 多个子图不受支持 RESHAPE 2
其他方面支持操作,但由于某些未指定的限制,无法映射 RESHAPE 6
映射到 Edge TPU RESHAPE 4 不支持多个子图 PACK 4
张量具有不受支持的秩(最多映射 3 个最内侧的尺寸)
我准备的jupyter笔记本可以在以下链接找到:https://github . com/jagumiel/Artificial-Intelligence/blob/main/tensor flow-scripts/Step-by-Step-explaining-problems . ipynb
我错过了什么步骤吗?为什么没有导致我的转变?
提前非常感谢。
正如@JaesungChung回答的那样,这个过程做得很好。
我的问题出在运行. tflite模型的应用程序上。我将模型输出量化为uint8,因此我必须重新缩放获得的值以获得正确的结果。
也就是说,我有10个对象,因为我请求所有检测到的分数高于0.5的对象。我的结果没有缩放,所以检测到的物体得分可能完全是104。我不得不重新调整这个数字除以255。
在绘制我的结果时也发生了同样的情况。所以我必须除以这个数字,再乘以高度和宽度。
问题内容: 请考虑以下情况: 我本来希望有一个允许将错误值(例如that )转换为s的转换的选项。有没有办法做到这一点? 问题答案: 使用[](http://pandas.pydata.org/pandas- docs/stable/generated/pandas.to_numeric.html)与 如果需要填写,请使用。 注意,在可能的情况下,将尝试将浮点型转换为整数。如果不需要,请删除该参数
问题内容: 我有一个JSON对象,我将其转换为并在此处进行一些处理。稍后,我想转换相同的缓冲区数据以转换为有效的JSON对象。 我正在研究Node V6.9.1 下面是我尝试过的代码,但是当我转换回JSON却无法打开该对象时遇到了。 所以我尝试使用检查方式打印整个对象 如果我尝试像数组一样读取它 我也尝试解析它抛出 我需要将其视为我创建的真实对象(我的意思是像上面声明的那样)。 请帮忙.. 问题答
问题内容: 如何从float转换为string或从string转换为float? 在我的情况下,我需要在2个值字符串(我从表中获得的值)和我计算出的浮点值之间进行断言。 我尝试从浮动到字符串: 但是断言失败 问题答案: 使用Java的类。 为了进行比较,将字符串转换为float并比较两个float总是更好。这是因为对于一个浮点数,存在多个字符串表示形式,与字符串相比,它们是不同的(例如“ 25”!
我已经使用Keras来微调MobileNet v1。现在我有,我需要将其转换为TensorFlow Lite,以便在Android应用程序中使用。 我使用TFLite转换脚本。我可以在没有量化的情况下进行转换,但我需要更高的性能,所以我需要进行量化。 如果我运行此脚本: 它失败了: F tensorflow/contrib/lite/toco/tooling\u util。cc:1634]Arra
我已经使用tensorflow后端训练了一个DNN,我想在FireBase中托管它。训练好的模型被保存为.meta文件,我尝试使用下面的代码将模型转换为tflite,但我遇到了一些错误。那么我如何将这个模型转换成Tensorflow Lite呢?
我目前在转换张量流时遇到问题。pb模型到TFlite格式。我目前正在遵循谷歌代码实验室的指示,错误说 Traceback(最近调用的最后一次):文件/usr/local/bin/tflite_convert,第5行,在tensorflow.lite.python.tflite_convert导入主重要错误:没有模块命名lite.python.tflite_convert 我正在使用谷歌提供的命令