Python 如何在darknet的预训练yolov4模型上训练新课程

Python 如何在darknet的预训练yolov4模型上训练新课程,python,machine-learning,object-detection,yolo,darknet,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 我对配置文件进行了更改,并将所有[yolo]层和之前的[卷积]层的classes=3

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

# data/obj.names
no_helmet
helmet
vest
培训已经完成,检测工作也取得了良好的效果

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

# data/obj.names
no_helmet
helmet
vest
fire
smoke
我对配置文件进行了更改,并将所有
[yolo]
层和之前的
[卷积]
层的
classes=3
更新为
classes=5
,将
filter=24
更新为
filter=30

对于数据集,我只提供了两个新类(
fire
smoke
)的图像和注释

然后我开始了黑暗训练,对于权重参数,我提供了我以前的yolov4训练权重。完成后,我运行了测试,但在图像中没有检测到任何东西。即使是旧的班级也不行

我哪里出错了

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

新编辑:

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

有人能给我解释一下这是怎么回事吗?我在想它背后有一些我不知道的数学


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

你不能在训练过的模型中插入新的类。 当您仅使用数据集进行训练时,您的配置没有针对2个类进行配置,而是针对5个类进行配置。也许这就是为什么你在第二次测试中什么都没得到


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

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

谢谢,@Rafael。我做到了,现在正在训练。完成后我会继续发布。你能看看这篇文章的新编辑和帮助吗?检查你的.cfg、.data和.names文件。然后打开5 labels.txt(每个类别一个),检查是否在那里找到所有标签号(0到4)。最后,从头开始用5节课再次训练(不要使用经过训练的自定义模型)。我已经训练了一个包含64个类别的yolov4模型,我认为这不是一个数学问题。