我正在尝试做什么
我正在尝试学习 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:
导入模型的两步过程:
- 一个 python pip 包,用于将 TensorFlow SavedModel 或 TensorFlow Hub 模块转换为网络友好格式。如果您已有转换后的模型,或正在使用已托管的模型(例如 MobileNet),请跳过此步骤。
- 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 的教程。
请帮我把这些点连起来。