So far I seen so many discussion on this topic and using different approaches to achieve this (https://github.com/tensorflow/models/issues/1809) but I want to know if anyone managed to successfully use Tensorflowjs to achieve this. I know some also achieved this using transfer learning but it is not same as being able to add my own new class.
- 积分
0 - 话题
0 - 评论
3200 - 注册排名
1609
简短的回答:不,虽然在技术上可行,但尚未实现,我还没有看到在野外实现此实现的方法。
更长的答案-为什么:
鉴于“转移学习”从本质上讲意味着在训练有素的模型中重用现有知识,以帮助您对相似性质的事物进行分类,而不必重做所有先前的学习,实际上有两种方法可以做到这一点:
1)这是一条更简单的方法,但在某些情况下可能无法实现:使用您可以访问的冻结模型的高层之一(例如,我相信TF.js发布的模型是冻结模型-那些在GitHub上)。这使您可以重用它的某些较低层(或最终输出),这些低层可能已经很好地挑选出了对您需要的用例有用的某些功能,例如,一般意义上的对象检测,然后您可以将其引入自己的位于您要从中采样的输出之上的未冻结层(将在此处进行新的训练)。这更快,因为您仅更新已添加的新图层的权重等,但是由于原始模型被冻结,这意味着您必须在TF.js中复制绕过的图层以确保具有相同的结果模型如果需要的话,在这种情况下使用COCO-SSD的体系结构。这可能并非易事。
2)重新训练原始模型-可以考虑调整原始模型-但这只有在您可以访问原始未冻结模型以及用于训练原始数据的数据的情况下才有可能。这将花费更长的时间,因为您实质上是在所有数据+您的新数据上重新训练整个模型。如果您没有原始的未冻结模型,那么执行此操作的唯一方法是根据需要自己使用layer / ops API在TF.js中实现上述模型,然后使用它来训练自己的数据。
什么?!
因此,如果我们考虑使用PoseNet(可以估计人体关节/骨骼的位置),则是一个更直观的示例。
现在,在此Posenet示例中,假设您想创建一个新的ML模型,该模型可以检测人何时处于某个位置(例如,挥手)。
在此示例中,您可以使用方法1来简单获取其检测到的所有关节的现有位姿网络预测的输出,并将其输入到新层(类似于多层感知器的简单层)中,然后可以在示例数据中快速学习例如,一只手处于挥舞姿势。在这种情况下,我们只是添加到现有架构中即可获得新结果-手势预测与关节自身的原始x-y点预测。
现在考虑PoseNet的情况2-您希望能够识别它当前无法识别的身体的新部分。为此,您需要重新训练原始模型,以便它可以学习预测新的身体部位作为其输出的一部分。
这要困难得多,因为您需要重新训练基本模型才能执行此操作,这意味着您需要访问未冻结的模型才能执行此操作。如果您无法访问未冻结的模型,则别无选择,只能尝试完全自己重新创建PoseNet架构,然后使用自己的数据进行训练。如您所见,第二个用例要困难得多,需要做的事情更多。