我使用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>
有人可以告诉我这是怎么回事吗?我在想它背后有一些我不知道的数学。
我每次都要从头开始训练吗?
答案 0 :(得分:1)
您不能在经过训练的模型中插入新课程。 当仅使用 fire 和 smoke 数据集进行训练时,您的配置未配置为2个类别,而是配置为5个类别。也许这就是为什么第二次考试什么都没得到的原因。
该模型不会忘记,但会使用该权重作为新模型的起点。只需再次训练包含所有标记类别的数据集即可。
答案 1 :(得分:1)
根据YOLO训练中遵循的过程,任何进一步的训练都将增强和修改当前的图层,因此,如果您添加了新课程并进行了再培训,则将增强现有课程并从头开始创建新课程,这意味着并非所有课程在检测期间将相同。我认为最安全的方法是从头开始训练。