Ultralytics YOLO27: Tham gia danh sách chờ.
Get Started

Cách fine-tune YOLO trên tập dữ liệu tùy chỉnh#

Fine-tuning điều chỉnh một model pretrained để nhận diện các lớp mới bằng cách bắt đầu từ trọng số đã học thay vì khởi tạo ngẫu nhiên. Thay vì huấn luyện từ đầu trong hàng trăm epoch, fine-tuning tận dụng các đặc trưng COCO pretrained và hội tụ trên dữ liệu tùy chỉnh chỉ trong một phần nhỏ thời gian.

Hướng dẫn này trình bày cách fine-tune YOLO26 trên các tập dữ liệu tùy chỉnh, từ cách sử dụng cơ bản đến các kỹ thuật nâng cao như đóng băng layer và huấn luyện hai giai đoạn.

Fine-tuning và huấn luyện từ đầu#

Model pretrained đã học các đặc trưng hình ảnh tổng quát — phát hiện cạnh, nhận diện texture và hiểu hình dạng — từ hàng triệu ảnh. Transfer learning thông qua fine-tuning tái sử dụng kiến thức đó và chỉ dạy model nhận diện diện mạo của các lớp mới; nhờ vậy, model hội tụ nhanh hơn và cần ít dữ liệu hơn. Huấn luyện từ đầu loại bỏ toàn bộ kiến thức đó, buộc model phải học mọi thứ từ các mẫu ở cấp pixel trở lên, đòi hỏi nhiều tài nguyên hơn đáng kể. Xem Hướng dẫn cấu hình YAML của model để tìm hiểu điểm khác biệt giữa các file .yaml chỉ chứa kiến trúc và các checkpoint.

Fine-tuningHuấn luyện từ đầu
Trọng số ban đầuPretrained trên COCO (80 lớp)Khởi tạo ngẫu nhiên
LệnhYOLO("yolo26n.pt")YOLO("yolo26n.yaml")
Hội tụNhanh hơn - backbone đã được huấn luyệnChậm hơn - tất cả layer đều học từ đầu
Yêu cầu về dữ liệuThấp hơn - các đặc trưng pretrained bù đắp cho lượng dữ liệu ít hơnCao hơn - model phải tự học tất cả đặc trưng chỉ từ tập dữ liệu
Khi nào nên dùngCác lớp tùy chỉnh với ảnh tự nhiênCác lĩnh vực khác biệt căn bản so với COCO (y tế, vệ tinh, radar)
Fine-tuning không cần thêm code

Khi tải tệp .pt bằng YOLO("yolo26n.pt"), trọng số pretrained được lưu trong model. Sau đó, gọi .train(data="custom.yaml") sẽ tự động chuyển tất cả trọng số tương thích sang kiến trúc model mới, khởi tạo lại mọi layer không khớp (chẳng hạn layer phân loại cuối cùng khi số lớp khác nhau) và bắt đầu huấn luyện. Không cần tải trọng số, thao tác layer hay viết code transfer learning tùy chỉnh thủ công.

Cách hoạt động của việc chuyển trọng số pretrained#

Khi fine-tune một model pretrained trên tập dữ liệu có số lớp khác nhau (ví dụ: chuyển từ 80 lớp của COCO sang 5 lớp tùy chỉnh), Ultralytics thực hiện chuyển trọng số có xét đến shape:

  1. Chuyển toàn bộ backbone và neck - các layer này trích xuất đặc trưng hình ảnh tổng quát và shape của chúng không phụ thuộc vào số lớp.
  2. Head phát hiện được khởi tạo lại một phần - chỉ convolution cuối cùng của mỗi nhánh phân loại (cv3, one2one_cv3) có shape phụ thuộc vào số lớp (80 so với 5); các hidden layer của nhánh vẫn được chuyển nếu hai model dùng chung một scale. Các hàng tương thích có tên lớp khớp được ánh xạ lại trước khi khởi tạo các hàng không khớp. Các layer hồi quy box (cv2, one2one_cv2) trong head có shape cố định, không phụ thuộc vào số lớp, nên được chuyển bình thường.
  3. Phần lớn trọng số được chuyển khi thay đổi số lớp. Ví dụ, fine-tune YOLO26n từ COCO (80 lớp) sang dataset 5 lớp sẽ chuyển 696 trong số 708 tensor trọng số, cùng mọi hàng phân loại tương thích khớp theo tên.

Với các tập dữ liệu có cùng số lớp với model pretrained (ví dụ: fine-tune trọng số pretrained trên COCO với một tập dữ liệu 80 lớp khác), 100% trọng số được chuyển, bao gồm cả detection head.

Chuyển lớp bằng bí danh tên#

Ultralytics chuyển các hàng tương ứng trong classification head giữa các tập dữ liệu dựa trên tên lớp, không phân biệt chữ hoa chữ thường và bỏ qua khoảng trắng ở đầu, cuối. Khi các lớp tương đương dùng tên khác nhau, hãy đổi tên lớp trong checkpoint nguồn trên bộ nhớ trước khi nạp. Cách này giữ lại trọng số phân loại pretrained cho các khái niệm chung, vốn sẽ bị xem là không khớp và khởi tạo ngẫu nhiên.

Ví dụ chuyển từ Objects365 v2 sang COCO này đổi tên lớp nguồn trong checkpoint đã nạp; sau đó train() truyền checkpoint đó dưới dạng trọng số pretrained:

from ultralytics import YOLO

# Tên nguồn Objects365 v2 (chữ thường) -> tên COCO đích
ALIASES = {
    "wild bird": "bird",
    "handbag/satchel": "handbag",
    "luggage": "suitcase",
    "bowl/basin": "bowl",
    "orange/tangerine": "orange",
    "monitor/tv": "tv",
    "stuffed toy": "teddy bear",
    "hair dryer": "hair drier",
}

model = YOLO("path/to/yolo26s-objects365.pt")
# Tên lớp Objects365 viết hoa chữ cái đầu mỗi từ, vì vậy hãy so khớp theo tên viết thường
model.model.names = {i: ALIASES.get(name.lower(), name) for i, name in model.model.names.items()}
model.train(data="coco.yaml", epochs=100, imgsz=640)

Thiết lập cls_remap bật tính năng chuyển dựa trên tên này theo mặc định. Quá trình huấn luyện sẽ in Remapped N/M cls head rows from pretrained weights by class name khi các hàng tương thích được sao chép; đặt cls_remap=False để tắt tính năng này.

Ví dụ fine-tuning cơ bản#

Ví dụ
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # tải model đã huấn luyện trước
model.train(data="custom.yaml", epochs=50, imgsz=640)

Chọn kích thước model#

Model lớn hơn có năng lực cao hơn nhưng cũng có nhiều tham số cần cập nhật hơn, làm tăng nguy cơ overfit khi dữ liệu huấn luyện hạn chế. Bắt đầu với model nhỏ hơn (YOLO26n hoặc YOLO26s) và chỉ tăng kích thước khi các metric validation chững lại là một cách tiếp cận thực tế. Kích thước model tối ưu phụ thuộc vào độ phức tạp của tác vụ, số lớp, mức độ đa dạng của tập dữ liệu và phần cứng sẵn có để triển khai. Xem đầy đủ trang model YOLO26 để biết các kích thước hiện có và benchmark hiệu năng.

Chọn optimizer và learning rate#

Thiết lập optimizer=auto mặc định sẽ chọn optimizer và learning rate dựa trên tổng số vòng lặp huấn luyện:

  • 10,000 vòng lặp trở xuống (tập dữ liệu nhỏ hoặc ít epoch): AdamW với learning rate thấp được tự động tính toán
  • Trên 10,000 vòng lặp (tập dữ liệu lớn): MuSGD (optimizer kết hợp Muon+SGD) với lr=0.01

Với hầu hết tác vụ fine-tuning, thiết lập mặc định hoạt động tốt mà không cần tinh chỉnh thủ công. Hãy cân nhắc chỉ định optimizer rõ ràng khi:

  • Huấn luyện không ổn định (loss tăng vọt hoặc phân kỳ): thử optimizer=AdamW, lr0=0.001 để hội tụ ổn định hơn
  • Fine-tune model lớn trên tập dữ liệu nhỏ: chỉ định optimizer với learning rate thấp hơn, chẳng hạn optimizer=AdamW, lr0=0.001, có thể giúp giữ lại các đặc trưng pretrained
Optimizer tự động ghi đè lr0 thủ công

Khi optimizer=auto, giá trị lr0 sẽ bị bỏ qua. Để kiểm soát learning rate thủ công, hãy chỉ định optimizer rõ ràng: optimizer=SGD, lr0=0.005.

Đóng băng layer#

Đóng băng ngăn các layer cụ thể được cập nhật trong quá trình huấn luyện. Cách này tăng tốc huấn luyện và giảm overfit khi tập dữ liệu nhỏ so với năng lực của model.

Tham số freeze chấp nhận một số nguyên hoặc một danh sách. Giá trị số nguyên freeze=10 sẽ đóng băng 10 layer đầu tiên (chỉ số 0-9), bao phủ phần lớn backbone YOLO26. Backbone gồm các layer 0-10, vì vậy freeze=10 để block C2PSA cuối cùng (layer 10) ở trạng thái có thể huấn luyện; dùng freeze=11 để đóng băng toàn bộ backbone. Danh sách có thể chứa chỉ số layer như freeze=[0, 3, 5] để đóng băng một phần backbone, hoặc chuỗi tên module như freeze=["23.cv2", "23.one2one_cv2"] để kiểm soát chi tiết các nhánh cụ thể trong một layer (ở đây là cả hai nhánh hồi quy box của detection head).

Ví dụ
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=50, freeze=10)

Độ sâu đóng băng phù hợp phụ thuộc vào mức độ tương đồng giữa domain đích và dữ liệu pretrained, cũng như lượng dữ liệu huấn luyện hiện có:

Kịch bảnKhuyến nghịLý do
Dataset lớn, domain tương tựfreeze=None (mặc định)Đủ dữ liệu để điều chỉnh tất cả các layer mà không overfit
Dataset nhỏ, domain tương tựfreeze=10Giữ lại các feature của backbone, giảm số tham số có thể huấn luyện
Dataset rất nhỏfreeze=23Chỉ detection head được huấn luyện, giảm thiểu nguy cơ overfit
Domain khác xa COCOfreeze=NoneCác feature của backbone có thể không chuyển giao tốt và cần được huấn luyện lại

Độ sâu đóng băng cũng có thể được xem là một hyperparameter — thử một vài giá trị (0, 5, 10) và so sánh mAP trên tập validation là cách thực tế để tìm thiết lập tốt nhất cho một dataset cụ thể.

Hyperparameter chính khi Fine-Tuning#

Fine-tuning thường cần ít điều chỉnh hyperparameter hơn so với huấn luyện từ đầu. Các tham số quan trọng nhất là:

  • epochs: Fine-tuning hội tụ nhanh hơn huấn luyện từ đầu. Bắt đầu với giá trị vừa phải và dùng patience để dừng sớm khi các metric validation chững lại.
  • patience: Giá trị mặc định 100 được thiết kế cho các lượt huấn luyện dài. Giảm xuống 10-20 để tránh lãng phí thời gian cho những lượt huấn luyện đã hội tụ.
  • warmup_epochs: Warmup đưa learning rate dần đến giá trị theo lịch trình trong những epoch đầu tiên, nhờ đó các batch ban đầu ít có khả năng làm xáo trộn feature pretrained. Hãy giữ giá trị này khác 0 khi fine-tuning, nhưng không nhất thiết phải dùng mặc định đầy đủ 3 epoch: quá trình tìm kiếm tiến hóa đứng sau lượt fine-tuning YOLO26 COCO chính thức — một quá trình huấn luyện tiếp nối nhiều epoch từ các weight Objects365 — đã chọn khoảng một epoch cho mỗi kích thước model.

Để xem danh sách đầy đủ các tham số huấn luyện, hãy tham khảo tài liệu tham chiếu cấu hình huấn luyện. Với những hành vi mà các tham số không thể thiết lập — learning rate theo từng layer, gradient clipping hoặc metric validation tùy chỉnh — hãy tạo lớp con từ trainer.

Fine-Tuning Hai Giai Đoạn#

Fine-tuning hai giai đoạn chia quá trình huấn luyện thành hai phase. Ở giai đoạn đầu, đóng băng backbone và chỉ huấn luyện neck cùng head, cho phép các layer detection thích nghi với những class mới mà không làm xáo trộn feature pretrained. Ở giai đoạn hai, bỏ đóng băng tất cả các layer và huấn luyện toàn bộ model với learning rate thấp hơn để tinh chỉnh backbone cho domain đích.

Phương pháp này đặc biệt hữu ích khi domain đích khác biệt đáng kể so với COCO (ảnh y tế, ảnh hàng không, ảnh hiển vi), nơi backbone có thể cần được điều chỉnh nhưng việc huấn luyện mọi thứ cùng lúc gây mất ổn định. Để tự động bỏ đóng băng bằng phương pháp dựa trên callback, hãy xem Đóng băng và Bỏ đóng băng Backbone.

Fine-tuning hai giai đoạn
from ultralytics import YOLO

# Giai đoạn 1: đóng băng backbone, huấn luyện head và neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)

# Giai đoạn 2: bỏ đóng băng tất cả, fine-tune với lr thấp hơn
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, optimizer="AdamW", lr0=0.001, name="stage2", exist_ok=True)

Các Lỗi Thường Gặp#

Model không tạo ra dự đoán nào#

  • Dữ liệu huấn luyện không đủ: huấn luyện với rất ít mẫu là nguyên nhân phổ biến nhất — model không thể học hoặc khái quát hóa từ lượng dữ liệu quá ít. Hãy đảm bảo có đủ ví dụ đa dạng cho mỗi class trước khi tìm hiểu các nguyên nhân khác.

  • Kiểm tra đường dẫn dataset: đường dẫn ảnh không hợp lệ sẽ gây ra lỗi dataset. Các file nhãn riêng lẻ bị thiếu hoặc rỗng được xem là ảnh nền và được báo cáo trong quá trình quét; nếu tập train không có nhãn nào thì sẽ phát sinh lỗi. Hãy xác thực dataset trước khi huấn luyện:

    yolo detect val model=yolo26n.pt data=custom.yaml
  • Giảm ngưỡng confidence: nếu có dự đoán nhưng bị lọc bỏ, hãy thử conf=0.1 trong lúc inference.

  • Xác minh số lượng class: đảm bảo nc trong data.yaml khớp với số class thực tế trong các file nhãn.

mAP trên tập validation chững lại sớm#

  • Bổ sung dữ liệu: fine-tuning được hưởng lợi đáng kể từ dữ liệu huấn luyện bổ sung, đặc biệt là các ví dụ đa dạng về góc độ, ánh sáng và background.
  • Kiểm tra cân bằng class: các class ít được đại diện sẽ có AP thấp. Bổ sung thêm ví dụ hoặc tinh chỉnh cls_pw trên tập validation.
  • Giảm augmentation: với dataset rất nhỏ, augmentation mạnh có thể gây hại nhiều hơn lợi. Hãy thử mosaic=0.5 hoặc mosaic=0.0.
  • Tăng resolution: với dataset có object nhỏ, hãy thử imgsz=1280 để giữ lại chi tiết.

Hiệu năng trên các class ban đầu giảm sau fine-tuning#

Hiện tượng này được gọi là catastrophic forgetting — model mất đi kiến thức đã học trước đó khi chỉ fine-tune trên dữ liệu mới. Phần lớn không thể tránh hiện tượng quên nếu không đưa ảnh từ dataset ban đầu vào cùng dữ liệu mới. Để giảm thiểu hiện tượng này:

  • Gộp dataset: đưa các ví dụ của class ban đầu vào cùng class mới trong quá trình fine-tuning. Đây là cách đáng tin cậy duy nhất để ngăn hiện tượng quên.
  • Đóng băng backbone và neck: đóng băng cả backbone lẫn neck để chỉ huấn luyện detection head sẽ hữu ích với các lượt fine-tuning ngắn có learning rate rất thấp.
  • Huấn luyện ít epoch hơn: model chỉ huấn luyện trên dữ liệu mới càng lâu thì mức độ quên càng tăng.

Câu hỏi thường gặp#

  • Không có mức tối thiểu cố định — kết quả phụ thuộc vào độ phức tạp của tác vụ, số lượng class và mức độ tương đồng của domain với COCO. Ảnh đa dạng hơn (khác nhau về ánh sáng, góc độ, background) quan trọng hơn số lượng đơn thuần. Hãy bắt đầu với dữ liệu hiện có và tăng quy mô nếu các metric validation chưa đạt yêu cầu.

  • Tải tệp .pt pretrained và gọi .train() với đường dẫn đến data.yaml tùy chỉnh. Ultralytics tự động xử lý chuyển trọng số, khởi tạo lại layer phân loại và chọn optimizer. Xem mục Fine-Tuning cơ bản để xem ví dụ code đầy đủ.

  • Các nguyên nhân phổ biến nhất là đường dẫn ảnh không hợp lệ, file nhãn bị thiếu hoặc rỗng, nc trong YAML không khớp với các file nhãn thực tế, hoặc ngưỡng confidence quá cao. Xem Các Lỗi Thường Gặp để tham khảo danh sách kiểm tra khắc phục sự cố đầy đủ.

  • Điều này phụ thuộc vào kích thước dataset và mức độ tương đồng của domain. Với dataset nhỏ có domain tương tự COCO, đóng băng backbone (freeze=10) giúp ngăn overfit. Với domain rất khác COCO, để tất cả layer không bị đóng băng (freeze=None) cho phép backbone thích nghi. Xem Đóng băng Layer để biết các khuyến nghị chi tiết.

  • Đưa các ví dụ của class ban đầu vào dữ liệu huấn luyện cùng với các class mới. Nếu không thể, đóng băng nhiều layer hơn (freeze=10 trở lên) và dùng learning rate thấp hơn sẽ giúp giữ lại kiến thức pretrained. Xem Hiệu năng trên các class ban đầu giảm để biết thêm chi tiết.

Người đóng góp

Bình luận