Skip to main content

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 đã được huấn luyện trước để nhận diện các class mới bằng cách bắt đầu từ các 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 tính năng COCO đã được huấn luyện trước và hội tụ trên dữ liệu tùy chỉnh trong thời gian ngắn hơn nhiều.

Hướng dẫn này bao quát việc 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 layerhuấn luyện hai giai đoạn.

Fine-Tuning so với Huấn luyện từ đầu

Một model được huấn luyện trước đã học được các tính năng hình ảnh tổng quát - phát hiện cạnh, nhận diện kết cấu, hiểu hình dạng - từ hàng triệu hình ảnh. Transfer learning thông qua fine-tuning sẽ tái sử dụng kiến thức đó và chỉ dạy cho model các class mới trông như thế nào, đó là lý do tại sao nó hội tụ nhanh hơn và yêu cầu ít dữ liệu hơn. Huấn luyện từ đầu sẽ loại bỏ tất cả các kiến thức đó và buộc model phải học lại mọi thứ từ các mẫu cấp pixel, điều này đòi hỏi tài nguyên đáng kể hơn nhiều.

Fine-TuningHuấn luyện từ đầu
Trọng số khởi đầuĐã huấn luyện trước trên COCO (80 class)Khởi tạo ngẫu nhiên
Câu 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ả các layer học từ con số 0
Yêu cầu dữ liệuThấp hơn - các tính năng được huấn luyện trước bù đắp cho lượng dữ liệu ít hơnCao hơn - model phải học tất cả tính năng chỉ từ tập dữ liệu
Khi nào nên sử dụngCác class tùy chỉnh với hình ảnh tự nhiênCác domain khác biệt cơ bản so với COCO (y tế, vệ tinh, radar)
Fine-tuning không yêu cầu thêm code

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

Cách thức chuyển đổi trọng số đã huấn luyện trước hoạt động

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

  1. Backbone và neck chuyển đổi hoàn toàn - các layer này trích xuất các tính năng hình ảnh tổng quát và hình dạng của chúng độc lập với số lượng class.
  2. Detection head được khởi tạo lại một phần - các layer đầu ra phân loại (cv3, one2one_cv3) có hình dạng gắn liền với số lượng class (80 so với 5), vì vậy chúng không thể chuyển đổi và được khởi tạo ngẫu nhiên. Các layer hồi quy bbox (cv2, one2one_cv2) trong head có hình dạng cố định bất kể số lượng class, vì vậy chúng chuyển đổi bình thường.
  3. Đại đa số các trọng số được chuyển đổi khi thay đổi số lượng class. Chỉ các layer đặc thù về phân loại trong detection head mới được khởi tạo lại - backbone, neck, và các nhánh hồi quy bbox vẫn giữ nguyên.

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

Ví dụ về Fine-Tuning cơ bản

Ví dụ
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)

Chọn kích thước Model

Các model lớn hơn có dung lượng lớn hơn nhưng cũng có nhiều tham số cần cập nhật hơn, điều này có thể làm tăng nguy cơ overfitting khi dữ liệu huấn luyện bị hạn chế. Bắt đầu với một model nhỏ hơn (YOLO26n hoặc YOLO26s) và mở rộng chỉ khi các chỉ số validation đạt ngưỡng 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ượng class, sự đa dạng của tập dữ liệu và phần cứng khả dụng để triển khai. Xem đầy đủ trang model YOLO26 để biết các kích thước khả dụng và điểm chuẩn hiệu năng.

Lựa chọn Optimizer và Learning Rate

Cài đặt mặc định optimizer=auto 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 (tập dữ liệu nhỏ hoặc ít epoch): AdamW với learning rate thấp, được tự động tính toán
  • > 10.000 vòng lặp (tập dữ liệu lớn): MuSGD (một hybrid optimizer Muon+SGD) với lr=0.01

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

  • Huấn luyện không ổn định (loss tăng đột biến hoặc phân kỳ): thử optimizer=AdamW, lr0=0.001 để có sự hội tụ ổn định hơn
  • Fine-tuning một model lớn trên một tập dữ liệu nhỏ: learning rate thấp hơn như lr0=0.001 giúp bảo toàn các tính năng đã được huấn luyện trước
Auto optimizer ghi đè lên các giá trị lr0 thủ công

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

Đóng băng Layers (Freezing Layers)

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

Phương thức freeze tham số chấp nhận một số nguyên hoặc một danh sách. Một số nguyên freeze=10 đóng băng 10 layer đầu tiên (0 đến 9, tương ứng với backbone trong YOLO26). Một danh sách có thể chứa các chỉ mục layer như freeze=[0, 3, 5] để đóng băng một phần backbone, hoặc các chuỗi tên module như freeze=["23.cv2"] để kiểm soát chi tiết trên các nhánh cụ thể trong một layer.

Ví dụ
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 của domain mục tiêu với dữ liệu đã huấn luyện trước và lượng dữ liệu huấn luyện khả dụng:

Kịch bảnKhuyến nghịLý do
Tập dữ liệu lớn, domain tương tựfreeze=None (mặc định)Đủ dữ liệu để thích nghi tất cả các layer mà không gây overfitting
Tập dữ liệu nhỏ, domain tương tựfreeze=10Bảo toàn các tính năng backbone, giảm số lượng tham số cần huấn luyện
Tập dữ liệu rất nhỏfreeze=23Chỉ huấn luyện detection head, giảm thiểu rủi ro overfitting
Domain khác xa với COCOfreeze=NoneCác tính năng backbone có thể không chuyển đổi tốt và cần được huấn luyện lại

Độ sâu đóng băng cũng có thể được coi là một siêu tham số - thử một vài giá trị (0, 5, 10) và so sánh mAP validation là một cách thực tế để tìm cài đặt tốt nhất cho một tập dữ liệu cụ thể.

Các siêu tham số chính cho Fine-Tuning

Fine-tuning thường đòi hỏi ít điều chỉnh siêu tham số 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 một giá trị vừa phải và sử dụng patience để dừng sớm khi các chỉ số validation đạt ngưỡng.
  • patience: Mặc định 100 được thiết kế cho các đợt huấn luyện dài. Giảm xuống 10-20 để tránh lãng phí thời gian cho các đợt chạy đã hội tụ.
  • warmup_epochs: Warmup mặc định (3 epoch) tăng dần learning rate từ 0, giúp ngăn chặn việc cập nhật gradient lớn làm hỏng các tính năng đã huấn luyện trước trong các vòng lặp đầu. Giữ mặc định là được khuyến nghị ngay cả khi fine-tuning.

Để có danh sách đầy đủ các tham số huấn luyện, hãy xem tài liệu cấu hình huấn luyện.

Fine-Tuning Hai Giai đoạn

Fine-tuning hai giai đoạn chia quá trình huấn luyện thành hai pha. Giai đoạn đầu đóng băng backbone và chỉ huấn luyện neck và head, cho phép các layer phát hiện thích nghi với class mới mà không làm gián đoạn các tính năng đã huấn luyện trước. Giai đoạn hai mở đó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 mục tiêu.

Cách tiếp cận này đặc biệt hữu ích khi domain mục tiêu khác biệt đáng kể so với COCO (hình ảnh y tế, hình ảnh trên không, kính hiển vi), nơi backbone có thể cần thích nghi nhưng việc huấn luyện tất cả cùng một lúc gây ra sự mất ổn định. Để tự động mở đóng băng với cách tiếp cận dựa trên callback, xem Đóng băng và Mở băng Backbone.

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

# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)

# Stage 2: unfreeze all, fine-tune with lower lr
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, lr0=0.001, name="stage2", exist_ok=True)

Các lỗi thường gặp

Model không đưa ra dự đoán

  • Dữ liệu huấn luyện không đủ: huấn luyện với quá ít mẫu là nguyên nhân phổ biến nhất - model không thể học hoặc tổng quát hóa từ quá ít dữ liệu. Hãy đảm bảo có đủ các ví dụ đa dạng cho mỗi class trước khi điều tra các nguyên nhân khác.
  • Kiểm tra đường dẫn tập dữ liệu: đường dẫn không chính xác trong data.yaml sẽ âm thầm tạo ra không có nhãn nào. Hãy chạy yolo detect val model=yolo26n.pt data=your_data.yaml trước khi training để xác nhận các nhãn được load chính xác.
  • Giảm confidence threshold: nếu các dự đoán tồn tại nhưng bị lọc bỏ, hãy thử conf=0.1 trong quá trình inference.
  • Xác minh số lượng class: đảm bảo nc trong data.yaml khớp với số lượng class thực tế trong các tệp nhãn.

Validation mAP bị chững lại sớm

  • Thêm dữ liệu: việc fine-tuning đạt hiệu quả đáng kể với dữ liệu training bổ sung, đặc biệt là các ví dụ đa dạng với góc độ, ánh sáng và nền khác nhau.
  • Kiểm tra sự cân bằng class: các class có ít dữ liệu sẽ có AP thấp. Sử dụng cls_pw để áp dụng trọng số class tần suất nghịch đảo (bắt đầu với cls_pw=0.25 cho sự mất cân bằng vừa phải, tăng lên 1.0 cho sự mất cân bằng nghiêm trọng).
  • Giảm augmentation: đối với các tập dữ liệu rất nhỏ, augmentation nặng có thể gây hại nhiều hơn là giúp ích. Hãy thử mosaic=0.5 hoặc mosaic=0.0.
  • Tăng độ phân giải: đối với các tập dữ liệu có đối tượng nhỏ, hãy thử imgsz=1280 để bảo toàn chi tiết.

Hiệu suất giảm trên các class ban đầu sau khi fine-tuning

Đây được gọi là catastrophic forgetting - model bị mất kiến thức đã học trước đó khi fine-tuning độc quyền trên dữ liệu mới. Việc quên kiến thức hầu như không thể tránh khỏi nếu không bao gồm các hình ảnh của tập dữ liệu gốc cùng với dữ liệu mới. Để giảm thiểu điều này:

  • Hợp nhất các tập dữ liệu: bao gồm các ví dụ của các class gốc cùng với các class mới trong quá trình fine-tuning. Đây là cách đáng tin cậy duy nhất để ngăn chặn việc quên kiến thức.
  • Đóng băng backbone và neck: đóng băng cả backbone và neck để chỉ detection head training sẽ giúp ích cho các lần fine-tuning ngắn với learning rate rất thấp.
  • Train với ít epoch hơn: model càng train lâu trên dữ liệu mới thì tình trạng quên kiến thức càng tăng.

Câu hỏi thường gặp (FAQ)

Tôi cần bao nhiêu hình ảnh để fine-tune YOLO?

Không có con số 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 so với COCO. Các hình ảnh đa dạng hơn (ánh sáng, góc độ, nền khác nhau) quan trọng hơn số lượng thô. Hãy bắt đầu với những gì bạn có và mở rộng quy mô nếu các chỉ số validation không đạt yêu cầu.

Làm thế nào để fine-tune YOLO26 trên một tập dữ liệu tùy chỉnh?

Load một tệp .pt đã được pretrained và gọi .train() với đường dẫn đến data.yaml tùy chỉnh. Ultralytics tự động xử lý weight transfer, khởi tạo lại detection head và chọn optimizer. Xem phần Basic Fine-Tuning để có ví dụ mã hoàn chỉnh.

Tại sao model YOLO đã fine-tune của tôi không phát hiện được gì?

Các nguyên nhân phổ biến nhất là đường dẫn không chính xác trong data.yaml (thứ mà âm thầm tạo ra không có nhãn nào), sự không khớp giữa nc trong tệp YAML và các tệp nhãn thực tế, hoặc confidence threshold quá cao. Xem Các lỗi thường gặp để biết danh sách kiểm tra khắc phục sự cố đầy đủ.

Tôi nên đóng băng các layer nào của YOLO để fine-tune?

Điều đó phụ thuộc vào kích thước tập dữ liệu và độ tương đồng domain. Đối với các tập dữ liệu nhỏ với domain tương tự COCO, việc đóng băng backbone (freeze=10) sẽ ngăn chặn overfitting. Đối với các domain rất khác với COCO, việc để tất cả các layer không bị đóng băng (freeze=None) cho phép backbone thích nghi. Xem Đóng băng Layers (Freezing Layers) để biết các khuyến nghị chi tiết.

Làm thế nào để ngăn chặn catastrophic forgetting khi fine-tune YOLO trên các class mới?

Hãy bao gồm các ví dụ về class gốc trong dữ liệu training cùng với các class mới. Nếu điều đó không khả thi, việc đóng băng nhiều layer hơn (freeze=10 hoặc cao hơn) và sử dụng learning rate thấp hơn sẽ giúp bảo toàn kiến thức đã pretrained. Xem Hiệu suất giảm trên các class ban đầu để biết thêm chi tiết.

Bình luận