前言
首先了解yolov8的几个模型(n、s、m、l、x),能识别到的物体有80种
| 类别ID | 物体名称 | 类别ID | 物体名称 | 类别ID | 物体名称 | 类别ID | 物体名称 |
|---|---|---|---|---|---|---|---|
| 0 | person | 20 | elephant | 40 | wine glass | 60 | dining table |
| 1 | bicycle | 21 | bear | 41 | cup | 61 | toilet |
| 2 | car | 22 | zebra | 42 | fork | 62 | tv |
| 3 | motorcycle | 23 | giraffe | 43 | knife | 63 | laptop |
| 4 | airplane | 24 | backpack | 44 | spoon | 64 | mouse |
| 5 | bus | 25 | umbrella | 45 | bowl | 65 | remote |
| 6 | train | 26 | handbag | 46 | banana | 66 | keyboard |
| 7 | truck | 27 | tie | 47 | apple | 67 | cell phone |
| 8 | boat | 28 | suitcase | 48 | sandwich | 68 | microwave |
| 9 | traffic light | 29 | frisbee | 49 | orange | 69 | oven |
| 10 | fire hydrant | 30 | skis | 50 | broccoli | 70 | toaster |
| 11 | stop sign | 31 | snowboard | 51 | carrot | 71 | sink |
| 12 | parking meter | 32 | sports ball | 52 | hot dog | 72 | refrigerator |
| 13 | bench | 33 | kite | 53 | pizza | 73 | book |
| 14 | bird | 34 | baseball bat | 54 | donut | 74 | clock |
| 15 | cat | 35 | baseball glove | 55 | cake | 75 | vase |
| 16 | dog | 36 | skateboard | 56 | chair | 76 | scissors |
| 17 | horse | 37 | surfboard | 57 | couch | 77 | teddy bear |
| 18 | sheep | 38 | tennis racket | 58 | potted plant | 78 | hair drier |
| 19 | cow | 39 | bottle | 59 | bed | 79 | toothbrush |
想做的事情
在yolov8能识别的物体之上再新增一种物体80+1
思路一 (冻结骨干 + 定量训练)
YOLOv8 想象成一个 "识别工厂" ,有两个主要部分:
| 部分 | 作用 | 类比 |
|---|---|---|
| 骨干网络 (Backbone) | 提取图片的通用特征(边缘、形状、纹理等) | “眼睛和大脑”,看东西的基础能力 |
| 检测头 (Head) | 识别具体物体并画框 | “工人”,根据特征判断是什么 |
冻结骨干?
❌ 不冻结的问题
如果整个网络都训练,就像让工厂重新装修+换工人,结果:
- 旧工人(原有识别能力)会忘记怎么工作
- 知识遗忘 - 不再认识 person、dog 了
✅ 冻结骨干的好处
只培训新工人,保留老工人:
- 骨干网络不动(保留看东西的能力)
- 只训练检测头(学习识别新东西)
- 不会忘记原有80类
结果
生成新的模型始终只能识别新添加的物体
-
旧模型的状态:模型已经学会了如何区分“人、狗”这两类。它的参数(权重)稳定在能够划分这两类空间的特定数值上。
-
只加新类(如“phc”)的情况:当你冻结部分层或直接微调,只用“平衡车”的图片训练时,模型只有一个任务:把“平衡车”这一类区分出来。
- 问题在于,数据集中没有“人、狗”的负样本。模型为了把“平衡车”的准确率提得更高,会擅自移动原有的决策边界。
- 结果往往是:模型现在非常擅长认出“平衡车”,但在原来“人、狗”的边界上出现了漂移。原本属于“人”的特征空间,可能现在被划给了“平衡车”或者变成了模糊地带。
- 这就是参数冲突:为了拟合新知识,模型覆盖了旧知识。
新模型、如图,
yolov8默认能识别到的物体,如图
思路二 (混合数据集 + 定量训练)
将新类别的数据和旧类别的数据混合,构成一个新的完整训练集,然后进行微调或从头训练
混合数据集?
❌ 混合数据集的问题
随着类别增加,训练集越来越大,算力成本线性增长。
✅ 冻结骨干的好处
效果最好,几乎不会遗忘,模型能完美区分类别间的界限。
结果
确实必须保留旧类别的数据来避免遗忘
新模型,如图
总结
针对“模型数据增量和持续学习”的场景:
-
如果追求极致的识别准确率,且旧数据可以随时获取:
- 必须将旧数据+新数据合并重新训练。这是工业界上线的标准做法,虽然最笨,但最稳。
-
如果旧数据无法获取(数据回流受限)或存储成本极高:
- 不要直接微调。直接微调(仅用新类数据)是灾难性遗忘最严重的方式。
- 推荐做法:采用特征提取器不变(冻结Backbone)+ 新增分类头的策略。虽然准确率可能略低于联合训练,但能保证旧类别的准确率100%不下降(因为旧参数没变)。或者使用蒸馏法,让新模型在通用特征提取能力上向旧模型看齐。
第三方数据集及模型 www.kaggle.com/