【问题标题】:Add custom classes to pre-trained data-set将自定义类添加到预训练数据集
【发布时间】:2019-12-03 10:25:53
【问题描述】:

我使用 yolo+tensorflow 使用已经训练(预训练)的数据集进行对象检测。 我的推理结果很好,但现在我想向预训练数据集“添加”一个新类。 预训练数据集中有 80 个类,我如何添加我的自定义类并使其总共 81 或 82 个? 推理 git-hub "https://github.com/thtrieu/darkflow".

【问题讨论】:

标签: tensorflow computer-vision object-detection yolo pre-trained-model


【解决方案1】:

在迁移学习的情况下,会使用“Imagenet”、“fashion-mnist”等著名数据集上的预训练权重。这些数据集定义了许多类和标签,它们可能与我们的数据集相同,也可能不同。最佳实践是在预训练模型输出的输出层之上添加层。例如在 keras 中:

from tensorflow.keras.applications import mobilenet
from tensorflow.keras.layers import Dense, Flatten
output = mobilenet(include_top=False)
flatten = Flatten()(output)
predictions = Dense(number_of_classes, activation='softmax')(layer)

在这种情况下,您需要使用您的数据集训练(或者更好地称之为微调)模型。 mobilenet 网络将使用预训练的权重,最后一层将仅根据您的数据集使用您定义的类数进行训练。

你也可以使用:

from tensorflow.keras.applications import mobilenet
preds = mobilenet(include_top=Flase, classes=number_of_classes, weights='imagenet')

更多信息您可以参考:keras-applications 还有这些blog1blog2

【讨论】:

  • 感谢您的帮助。请问,你能告诉我如何为 yolo-v2 或 yolo-v3 “添加”一个自定义对象吗?
  • 任何人都可以建议任何其他方式将类添加到预先训练的数据集中吗??
【解决方案2】:

如果您已经为模型训练了 80 个类并且需要添加另一个类,那么最好从之前保存的检查点开始重新训练模型。(网络架构应该针对类的总数进行设计因为一开始在输出层你将拥有等于类数量的神经元,如果不是这种情况,你不能将其他类添加到数据中,因为网络不是为它设计的。)这将利用初始训练在以前的课程中完成。您用于重新训练的数据现在应该包含所有类(包括所有以前的类和您要添加的新类)。这类似于从上次训练的检查点(在 80 个类上)初始化权重,然后使用更多数据(包括所有要添加的 80 个以上的类)再次训练,从而允许通过所有层进行反向传播。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2021-12-08
    • 2020-10-16
    • 2017-07-27
    • 2021-05-28
    • 2021-06-09
    • 2023-01-31
    相关资源
    最近更新 更多