Link to this sectionCách tinh chỉnh YOLO trên một tập dữ liệu tùy chỉnh#
Tinh chỉnh thích nghi một model đã được huấn luyện trước để 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, tinh chỉnh tận dụng các đặc trư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 gồm việc tinh chỉnh 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 lớp và huấn luyện hai giai đoạn.
Link to this sectionTinh chỉnh so với Huấn luyện từ đầu#
Một model đã được huấn luyện trước đã học được các đặc trư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. Học chuyển tiếp thông qua tinh chỉnh tái sử dụng kiến thức đó và chỉ dạy cho model biết các lớp 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 loại bỏ tất cả những 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.
| Tinh chỉnh (Fine-Tuning) | Huấn luyện từ đầu | |
|---|---|---|
| Trọng số bắt đầu | Được huấn luyện trước trên COCO (80 lớp) | Khởi tạo ngẫu nhiên |
| Câu lệnh | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Hội tụ | Nhanh hơn - backbone đã được huấn luyện | Chậm hơn - tất cả các lớp học từ con số không |
| Yêu cầu dữ liệu | Thấp hơn - các đặc trưng huấn luyện trước bù đắp cho việc thiếu dữ liệu | Cao hơn - model phải học tất cả đặc trưng chỉ từ tập dữ liệu |
| Khi nào nên sử dụng | Các lớp tùy chỉnh với hình ảnh tự nhiên | Các lĩnh vực khác biệt hoàn toàn với COCO (y tế, vệ tinh, radar) |
Khi một file .pt được load bằng YOLO("yolo26n.pt"), các trọng số huấn luyện trước đượ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ỳ lớp nào không khớp (chẳng hạn như head phát hiện khi số lượng lớp khác nhau), và bắt đầu huấn luyện. Không cần load trọng số thủ công, thao tác lớp, hay code học chuyển tiếp tùy chỉnh.
Link to this sectionCách thức hoạt động của việc chuyển đổi trọng số huấn luyện trước#
Khi một model đã được huấn luyện trước được tinh chỉnh trên một tập dữ liệu có số lượng lớp khác nhau (ví dụ: 80 lớp của COCO sang 5 lớp tùy chỉnh), Ultralytics thực hiện chuyển đổi trọng số nhận biết hình dạng:
- Backbone và neck chuyển đổi hoàn toàn - các lớp này trích xuất các đặc trư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 lớp.
- Head phát hiện được khởi tạo lại một phần - các lớp đầu ra phân loại (
cv3,one2one_cv3) có hình dạng gắn liền với số lượng lớp (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 lớp hồi quy bbox (cv2,one2one_cv2) trong head có hình dạng cố định bất kể số lượng lớp, vì vậy chúng chuyển đổi bình thường. - Đa số các trọng số được chuyển đổi khi thay đổi số lượng lớp. Ví dụ: tinh chỉnh YOLO26n từ COCO (80 lớp) sang một tập dữ liệu 5 lớp sẽ chuyển đổi 606 trong số 708 tensor trọng số: chỉ các lớp phân loại phụ thuộc vào số lượng lớp mới được khởi tạo lại, trong khi các nhánh backbone, neck và hồi quy bbox vẫn còn nguyên vẹn.
Đối với các tập dữ liệu có cùng số lượng lớp với model huấn luyện trước (ví dụ: tinh chỉnh các trọng số đã huấn luyện trước trên COCO sang một tập dữ liệu 80 lớp khác), 100% trọng số sẽ chuyển đổi bao gồm cả head phát hiện.
Link to this sectionVí dụ tinh chỉnh cơ bản#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)Link to this sectionChọn kích thước model#
Các model lớn hơn có năng lực tốt 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ơ quá khớp (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à tăng dần quy mô chỉ khi các chỉ số validation chững lại là một cách tiếp cận thiết thực. 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 lớp, tính đa dạng của tập dữ liệu và phần cứng khả dụng để triển khai. Xem trang model YOLO26 đầy đủ để biết các kích thước khả dụng và điểm chuẩn hiệu năng.
Link to this sectionLựa chọn bộ tối ưu hóa (Optimizer) và tốc độ học (Learning Rate)#
Cài đặt mặc định optimizer=auto chọn bộ tối ưu hóa và tốc độ học dựa trên tổng số lần lặp huấn luyện:
- < 10,000 lần lặp (tập dữ liệu nhỏ hoặc ít epoch): AdamW với tốc độ học thấp, được tính toán tự động
- > 10,000 lần lặp (tập dữ liệu lớn): MuSGD (bộ tối ưu hóa kết hợp Muon+SGD) với lr=0.01
Đối với hầu hết các tác vụ tinh chỉnh, 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 bộ tối ưu hóa một cách 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để hội tụ ổn định hơn - Tinh chỉnh một model lớn trên một tập dữ liệu nhỏ: tốc độ học thấp hơn như
lr0=0.001giúp bảo toàn các đặc trưng đã huấn luyện trước
Khi optimizer=auto, các giá trị lr0 và momentum bị bỏ qua. Để kiểm soát tốc độ học theo cách thủ công, hãy đặt bộ tối ưu hóa một cách rõ ràng: optimizer=SGD, lr0=0.005.
Link to this sectionĐóng băng lớp (Freezing Layers)#
Đóng băng ngăn chặn các lớp 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 khi tập dữ liệu nhỏ so với năng lực của model.
Tham số freeze chấp nhận số nguyên hoặc danh sách. Một số nguyên freeze=10 đóng băng 10 lớp đầu tiên (chỉ mục 0-9), bao gồm hầu hết backbone của YOLO26. Backbone kéo dài từ lớp 0-10, vì vậy freeze=10 để lại block C2PSA cuối cùng (lớp 10) có thể huấn luyện; hãy sử dụng freeze=11 để đóng băng toàn bộ backbone. Một danh sách có thể chứa các chỉ mục lớp như freeze=[0, 3, 5] để đóng băng backbone một phần, hoặc cá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 lớp (ở đây là cả hai nhánh hồi quy bbox của head phát hiện).
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 miền mục tiêu và dữ liệu huấn luyện trước, cũng như lượng dữ liệu huấn luyện khả dụng:
| Kịch bản | Khuyến nghị | Lý do |
|---|---|---|
| Tập dữ liệu lớn, miền tương đồng | freeze=None (mặc định) | Đủ dữ liệu để thích nghi tất cả các lớp mà không bị quá khớp |
| Tập dữ liệu nhỏ, miền tương đồng | freeze=10 | Bảo toàn các đặc trưng backbone, giảm các tham số huấn luyện |
| Tập dữ liệu rất nhỏ | freeze=23 | Chỉ head phát hiện được huấn luyện, giảm thiểu rủi ro quá khớp |
| Miền khác xa COCO | freeze=None | Các đặc trưng backbone có thể không chuyển đổi tốt và cần 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ể.
Link to this sectionCác siêu tham số chính cho việc tinh chỉnh#
Việc tinh chỉnh thường yêu cầu í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: Tinh chỉnh hội tụ nhanh hơn so với huấn luyện từ đầu. Bắt đầu với một giá trị vừa phải và sử dụngpatienceđể dừng sớm khi các chỉ số validation chững lại.patience: Giá trị mặc định 100 được thiết kế cho các lần chạy huấn luyện dài. Việc giảm giá trị này xuống 10-20 giúp tránh lãng phí thời gian cho các lần chạy đã hội tụ.warmup_epochs: Warmup mặc định (3 epoch) tăng dần tốc độ học từ 0, giúp ngăn các cập nhật gradient lớn làm hỏng các đặc trưng đã huấn luyện trước trong các lần lặp đầu. Nên giữ cài đặt mặc định ngay cả khi tinh chỉnh.
Để xem 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.
Link to this sectionTinh chỉnh hai giai đoạn#
Tinh chỉnh hai giai đoạn chia quá trình huấn luyện thành hai giai đoạn. Giai đoạn đầu tiên đóng băng backbone và chỉ huấn luyện neck và head, cho phép các lớp phát hiện thích nghi với các lớp mới mà không làm gián đoạn các đặc trưng đã huấn luyện trước. Giai đoạn thứ hai mở đóng băng tất cả các lớp và huấn luyện toàn bộ model với tốc độ học thấp hơn để tinh chỉnh backbone cho miền mục tiêu.
Cách tiếp cận này đặc biệt hữu ích khi miền 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, 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 lúc gây ra sự không ổn định. Để tự động mở đóng băng với cách tiếp cận dựa trên callback, hãy xem Đóng băng và Mở đóng băng Backbone.
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)Link to this sectionCác lỗi thường gặp#
Link to this sectionModel không đưa ra dự đoán nào#
- Dữ liệu huấn luyện không đầy đủ: 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ừ quá ít dữ liệu. Hãy đảm bảo có đủ các ví dụ đa dạng cho mỗi lớp trước khi tìm hiểu các nguyên nhân khác.
- Kiểm tra đường dẫn tập dữ liệu: các đường dẫn không chính xác trong
data.yamlsẽ tạo ra zero nhãn mà không có thông báo. Hãy chạyyolo detect val model=yolo26n.pt data=custom.yamltrước khi huấn luyện để xác nhận nhãn load đúng. - Giảm ngưỡng độ tin cậy: nếu có dự đoán nhưng bị lọc mất, hãy thử
conf=0.1trong quá trình inference. - Xác minh số lượng lớp: đảm bảo
nctrongdata.yamlkhớp với số lượng lớp thực tế trong các file nhãn.
Link to this sectionmAP validation chững lại sớm#
- Thêm dữ liệu: tinh chỉnh 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ới góc độ, ánh sáng và nền khác nhau.
- Kiểm tra sự cân bằng lớp: các lớp không được đại diện đầy đủ sẽ có AP thấp. Sử dụng
cls_pwđể áp dụng trọng số lớp nghịch đảo tần suất (bắt đầu vớicls_pw=0.25cho sự mất cân bằng vừa phải, tăng lên1.0cho 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 mạnh có thể gây hại nhiều hơn là có lợi. Hãy thử
mosaic=0.5hoặcmosaic=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.
Link to this sectionHiệu năng suy giảm trên các lớp gốc sau khi tinh chỉnh#
Đây được gọi là hiện tượng quên thảm họa (catastrophic forgetting) - model mất đi kiến thức đã học trước đó khi chỉ được tinh chỉnh trên dữ liệu mới. Việc quên hầu như không thể tránh khỏi nếu không bao gồm các hình ảnh 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ụ về các lớp gốc cùng với các lớp mới trong quá trình tinh chỉnh. Đây là cách duy nhất đáng tin cậy để ngăn chặn việc quên.
- Đóng băng backbone và neck: đóng băng cả backbone và neck để chỉ head phát hiện huấn luyện sẽ giúp ích cho các lần tinh chỉnh ngắn với tốc độ học rất thấp.
- Huấn luyện ít epoch hơn: model huấn luyện càng lâu trên dữ liệu mới hoàn toàn, sự quên càng tăng lên.
Link to this sectionCâu hỏi thường gặp#
Link to this sectionTôi cần bao nhiêu hình ảnh để tinh chỉnh YOLO?#
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 lớp và mức độ tương đồng của miền với COCO. 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 nếu các chỉ số validation không đạt yêu cầu.
Link to this sectionLàm thế nào để tinh chỉnh YOLO26 trên một tập dữ liệu tùy chỉnh?#
Load một file .pt đã được huấn luyện trước và gọi .train() với đường dẫn đến file data.yaml tùy chỉnh. Ultralytics tự động xử lý chuyển đổi trọng số, khởi tạo lại head phát hiện và chọn bộ tối ưu hóa. Xem phần Ví dụ tinh chỉnh cơ bản để biết code ví dụ đầy đủ.
Link to this sectionTại sao model YOLO đã tinh chỉnh 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 (dẫn đến tạo zero nhãn), sự không khớp giữa nc trong YAML và các file nhãn thực tế, hoặc ngưỡng độ tin cậy 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 đủ.
Link to this sectionTôi nên đóng băng các lớp YOLO nào để tinh chỉnh?#
Điều này phụ thuộc vào kích thước tập dữ liệu và sự tương đồng của miền. Đối với các tập dữ liệu nhỏ với miền tương tự COCO, việc đóng băng backbone (freeze=10) ngăn chặn quá khớp. Đối với các miền khác xa COCO, việc để tất cả các lớp không bị đóng băng (freeze=None) cho phép backbone thích nghi. Xem Đóng băng lớp để biết các khuyến nghị chi tiết.
Link to this sectionLàm thế nào để ngăn chặn hiện tượng quên thảm họa khi tinh chỉnh YOLO trên các lớp mới?#
Bao gồm các ví dụ về các lớp gốc trong dữ liệu huấn luyện cùng với các lớp mới. Nếu điều đó không thể thực hiện, việc đóng băng nhiều lớp hơn (freeze=10 trở lên) và sử dụng tốc độ học thấp hơn giúp bảo toàn kiến thức đã huấn luyện trước. Xem Hiệu năng suy giảm trên các lớp gốc để biết thêm chi tiết.