【问题标题】:How to train new classes on pretrained yolov4 model in darknet如何在暗网中使用预训练的 yolov4 模型训练新课程
【发布时间】:2021-01-09 08:27:51
【问题描述】:

我使用 darknet 和 yolov4 为我的用例训练了一个自定义对象检测模型。我在 obj.name 文件中提到了 3 个类,如下所述:

# data/obj.names
no_helmet
helmet
vest

训练完成,检测也取得了不错的效果。

现在,我想在模型中添加 2 个新类,所以我用 2 个新类名更新了类文件:

# data/obj.names
no_helmet
helmet
vest
fire
smoke

我对配置文件进行了更改,并将所有[yolo] 层和之前的[convolutional] 层的classes=3 更新为classes=5 并将filter=24 更新为filter=30

对于数据集,我只提供了 2 个新类(firesmoke)的图像和注释。

然后我开始了暗网训练,对于权重参数,我提供了旧的 yolov4 训练权重。完成后,我进行了测试,但没有检测到图像中的任何内容。甚至旧课程也不行。

我哪里做错了?

我的感觉是,由于我没有为旧类提供数据集,因此模型忘记了这些。但是,那么它至少应该检测到新的类,对吧?还是我错了?

新编辑:

我再次使用组合数据集(旧的 3 个类和 2 个新类)对预训练的自定义权重(针对前 3 个类进行了训练)进行了训练,当我运行它进行测试时,仍然没有输出。

有人可以向我解释这里发生了什么吗?我在想它背后有一些我不知道的数学。

我每次都必须从头开始训练吗?

【问题讨论】:

    标签: python machine-learning object-detection yolo darknet


    【解决方案1】:

    从 YOLO 在训练中遵循的过程来看,任何进一步的训练都会增强和修改当前的层,所以如果你添加新的类并重新训练,你将增强现有的类并从头开始创建新的类,这意味着不是所有的类在检测期间将是相同的。我认为最安全的方法是从头开始训练。

    【讨论】:

      【解决方案2】:

      您无法在经过训练的模型中插入新类。 当您仅使用 firesmoke 数据集进行训练时,您的配置并未配置为 2 个类,而是为 5 个。可能这就是为什么您在第二次测试中没有得到任何结果的原因。

      模型不会忘记,而是使用该重量作为新模型的领先优势。只需使用包含所有已标记类别的数据集再次训练即可。

      【讨论】:

      • 谢谢@Rafael。我这样做了,它目前正在训练中。完成后我会继续发布。
      • 您能看看这篇文章的新编辑并提供帮助吗?
      • 检查您的 .cfg、.data 和 .names 文件。之后打开 5 个标签 .txt(每个类别一个),检查是否在那里找到所有标签编号(0 到 4)。最后,从头开始再次训练 5 个类(不要使用训练过的自定义模型)。我已经训练了一个有64个类别的yolov4模型,我认为这不是数学问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 2023-01-03
      • 2021-01-26
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 2018-12-22
      相关资源
      最近更新 更多