我tf.keras.Model在将自定义循环中经过训练的子类模型 ( )转换为 TFLite 时遇到问题。
假设我们有一个小的 CNN 架构,它使用输入数据 ( x) 和取决于批量大小和其他维度 ( add_info) 的附加信息:
class ContextExtractor(tf.keras.Model):
def __init__(self):
super().__init__()
self.model = self.__get_model()
def call(self, x, training=False, **kwargs):
b, h, w, c = x.shape
add_info = tf.zeros((b, h, w, c), dtype=tf.float32)
features = self.model(tf.concat([x, add_info], axis=-1), training=training)
return features
def __get_model(self):
return self.__get_small_cnn()
def __get_small_cnn(self):
model = tf.keras.Sequential()
model.add(layers.Conv2D(32, (3, 3), strides=(2, 2), padding='same'))
model.add(layers.LeakyReLU(alpha=0.2))
model.add(layers.Conv2D(32, (3, 3), strides=(2, 2), padding='same'))
model.add(layers.LeakyReLU(alpha=0.2))
model.add(layers.Conv2D(64, (3, 3), strides=(2, 2), …Run Code Online (Sandbox Code Playgroud) 我想知道是否有办法知道 tflite 中特定节点的输入和输出列表?我知道我可以获得输入/输出详细信息,但这不允许我重建Interpreter. 所以我要做的是:
interpreter = tf.lite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
interpreter.get_tensor_details()
Run Code Online (Sandbox Code Playgroud)
最后 3 个命令基本上为我提供了似乎没有必要信息的字典。
所以我想知道是否有办法知道每个节点的输出去哪里?当然Interpreter以某种方式知道这一点。我们可以吗?谢谢。
我从姿势估计 tflite 模型开始,用于获取人类的关键点。
https://www.tensorflow.org/lite/models/pose_estimation/overview
我已经开始拟合单个图像或一个人并调用模型:
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'])# o()
offset_data = model.get_tensor(output_details[1]['index'])
results = np.squeeze(output_data)
offsets_results = np.squeeze(offset_data)
print("output shape: {}".format(output_data.shape))
np.savez('sample3.npz', results, offsets_results)
Run Code Online (Sandbox Code Playgroud)
但我正在努力正确解析输出以获得每个身体部位的坐标/置信度。有没有人有解释这个模型结果的 python 例子?(例如:使用它们将关键点映射回原始图像)
我的代码(一个类的片段,它基本上直接从模型输出中获取 np 数组):
def get_keypoints(self, data):
height, width, num_keypoints = data.shape
keypoints = []
for keypoint in range(0, …Run Code Online (Sandbox Code Playgroud) implementation 'org.tensorflow:tensorflow-lite:+'在我的build.gradle依赖项下推理时间不是那么好,所以现在我想在 Android 的 NDK 中使用 TFL。
所以我在 Android Studio 的 NDK 中构建了 Java 应用程序的精确副本,现在我试图在项目中包含 TFL 库。我按照TensorFlow-Lite 的 Android 指南在本地构建了 TFL 库(并获得了一个 AAR 文件),并将该库包含在我在 Android Studio 中的 NDK 项目中。
现在我试图在我的 C++ 文件中使用 TFL 库,尝试#include在代码中使用它,但我收到一条错误消息:(cannot find tensorflow或我尝试使用的任何其他名称,根据我在我的CMakeLists.txt文件)。 …
我正在使用 TensorFlow 2.1 来训练具有量化感知训练的模型。
这样做的代码是:
import tensorflow_model_optimization as tfmot
model = tfmot.quantization.keras.quantize_annotate_model(model)
Run Code Online (Sandbox Code Playgroud)
这将向图中添加假量化节点。这些节点应该调整模型的权重,以便它们更容易被量化为 int8 并使用 int8 数据。
训练结束后,我将模型转换并量化为 TF-Lite,如下所示:
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = [give data provider]
quantized_tflite_model = converter.convert()
Run Code Online (Sandbox Code Playgroud)
在这一点上,我不希望在 TL-Lite 图中看到假量化层。但令人惊讶的是,我确实看到了它们。此外,当我在 TF-Lite C++示例应用程序中运行这个量化模型时,我发现它在推理过程中也在运行假量化节点。除此之外,它还对每层之间的激活进行反量化和量化。
这是 C++ 代码的输出示例:
节点 0 运算符内置代码 80 FAKE_QUANT
输入:1
输出:237
节点 1 运算符内置代码 114 QUANTIZE
输入:237
输出:238
节点 2 运算符内置代码 3 CONV_2D
输入:238 59 58
输出:167 运算符内置代码 6
临时代码:237
DEQUANTIZE
输入:167
输出:239
节点 4 运算符内置代码 80 FAKE_QUANT
输入:239
输出:166 …
quantization tensorflow tensorflow-lite quantization-aware-training
我已经从谷歌下载了一个用于 Tensorflow.js (tfjs) 的预训练 PoseNet 模型,所以它是一个json文件。
但是,我想在Android上使用它,所以我需要.tflite模型。虽然有人在这里将类似的模型从 tfjs 移植到 tflite ,但我不知道他们转换了什么模型(PoseNet 有很多变体)。我想自己做这些步骤。另外,我不想运行一些有人上传到 stackOverflow 文件中的任意代码:
注意:小心不受信任的代码——TensorFlow 模型就是代码。有关详细信息,请参阅安全使用 TensorFlow。Tensorflow 文档
有谁知道任何方便的方法来做到这一点?
我使用 OpenCV 边缘检测功能开发了 Android 文档扫描仪,该功能无法一直按预期工作,并且需要特殊背景才能像深色纯背景一样正常工作。此外,文档颜色可能会影响文档边缘检测的准确性。所有这些要求对应用程序用户来说都是真正的挫败感。
在互联网上搜索我了解到 google play 上的所有专业移动文档扫描仪都使用机器学习,如 Tensorflow 或任何其他 DML,以便扫描仪应用程序在任何情况下都能以极高的准确性工作。
我浏览了 TensorFlow 示例,例如图像分类和图像分割。我不知道这些是否可以用于文档边缘检测。任何人都可以帮助我使用 TensorFlow 开发 android 文档边缘检测应用程序(文档扫描仪)。
谢谢
android document edge-detection image-scanner tensorflow-lite
我有一个与模型动物园中的所有模型相同的已保存的 tensorflow 模型。
我想将其转换为 tesorflow lite,我从 tensorflow github 中找到了以下方法(我的 tensorflw 版本是 2):
!wget http://download.tensorflow.org/models/object_detection/tf2/20200711/ssd_resnet50_v1_fpn_640x640_coco17_tpu-8.tar.gz
# extract the downloaded file
!tar -xzvf ssd_resnet50_v1_fpn_640x640_coco17_tpu-8.tar.gz
Run Code Online (Sandbox Code Playgroud)
!pip install tf-nightly
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model('ssd_mobilenet_v2_320x320_coco17_tpu-8/saved_model')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.experimental_new_converter = True
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS]
tflite_model = converter.convert()
open("m.tflite", "wb").write(tflite_model)
Run Code Online (Sandbox Code Playgroud)
但是转换模型的输出和输入形状与原始模型不匹配,请检查以下内容:
所以这里有问题!输入/输出形状应该与原始模型相匹配!任何的想法?
我有一个Tensorflow基于的模型BoostedTreesClassifier,我想借助Tensorflow Lite.
但是,当我尝试将我的模型转换为Tensorflow Lite模型时,我收到一条错误消息,指出存在不受支持的操作(截至Tensorflow v2.3.1):
tf.BoostedTreesBucketize
tf.BoostedTreesEnsembleResourceHandleOp
tf.BoostedTreesPredict
tf.BoostedTreesQuantileStreamResourceGetBucketBoundaries
tf.BoostedTreesQuantileStreamResourceHandleOp
Run Code Online (Sandbox Code Playgroud)
添加tf.lite.OpsSet.SELECT_TF_OPS选项有点帮助,但仍有一些操作需要自定义实现:
tf.BoostedTreesEnsembleResourceHandleOp
tf.BoostedTreesPredict
tf.BoostedTreesQuantileStreamResourceGetBucketBoundaries
tf.BoostedTreesQuantileStreamResourceHandleOp
Run Code Online (Sandbox Code Playgroud)
我也试过Tensorflow v2.4.0-rc3,这将集合减少到以下一个:
tf.BoostedTreesEnsembleResourceHandleOp
tf.BoostedTreesPredict
Run Code Online (Sandbox Code Playgroud)
转换代码如下:
converter = tf.lite.TFLiteConverter.from_saved_model(model_path, signature_keys=['serving_default'])
converter.target_spec.supported_ops = [
tf.lite.OpsSet.TFLITE_BUILTINS,
tf.lite.OpsSet.SELECT_TF_OPS
]
tflite_model = converter.convert()
Run Code Online (Sandbox Code Playgroud)
signature_keys明确指定,因为导出的模型BoostedTreesClassifier#export_saved_model具有多个签名。
除了为不受支持的 ops 编写自定义实现之外,有没有办法在移动设备上部署这个模型?
我有一个使用 sigmoid 函数进行二元分类的 Keras 模型。我编译了我的模型以.tflite按照 Coral USB 的要求进行格式化以运行推理。但是,我注意到该脚本classify_image.py执行多类分类。因此,当我尝试对图像进行分类时,我对任何图像都得到了 100% 的预测。例如,我的模型将红外图像分类为发烧状态。即使我传球图像,它也会为发烧级提供 100% 阳性。
因此,我再次使用完全自定义的模型对植物使用 layer softmax 测试了多类模型,这一次它起作用了。它为植物 A、植物 B 和植物 C 提供了合理的 85% 准确度。
因此,我想知道我需要做哪些更改,才能使用二进制分类自定义模型与 Pycoral 配合使用。
这是我用于分类的代码:
import argparse
import time
from PIL import Image
from pycoral.adapters import classify
from pycoral.adapters import common
from pycoral.utils.dataset import read_label_file
from pycoral.utils.edgetpu import make_interpreter
import cv2 as cv
import numpy as np
def main():
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-m', '--model', required=True,
help='File path of .tflite file.')
parser.add_argument('-i', '--input', required=True, …Run Code Online (Sandbox Code Playgroud) python machine-learning tensorflow tensorflow-lite google-coral
tensorflow-lite ×10
tensorflow ×8
python ×4
android ×1
android-ndk ×1
c++ ×1
document ×1
google-coral ×1
gradle ×1
keras ×1
quantization ×1
quantization-aware-training ×1
tensorflow2 ×1
tf.keras ×1