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



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

简短的回答是:不,还没有,尽管从技术上讲是可能的,但我还没有在野外看到它的实现。

更长的答案-为什么:

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

1( 这是一条更简单的路线,但在某些用例中可能不可能:使用您可以访问的冻结模型的一个高级层(例如,我相信TF.js发布的模型是冻结模型,即GitHub上的模型(。这允许您重用它的一些较低层(或最终输出(,这些层可能已经很善于挑选出对您需要的用例有用的某些功能,例如一般意义上的对象检测,然后您可以将其输入到您自己的未冻结层中,这些层位于您正在采样的输出之上(这就是新训练将要进行的地方(。这会更快,因为你只更新你添加的新层的权重等,但由于原始模型被冻结,这意味着你必须在TF.js中复制你绕过的层,以确保你在这种情况下拥有与COCO-SSD相同的最终模型架构,如果你想要该架构的话。这可能不是一件小事。

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

什么?!

因此,一个更容易可视化的例子是,如果我们考虑PoseNet,它可以估计人类关节/骨骼的位置。

现在,在这个Posenet的例子中,想象一下你想制作一个新的ML模型,它可以检测一个人何时处于某个位置,例如挥手。

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

现在考虑PoseNet的情况2——你希望能够识别身体的一个新部位,而它目前还没有。要做到这一点,你需要重新训练原始模型,这样它就可以学会预测新的身体部位作为其输出的一部分。

这要困难得多,因为你需要重新训练基本模型才能做到这一点,这意味着你需要访问未冻结的模型才能做到。如果你无法访问未冻结的模型,那么你将别无选择,只能尝试完全由自己重新创建PoseNet架构,然后用自己的数据进行训练。正如你所看到的,第二个用例要困难得多,涉及的内容也更多

最新更新