You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于YOLOv8-face进行迁移学习,避免模型遗忘预训练知识?

问题描述

我正在训练人脸检测模型,使用的是YOLOv8-face。该预训练模型本身检测效果很好,但用自己创建的yaml格式数据集训练时,模型会遗忘所有预训练知识,仅保留新数据集的学习成果——未训练时能正常检测人脸,训练后仅能识别自定义数据集中的内容。我希望在保留预训练模型知识的同时,通过自定义数据集训练增强模型的检测能力,当前代码如下:

from ultralytics import YOLO
from PIL import Image
import cv2
import numpy as np
import requests
from io import BytesIO

model = YOLO("yolov8n-face.pt") #loading yolov8 face model
dataset = 'path(removed for privacy, but it works)' #specify dataset path
folder_path = 'test5' #specify image folder path
img_path = 'test_images/3251_Out.jpg' #if wanting to only predict single image, #replace folder_path with img_path in predict

print('model loaded')
model.train(data = dataset, epochs = 3, pretrained = True, imgsz=960) #training model

model.val() #evaluating train data
print('val complete')

#add this to predict when predicting on our set imgsize = 2160
results = model.predict(source=folder_path, save=True, conf = 0.33, line_width = 1, imgsz=2160)
解决方案

针对模型遗忘预训练知识的问题,可通过以下调整解决:

  • 降低学习率:默认学习率过高会快速覆盖预训练权重,训练时设置lr0=0.0001(远低于默认的0.01),让模型在预训练基础上缓慢学习新数据:

    model.train(data=dataset, epochs=3, pretrained=True, imgsz=960, lr0=0.0001)
    
  • 冻结骨干网络层:先冻结YOLOv8的骨干层,只训练头部层,让模型先适应新数据集分布,再逐步解冻。用freeze=10参数冻结前10层骨干网络:

    model.train(data=dataset, epochs=3, pretrained=True, imgsz=960, lr0=0.0001, freeze=10)
    

    后续可增加轮数,解冻更多层继续微调。

  • 补充通用人脸样本:如果自定义数据集仅含特定场景人脸,模型会偏向该场景。建议混入一定比例的通用人脸数据,保证模型保留通用检测能力。

  • 优化训练策略:3轮训练不足以平衡新旧知识学习。可先冻结骨干训练10-20轮,再解冻全部层用更小学习率(如lr0=0.00001)训练10-20轮,让模型充分融合新旧知识。

  • 验证集包含通用样本:确保yaml文件的验证集加入通用人脸样本,训练时监控验证集的通用人脸检测效果,避免过度拟合自定义数据。

内容的提问来源于stack exchange,提问作者Cooper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:17:41