Darknet YOLOv3预训练模型自定义训练:新增类别是否需同步标注原有类别
YOLOv3自定义双类别训练问题解答
核心问题结论
1. 能不能只喂新增类(单反)的数据集训练,同时保留原有类(手机)的检测能力?
完全不行。直接这么做会出现「灾难性遗忘」问题:模型在学习新增类特征的过程中,会完全覆盖之前从COCO数据集学到的手机类特征,最终要么只能识别单反,要么两类的识别精度都会崩到不可用的水平。
2. 是不是必须同时准备两类的标注数据集共同训练?
对入门者来说,这是最稳妥、踩坑最少的首选方案,而且你不需要自己标注手机类的数据集,可以直接复用COCO的公开标注:
- 从公开COCO数据集中筛选出所有标注为
cell phone的图片和对应标签文件,省掉自己标注原有类的工作量 - 只需要自己标注新增的单反类的数据集,和前面导出的手机类数据集混合后按7:2:1比例拆分训练/验证/测试集即可
入门级实操步骤
如果你选两类共同训练的方案,按以下步骤操作就行:
- 替换标签文件:把原
coco.names内容清空,依次写你的两个类别名,注意和标注文件里的类别顺序完全对应,示例:cell phone dslr camera - 修改YOLOv3配置文件:
- 把所有
classes=80的参数改成classes=2(一共有3处,对应3个不同尺度的检测头) - 把每个
[yolo]层前紧邻的[convolutional]层的filters参数改成21(计算公式是3*(类别数+5),2类的话就是3*(2+5)=21,一共也是3处)
- 把所有
- 训练时加载官方公开的
darknet53.conv.74预训练权重做迁移学习,比从零开始训练速度快3~5倍,最终精度也更高
其他可选方案(新手谨慎尝试)
如果实在不想准备原有类的数据集,还有两个替代方案,但都有明显短板:
- 增量训练+知识蒸馏方案:修改YOLO的损失函数,加入知识蒸馏模块,保留模型原有学到的手机类特征,只微调新增类的检测头。优势是不需要原有类数据集,劣势是需要修改Darknet源码,调参难度高,最终原有类的精度大概率会比联合训练低10%以上
- 双模型融合方案:单独训一个只识别单反的YOLO模型,推理时同时跑官方80类预训练模型和你训的单类模型,最后合并两个模型的输出结果,过滤掉除手机、单反之外的其他类别结果。优势是完全不需要改训练逻辑,劣势是推理速度慢一倍,仅适合本地测试、不需要部署到边缘设备的场景
内容的提问来源于stack exchange,提问作者mlmlmlm
相关产品推荐
相关产品推荐

