如何在Darknet中使用预训练的yolov4模型训练新班级

时间:2020-09-23 07:12:54

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

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

# data/obj.names
no_helmet
helmet
vest

培训已完成,检测工作也取得了良好的结果。

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

# data/obj.names
no_helmet
helmet
vest
fire
smoke

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

对于数据集,我仅提供了两个新类([convolutional]fire)的图像和注释。

然后,我开始进行暗网训练,并为权重参数提供了旧的yolov4训练过的权重。完成后,我进行了测试,但未在图像中检测到任何东西。甚至老班级也没有。

我哪里出错了?

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

新编辑:

我再次使用合并的数据集(旧的3个班级和2个新的班级)对预先训练的自定义权重(针对前3个班级进行了培训)进行了训练,当我将其用于测试时,仍然没有输出。 / p>

有人可以告诉我这是怎么回事吗?我在想它背后有一些我不知道的数学。

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

2 个答案:

答案 0 :(得分:1)

您不能在经过训练的模型中插入新课程。 当仅使用 fire smoke 数据集进行训练时,您的配置未配置为2个类别,而是配置为5个类别。也许这就是为什么第二次考试什么都没得到的原因。

该模型不会忘记,但会使用该权重作为新模型的起点。只需再次训练包含所有标记类别的数据集即可。

答案 1 :(得分:1)

根据YOLO训练中遵循的过程,任何进一步的训练都将增强和修改当前的图层,因此,如果您添加了新课程并进行了再培训,则将增强现有课程并从头开始创建新课程,这意味着并非所有课程在检测期间将相同。我认为最安全的方法是从头开始训练。