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

2024-04-30 04:14:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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

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

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

我哪里出错了

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

新编辑:

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

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

我每次都得从头开始训练吗


Tags: 文件no模型objdatanamesfiresmoke
2条回答

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

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

该型号不会忘记,而是将该重量作为新型号的出发点。只需使用包含所有类别的数据集再次训练即可

相关问题 更多 >