有谁知道如何为对象 91 重新训练 TFJS 的对象检测(coco-ssd)?

does anyone know how to retrain Object Detection (coco-ssd) of TFJS for object 91?

到目前为止,我看到了很多关于这个主题的讨论,并使用不同的方法来实现这一点 (https://github.com/tensorflow/models/issues/1809),但我想知道是否有人成功地使用 Tensorflowjs 来实现这一点。 我知道有些人也使用迁移学习实现了这一点,但这与能够添加我自己的新 class.

不同

简短的回答:不,还没有,虽然技术上可行,但我还没有看到这个在野外的实现。

较长的答案 - 为什么:

鉴于 "transfer learning" 本质上意味着在经过训练的模型中重用现有知识来帮助您对类似性质的事物进行分类,而无需重做所有先前的学习,实际上有两种方法可以做到这一点:

1) 这是更简单的方法,但对于某些用例可能不可行:使用您有权访问的冻结模型的高级层之一(例如 [=36= 发布的模型) ] 是我认为的冻结模型 - GitHub 上的那些)。这允许您重用它的一些较低层(或最终输出),这些较低层可能已经擅长挑选对您需要的用例有用的某些功能,例如一般意义上的 object 检测,然后您可以输入你自己的未冻结层,这些层位于你正在采样的输出之上(这是新训练发生的地方)。这更快,因为您只为添加的新层更新权重等,但是因为原始模型被冻结,这意味着您必须在 TF.js 中复制您绕过的层以确保您具有相同的COCO-SSD 的结果模型架构在这种情况下,如果你想要架构。这可能不是一件容易的事。

2) 重新训练原始模型 - 可以考虑调整原始模型 - 但这只有在您可以访问原始未冻结模型和用于训练该模型的数据时才有可能。这将花费更长的时间,因为您实际上是在所有数据 + 新数据上重新训练整个模型。如果您没有原始的解冻模型,那么唯一的方法是根据需要使用图层/操作 API 在 TF.js 中自己实现上述模型,然后使用它来训练您自己的数据。

什么?!

因此,如果我们考虑 PoseNet - 估计人类 joints/skeletons 所在位置的一个更容易形象化的示例。

现在,在这个 Posenet 示例中,假设您想制作一个新的 ML 模型,可以检测一个人何时处于特定位置 - 例如挥手。

在这个例子中,你可以使用方法 1 来简单地获取它检测到的所有关节的现有 posenet 预测的输出,并将其馈送到一个新层 - 像多层感知器这样简单的东西 - 然后可以很快例如,当手处于挥动位置时,从示例数据中学习。在这种情况下,我们只是简单地添加到现有架构中以获得新的结果——手势预测与关节本身的原始 x-y 点预测。

现在考虑 PoseNet 的情况 2 - 您希望能够识别 body 目前无法识别的新部分。为此,您需要重新训练原始模型,以便它可以学习预测新的 body 部分作为其输出的一部分。

这要困难得多,因为您需要重新训练基础模型才能执行此操作,这意味着您需要访问未冻结的模型才能执行此操作。如果您无法访问未冻结的模型,那么您将别无选择,只能尝试完全自己重新创建 PoseNet 架构,然后使用您自己的数据对其进行训练。正如您所看到的,第二个用例更难,也更复杂。