如何将使用 Tensorflow (python) 训练的模型转换为与 TensorflowJS 一起使用,而不涉及 IBM 云(从我现在的步骤开始)?

2024-02-09

我正在尝试做什么

我正在尝试学习 TensorFlow 对象识别,并且像往常一样学习新事物,我在网上搜索教程。我不想涉及任何第三方云服务或 Web 开发框架,我想学习仅使用本机 JavaScript、Python 和 TensorFlow 库来完成它。

到目前为止我所拥有的

到目前为止,我已经关注了TensorFlow 对象检测教程 https://github.com/nicknochnack/TFODCourse/blob/main/2.%20Training%20and%20Detection.ipynb(伴随着)到我已经在 Tensorflow (python) 中训练了一个模型,并希望将其转换为通过 TensorflowJS 在浏览器中运行。我还尝试过其他教程,但似乎没有找到一个可以解释如何在没有第三方云/工具和 React 的情况下执行此操作的教程。

我知道为了使用这个模型tensorflow.js我的目标是获取如下文件:

  • group1-shard1of2.bin
  • group1-shard2of2.bin
  • labels.json
  • model.json

我已经创建了 TFRecord 文件并开始训练:

py Tensorflow\models\research\object_detection\model_main_tf2.py --model_dir=Tensorflow\workspace\models\my_ssd_mobnet --pipeline_config_path=Tensorflow\workspace\models\my_ssd_mobnet\pipeline.config --num_train_steps=100

似乎在训练模型后,我留下了:

  • 文件名为checkpoint, ckpt-1.data-00000-of-00001, ckpt-1.index, pipeline.config
  • 预训练模型(我相信这不是训练期间更改的文件,对吧?)ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8

我确信从这一步到我需要的文件并不难,但老实说,我浏览了很多文档和教程以及谷歌,但没有看到在没有第三方云服务的情况下执行此操作的示例。也许在文档中,我遗漏了一些明显的东西。

项目目录结构如下所示:

我在哪里寻找答案

出于某种原因,令人沮丧的是,我发现的每一个使用预先训练的 Tensorflow 模型通过 TensorFlowJS 进行对象检测的教程(包括上面链接的教程)都需要使用 IBM Cloud 和 ReactJS。也许他们都是从他们找到的一些教程中复制的,现在所有教程都包含这个,我不知道。我所知道的是我正在建造一个Electron.js https://www.electronjs.org/假设计算发生在用户的设备上,桌面应用程序和对象检测不需要网络连接。澄清一下:我正在创建一个应用程序,用户可以在其中训练模型,因此这不仅仅是一次性转换的问题。我希望能够使用 Python Tensorflow 进行训练并将模型转换为在 JavaScript Tensorflow 上运行,而无需任何云 API。

所以我停止寻找教程并尝试直接查看文档https://github.com/tensorflow/tfjs https://github.com/tensorflow/tfjs.

当你到达关于导入预训练模型的部分 https://github.com/tensorflow/tfjs#importing-pre-trained-models, 它说:

导入预先训练的模型

我们支持从以下位置移植预训练模型:

TensorFlow 保存模型 https://github.com/tensorflow/tfjs-converter

Keras https://js.tensorflow.org/tutorials/import-keras.html

因此,我点击了 Tensorflow SavedModel 的链接,这将我们带到了一个名为tfjs-转换器 https://github.com/tensorflow/tfjs-converter/tree/master/tfjs-converter。该回购说:

该存储库已存档以支持tensorflow/tfjs。

该存储库将保留一段时间以保留历史,但所有 未来的 PR 应发送至张量流/tfjs https://github.com/tensorflow/tfjs在 tfjs 核心内部 文件夹。

所有历史和贡献都保存在 monorepo 中。

这听起来有点像对我的循环引用,考虑到它引导我到刚刚告诉我去这里的页面。所以此时您很想知道整个库是否已被弃用,它会起作用还是什么?无论如何,我在这个仓库中四处查看:https://github.com/tensorflow/tfjs-converter/tree/master/tfjs-converter https://github.com/tensorflow/tfjs-converter/tree/master/tfjs-converter

It says:

导入模型的两步过程:

  1. 一个 python pip 包,用于将 TensorFlow SavedModel 或 TensorFlow Hub 模块转换为网络友好格式。如果您已有转换后的模型,或正在使用已托管的模型(例如 MobileNet),请跳过此步骤。
  2. JavaScript API,用于加载和运行推理。

基本上是说创建一个 venv 并执行以下操作:

pip install tensorflowjs

tensorflowjs_converter \
    --input_format=tf_saved_model \
    --output_format=tfjs_graph_model \
    --signature_name=serving_default \
    --saved_model_tags=serve \
    /mobilenet/saved_model \
    /mobilenet/web_model

但是等等,我的检查点文件有“TensorFlow SavedModel”吗?这似乎不太清楚,文档没有解释。所以我用谷歌搜索,找到文档,它说:

您可以使用 SavedModel 格式保存和加载模型 以下 API:

低级 tf.saved_model API。本文档描述了如何使用这个 详细API。保存: tf.saved_model.save(model, path_to_dir)

链接的语法在某种程度上进行了推断:

tf.saved_model.save(
    obj, export_dir, signatures=None, options=None
)

举个例子:

class Adder(tf.Module):
  @tf.function(input_signature=[tf.TensorSpec(shape=[], dtype=tf.float32)])
  def add(self, x):
    return x + x

model = Adder()
tf.saved_model.save(model, '/tmp/adder')

但到目前为止,这还不是很熟悉。我不明白如何将迄今为止的训练过程结果(检查点)加载到变量中model所以我可以将它传递给这个函数。

这段话似乎很重要:

必须通过将变量分配给某个属性来跟踪变量 跟踪对象或直接跟踪 obj 的属性。 TensorFlow 对象 (例如来自的层tf.keras.layers,优化器来自tf.train) 追踪 他们的变量自动。这是相同的跟踪方案tf.train.Checkpoint使用,导出的检查点对象可能是 通过指向恢复为训练检查点tf.train.Checkpoint.restore to the SavedModel的“变量/” 子目录。

这可能是答案,但我不太清楚“恢复”意味着什么,或者我从那里去哪里,如果这是正确的步骤的话。所有这些对于学习 TF 的人来说都是非常令人困惑的,这就是为什么我寻找一个可以做到这一点的教程,但同样,我似乎找不到没有第三方云服务/React 的教程。

请帮我把这些点连起来。


您可以将模型转换为 TensorFlowJS 格式,无需任何云服务。我已经列出了以下步骤。

我确信从这一步到我需要的文件并不难。

您看到的检查点位于tf.train.Checkpoint格式 (在对象检测模型代码中创建这些检查点的相关源代码 https://github.com/tensorflow/models/blob/2a185c1f44fb5bcc02d777d303d31a1171c75284/research/object_detection/model_lib_v2.py#L605-L612)。这与 SavedModel 和 Keras 格式不同。

我们将完成以下步骤:

Checkpoint (current) --> SavedModel --> TensorFlowJS

转换自tf.train.Checkpoint to SavedModel

请参见剧本models/research/object_detection/export_inference_graph.py https://github.com/tensorflow/models/blob/2a185c1f44fb5bcc02d777d303d31a1171c75284/research/object_detection/export_inference_graph.py将 Checkpoint 文件转换为 SavedModel。

下面的代码取自该脚本的文档。请调整您的具体项目的路径。--input_type应保持为image_tensor.

python export_inference_graph.py \
    --input_type image_tensor \
    --pipeline_config_path path/to/ssd_inception_v2.config \
    --trained_checkpoint_prefix path/to/model.ckpt \
    --output_directory path/to/exported_model_directory

在输出目录中,您应该看到保存的模型目录。我们将在下一步中使用它。

转换SavedModel到 TensorFlowJS

请按照以下网址的说明进行操作:https://github.com/tensorflow/tfjs/tree/master/tfjs-converter https://github.com/tensorflow/tfjs/tree/master/tfjs-converter,特别注意“TensorFlow SavedModel 示例”。下面复制了示例转换代码。请修改您项目的输入和输出路径。这--signature_name and --saved_model_tags might必须改变,但希望不会。

tensorflowjs_converter \
    --input_format=tf_saved_model \
    --output_format=tfjs_graph_model \
    --signature_name=serving_default \
    --saved_model_tags=serve \
    /mobilenet/saved_model \
    /mobilenet/web_model

使用 TensorFlowJS 模型

我知道为了将此模型与 tensorflow.js 一起使用,我的目标是获取如下文件:

  • group1-shard1of2.bin
  • group1-shard2of2.bin
  • 标签.json
  • 模型.json

上面的步骤应该为您创建这些文件,但我不认为labels.json将被创建。我不确定该文件应该包含什么。 TensorFlowJS 将使用model.json构建推理图,它将加载来自.bin files.

因为我们将 TensorFlow SavedModel 转换为 TensorFlowJS 模型,所以我们需要使用以下命令加载 JS 模型tf.loadGraphModel(). See tfjs 转换器页面了解更多信息 https://github.com/tensorflow/tfjs/tree/master/tfjs-converter#python-to-javascript.

请注意,对于 TensorFlowJS,TensorFlow SavedModel 和 Keras SavedModel 之间存在差异。在这里,我们正在处理 TensorFlow SavedModel。

运行模型的 Javascript 代码可能超出了这个答案的范围,但我建议阅读这个 TensorFlowJS 教程 https://www.tensorflow.org/js/tutorials/conversion/import_saved_model。我在下面包含了具有代表性的 javascript 部分。

import * as tf from '@tensorflow/tfjs';
import {loadGraphModel} from '@tensorflow/tfjs-converter';

const MODEL_URL = 'model_directory/model.json';

const model = await loadGraphModel(MODEL_URL);
const cat = document.getElementById('cat');
model.execute(tf.browser.fromPixels(cat));

额外说明

...这听起来有点像我的循环引用,

TensorFlowJS 生态系统已得到巩固张量流/tfjs https://github.com/tensorflow/tfjsGitHub 存储库。这tfjs-转换器文档 https://github.com/tensorflow/tfjs/tree/master/tfjs-converter现在住在那里。您可以创建拉取请求https://github.com/tensorflow/tfjs https://github.com/tensorflow/tfjs修复 SavedModel 链接以指向 tensorflow/tfjs 存储库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将使用 Tensorflow (python) 训练的模型转换为与 TensorflowJS 一起使用,而不涉及 IBM 云(从我现在的步骤开始)? 的相关文章

随机推荐